# 為 Arch Linux-based Home Router 增加 FullConeNat

By [jet tsang zeon-git](https://paragraph.com/@jettsang) · 2022-04-17

---

> 最近組了一台 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
    

如此一來就完成啦。

---

*Originally published on [jet tsang zeon-git](https://paragraph.com/@jettsang/arch-linux-based-home-router-fullconenat)*
