Ubuntu 2004打Patch实现FullCone Nat

参考:Centos 7当网关启用Fullcone nat

第一步,安装kernel header,对于Ubuntu来说就是linux-headers-generic。如果内核不是linux-generic,根据uname -ar的内容确定自己要安装哪个header。

第二步,安装一些必备工具,包括但不限于autoconf、libmnl-devel、libtool。如果报错PKG_CHECK_MODULES syntax error,还要装pkgconf。

第三步,编译libnftnl。别以为官方库里面有libntfnl-dev就能用,一样炸,就是报PKG_CHECK_MODULES syntax error。

cd /usr/src
git clone git://git.netfilter.org/libnftnl.git
cd libnftnl
./autogen.sh
./configure
make
make install

第四步,编译netfilter-full-cone-nat模块,得到xt_FULLCONENAT.ko。

cd /usr/src
git clone https://github.com/Chion82/netfilter-full-cone-nat.git
cd netfilter-full-cone-nat
make

可以选择此时载入模块,但是要先手动加载nf_nat:

modprobe nf_nat
insmod xt_FULLCONENAT.ko

第五步,编译支持FULLCONE的iptables:

cd /usr/src
git clone  git://git.netfilter.org/iptables.git
cd iptables
cp ../netfilter-full-cone-nat/libipt_FULLCONENAT.c extensions
./autogen.sh
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
./configure --prefix=/usr
make

这里将prefix写到/usr,是准备完全替换系统的iptables。所以别急着install,先把系统的iptables给卸了。

sudo apt remove iptables

注意,在Ubuntu上这会卸掉ubuntu-standard,导致autoremove不再可靠,小心别乱用apt autoremove。之后就可以make install安装了。

第六步,补上基本的iptables规则:

iptables -P INPUT   DROP
iptables -P OUTPUT  ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
for i in {80,443};do
iptables -A INPUT -p tcp --dport $i -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport $i -m conntrack --ctstate ESTABLISHED -j ACCEPT
done

iptables -A INPUT  --match state --state ESTABLISHED,RELATED --jump ACCEPT
iptables -A OUTPUT --match state --state ESTABLISHED,RELATED --jump ACCEPT

iptables -A INPUT  --proto udp --sport 53 --jump ACCEPT

在for循环那一行里,可以把其他比如ssh端口添加到括号里,用逗号分隔开,就可以开放这些端口了。搞定之后,首先新建文件夹/etc/iptables,然后保存到文件:

mkdir -p /etc/iptables
iptables-store > /etc/iptables/rules.v4

第七步,编写一个systemd服务文件,让规则可以在开机时自动载入。根据archlinux的iptables.service,新建一个文件/etc/systemd/system/iptables.service,内容如下:

[Unit]
Description=Packet Filtering Framework
After=network.service
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
ExecReload=/sbin/iptables-restore /etc/iptables/rules.v4
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

然后启用它:systemctl enable iptables.service

可以检查一下是否成功:systemctl status iptables.service

注意,不需要使用命令行restore时的”<“,直接指定规则文件名字,iptables-restore就会载入它。

第八步,开机自动载入FULLCONNAT模块。首先更改/etc/modules文件,添加一行xt_FULLCONNAT:

echo 'xt_FULLCONENAT' >> /etc/modules

将ko文件复制到内核模块文件目录/lib/modules/`uname -r`/kernel/drivers,比如放在net目录下,然后运行depmod分析模块依赖(一般不会有输出内容):

cp /usr/src/netfilter-full-cone-nat/xt_FULLCONENAT.ko /lib/modules/`uname -r`/kernel/drivers/net
depmod

随后就可以reboot一下,启动之后通过lsmod | grep ‘xt_FULLCONENAT’来确定是否加载了模块。

第九步,添加FULLCON规则,假设对外网卡是eth0:

iptables -t nat -A POSTROUTING -o eth0 -j FULLCONENAT
iptables -t nat -A PREROUTING -i eth0 -j FULLCONENAT

如果需要开机应用这条规则,那就仿照上边iptables-store一下。

留下评论