The custom message packet sender needs a dest port

Source/Dest ports are required for the nebula firewall on the
receiving side, allow the port to be configured so that it can
be matched to specific rules as required.
This commit is contained in:
Dave Russell 2020-10-02 20:46:08 +10:00
parent ae3ee42469
commit 3cebf38504

View File

@ -189,20 +189,23 @@ func (c *Control) Hook(t NebulaMessageSubType, w func([]byte) error) error {
} }
// Send provides the ability to send arbitrary message packets to peer nodes. // Send provides the ability to send arbitrary message packets to peer nodes.
// The provided payload will be encapsulated in an IPv4 packet from the // The provided payload will be encapsulated in a Nebula Firewall packet
// node IP to the provided destination nebula IP. Any protocol handling // (IPv4 plus ports) from the node IP to the provided destination nebula IP.
// above layer 3 (IP) must be managed by the caller. // Any protocol handling above layer 3 (IP) must be managed by the caller.
func (c *Control) Send(ip uint32, t NebulaMessageSubType, payload []byte) { func (c *Control) Send(ip uint32, port uint16, t NebulaMessageSubType, payload []byte) {
hostinfo := c.f.getOrHandshake(ip) hostinfo := c.f.getOrHandshake(ip)
ci := hostinfo.ConnectionState ci := hostinfo.ConnectionState
length := ipv4.HeaderLen + len(payload) headerLen := ipv4.HeaderLen + minFwPacketLen
length := headerLen + len(payload)
packet := make([]byte, length) packet := make([]byte, length)
packet[0] = 0x45 packet[0] = 0x45 // IPv4 HL=20
packet[9] = 114 // Declare as arbitrary 0-hop protocol
binary.BigEndian.PutUint16(packet[2:4], uint16(length)) binary.BigEndian.PutUint16(packet[2:4], uint16(length))
binary.BigEndian.PutUint32(packet[12:16], ip2int(c.f.inside.CidrNet().IP.To4())) binary.BigEndian.PutUint32(packet[12:16], ip2int(c.f.inside.CidrNet().IP.To4()))
binary.BigEndian.PutUint32(packet[16:20], ip) binary.BigEndian.PutUint32(packet[16:20], ip)
copy(packet[ipv4.HeaderLen:], payload) binary.BigEndian.PutUint16(packet[22:24], port)
copy(packet[headerLen:], payload)
nb := make([]byte, 12) nb := make([]byte, 12)
out := make([]byte, mtu) out := make([]byte, mtu)