举例说明:
假定你的eMule主机在局域网内的地址是10.1.1.10,通过NAT映射到互联网的2.2.2.2地址。eMule使用的UDP端口初始设置为4672。
当eMule试图连接IP地址为3.3.3.3的Kad节点时,NAT将内网IP 10.1.1.10转译为2.2.2.2,将内网端口4672转译为外网端口(例如65000之类)。只要NAT还记录着这条转译规则,那么3.3.3.3这个节点就能够通过65000端口反向联系到你。但是,其它Kad节点有可能通过3.3.3.3获得你的信息,此时这些节点会认为你的UDP端口是65000,而不是4672。毫无疑问,这些节点都无法通过Kad连接到你的骡子,因为转译规则仅对3.3.3.3这个IP有效。
解决办法是让NAT在向外的Kad“会话”时保持初始端口不变(通常是4672),也就是针对向外的UDP报文创建NAT规则条目。
我在*BSD中用PF实现此要求。配置语句如下所示:
nat on $extif proto udp from 10.1.1.10 port 4672 -> $realip port 4672
nat on $extif from 10.1.1.0/24 to any -> $realip
rdr pass on $extif proto tcp from any to $realip port 4662 -> 10.1.1.10 port 4662
rdr pass on $extif proto udp from any to $realip port 4672 -> 10.1.1.10 port 4672
第1行确保eMule的Kad端口在外网仍然是4672,第2行进行普通的NAT转发,第3行和第4行分别设置向内的Ed2k连接数据包以及Kad数据包的端口转发规则。
当然,你需要根据实际使用的路由器/NAT设备查阅相关手册,按照手册进行适当的配置。