Как создать алгоритм определения ключа на карте по значению? - PullRequest
0 голосов
/ 09 апреля 2020

Я использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...