為 Arch Linux-based Home Router 增加 FullConeNat
0x03c1
April 17th, 2022

最近組了一台 All In One,於是把自家的 BPI-R2 替換成了跑在 Proxmox 的 ArchLinux 作為 pppoe client 的軟路由。
迫於 Linux 沒有自帶 FullCone 方式的 Nat,本文將示範為 ArchLinux 增加 FullCone Nat。

1. 獲得 Source Code

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

# kernel 5.15+ 補丁
curl -o netfilter-full-cone-nat/linux-5.15.patch https://raw.githubusercontent.com/archlinux/svntogit-community/packages/netfilter-fullconenat/trunk/linux-5.15.patch

2. 補丁

# 對於 kernel 5.15+ 需要為原始碼打補丁,不然無法成功編譯 ko。
patch -p1 -i netfilter-full-cone-nat/linux-5.15.patch netfilter-full-cone-nat/xt_FULLCONENAT.c

3. 編譯&安裝

# 讓內核支持
cd netfilter-full-cone-nat
make
# 使用 zstd 壓縮 ko
zstd xt_FULLCONENAT.ko
# 複製內核模塊到內核模塊目錄
cp netfilter-full-cone-nat/xt_FULLCONENAT.ko.zst /usr/lib/modules/$(</usr/src/linux/version)/kernel/net/netfilter
# 生成內核模塊映射
sudo depmod
# 啟用模塊
sudo modprobe xt_FULLCONENAT
echo xt_FULLCONENAT > /etc/modules-load.d/xt_FULLCONENAT.conf

# 讓 iptables 支持
# 把擴展原始碼複製到 iptables 的原始碼擴展目錄
cp netfilter-full-cone-nat/libipt_FULLCONENAT.c iptables/extensions/
# 編譯之
cd iptables
./autogen.sh
./configure --prefix=/usr
make
# 把該擴展複製到 xtables 目錄以使 iptables 得以支持 FullCone nat
sudo cp extensions/libipt_FULLCONENAT.so /usr/lib/xtables

4. 完成

自此 ArchLinux 到 iptables 即支持 FullCone Nat 了。使用如下指令即可使用。

# 把 ppp0 作為出口的情況
sudo iptables -t nat -A POSTROUTING -o ppp0 -j FULLCONENAT
sudo iptables -t nat -A PREROUTING -i ppp0 -j FULLCONENAT

此時在你的內網中找一台安裝了 pystun3 的電腦:

$ pystun3
NAT Type: Full Cone
External IP: x.x.x.x
External Port: 2333

如此一來就完成啦。

Arweave TX
BXS0Kl41iYBlSdb8sqdfPF-yXrPicGvd_8UKHicK-To
Ethereum Address
0x03c1DaEe4D58686b75D13f1c032677a73Cef3F7c
Content Digest
kyPUL9cvY7gYynWO9ip-6rvkFOPPScxx3LQMLdHX1d4