我使用nf_queue捕获和处理用户空间中的数据包,例如,网络数据包退出,路由为172.16.16.100:60000-> 192.168.22.226:22,我更改了地址和源端口,例如10.0.0.10:60001-> 10.0.0.11:22并使用nat告知地址为10.0.0.11的计算机,有必要在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,从而从缓存中还原数据包条目。由于有很多客户端,我按源端口将它们分开,然后更改它并从中恢复标头,我的代码太大声且不美观,我开始重写逻辑,我写了如何大致确定密钥传入的数据包,告诉我如何通过响应端口确定必要的密钥。
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