阅读这篇文章,你可能需要了解什么是 Fullcone NAT

摘自网络

1.Full Cone:IP Port不受限
Full Cone仅仅做单纯的地址转换,不正确进出的包做限定。

2.Restricted Cone:IP受限,Port不受限
Restricted Cone NAT会对进出的包稍加限制。从内部送发出的包的目的IP会被记住。
仅仅有这些以前收过包的地址能够发送包进入NAT。其他地址发送的包都会被限制。

3.Restricted Port Cone:IP,Port均受限
Restricted Port Cone NAT相对于Restricted Cone NAT添加了port这层限制。

4.Symmetric NAT:Port,IP均受限,且对每一个外部主机或port的会话都会映射为不同的port(洞)
Symmetric NAT是4种中最为严谨的。前3种做地址转换时,不管包送往何处,NAT内部同一个内部地址都相应到同一个外部地址。而Symmetric NAT则每个内部地址相应到不同的外部地址。Symmetric NAT仅仅同意先由私有网络内的使用者发送包到的外部地址能够回传封包。

简单来说,如果你有需求让每个设备都能和公网上的设备进行游戏联机,那Fullcone NAT/ NAT 1你是必须要的。

目前基本上所有路由器都支持Fullcone NAT了,但是服务器基本上内核都不会启用Fullcone NAT这个东西。我之前用wireguard组网的时候,发现没办法和朋友联机,因此研究了如何让Linux服务器支持Fullcone NAT。

我们可以使用 Chion82 写的一个模块,让Linux服务器支持Fullcone NAT。

以下教程基于 CentOS 7.7 64bit,使用的源代码是 https://github.com/Chion82/netfilter-full-cone-nat

我们先安装一下基本的依赖,请注意你的服务器的内核需要安装完整的kernel,tools,devel,headers

yum install gcc gcc-c++ autoconf autogen libmnl libmnl-devel libtool-devel libtool -y

获取所需要的源代码

git clone git://git.netfilter.org/libnftnl.git
git clone git://git.netfilter.org/iptables.git
git clone https://github.com/Chion82/netfilter-full-cone-nat.git

编译 libnftnl 并安装

cd libnftnl
sh autogen.sh
./configure
make
make install

编译 netfilter-full-cone-nat模块

cd ~/netfilter-full-cone-nat
make
modprobe nf_nat
insmod xt_FULLCONENAT.ko

编译iptables 1.8.4

cp ~/netfilter-full-cone-nat/libipt_FULLCONENAT.c ~/iptables/extensions/
ln -sfv /usr/sbin/xtables-multi /usr/bin/iptables-xml
./autogen.sh
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
./configure
make
make install

更新 iptables

#先关闭iptables
systemctl  stop iptables
#删除原来的iptables
rm -rf /sbin/iptables
rm -rf /sbin/iptables-restore
rm -rf /sbin/iptables-save
#复制你自己编译的iptables
cd /usr/local/sbin
cp /usr/local/sbin/iptables /sbin/     
cp /usr/local/sbin/iptables-restore /sbin/
cp /usr/local/sbin/iptables-save /sbin/
#检验iptables版本
iptables -V

设置开机自动加载Fullcone模块

kernel=`uname -r`
cp ~/netfilter-full-cone-nat/xt_FULLCONENAT.ko  /lib/modules/$kernel/
depmod
echo "modprobe xt_FULLCONENAT" > /etc/sysconfig/modules/xt_FULLCONENAT.modules
chmod 755 /etc/sysconfig/modules/xt_FULLCONENAT.modules
reboot
lsmod | grep xt_FULLCONENAT(有项目)

iptables 设置 fullcone 规则

iptables -t nat -A POSTROUTING -o eth0 -j FULLCONENAT #same as MASQUERADE  
iptables -t nat -A PREROUTING -i eth0 -j FULLCONENAT  #automatically restore NAT for inbound packets
service iptables save