Я использую nf_queue для захвата и манипулирования пакетами в пространстве пользователя, например, сетевой пакет выходит с маршрутом 172.16.16.100: 60000 -> 192.168.22.226:22 Я меняю адрес и порт источника например, 10.0.0.10: 60001 -> 10.0.0.11:22 и сообщить машине с адресом 10.0.0.11 с помощью nats, что необходимо повторно преобразовать пакет в 172.16.16.100: 60000 -> 192.168.22.226:22, и я помещаю эту запись в кеш на первой машине аналогично. Мне возвращается ответ в виде 10.0.0.11: 22-> 10.0.0.10:60001, и я преобразую его в обратный адрес 192.168.22.226: 22 -> 172.16.16.100: 6000 , тем самым восстанавливая пакет из записи кэша. Поскольку клиентов много, я разделяю их по исходному порту, меняю его и восстанавливаю из него заголовок, мой код слишком громкий и не красивый, и я начал переписывать логи c, я написал, как приблизительно определить ключ входящего пакета, подскажите, как определить нужный ключ по порту ответа.
type key struct {
bits uint32
addr [16]byte
}
func CreateKey(src net.IP, port layers.TCPPort) (k key) {
k.bits = uint32(int(port) | ((copy(k.addr[:], src) & 0x10) << 12))
return
}
func (k key) addrLen() int {
shifter := (k.bits & 0x10000) >> 15
return 4 << shifter
}
func (k key) ports()uint32{
return k.bits & 0xffff
}
func (k key) IP()(net.IP){
return net.IP(k.addr[:k.addrLen()])
}
var cache = map[key]session