Linux

使用 nftables 偽裝

  • June 17, 2019

我在 eth0 介面上有帶 2 個上行鏈路(調製解調器 1 和調製解調器 2)和 LAN 的 PC-1:

# ip -c -brief addr
lo               UNKNOWN        127.0.0.1/8
eth0             UP             192.168.0.7/24
modem2           UNKNOWN        10.73.15.79/27
modem1           UNKNOWN        10.176.229.31/26

(調製解調器 1 和調製解調器 2 的“未知”狀態似乎沒問題)。

我設置路由如下:

# ip -c rule
0:      from all lookup local
32764:  from 10.73.15.79 lookup 2
32765:  from 10.176.229.31 lookup 1
32766:  from all lookup main
32767:  from all lookup default

# ip -c route ls table main
default
       nexthop via 10.176.229.32 dev modem1 weight 1
       nexthop via 10.73.15.80 dev modem2 weight 1
10.73.15.64/27 dev modem2 proto kernel scope link src 10.73.15.79
10.176.229.0/26 dev modem1 proto kernel scope link src 10.176.229.31
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.7

# ip -c route ls table 1
default via 10.176.229.32 dev modem1
10.73.15.64/27 dev modem2 scope link
10.176.229.0/26 dev modem1 scope link src 10.176.229.31
127.0.0.0/8 dev lo scope link
192.168.0.0/24 dev eth0 scope link

# ip -c route ls table 2
default via 10.73.15.80 dev modem2
10.73.15.64/27 dev modem2 scope link src 10.73.15.79
10.176.229.0/26 dev modem1 scope link
127.0.0.0/8 dev lo scope link
192.168.0.0/24 dev eth0 scope link

因此,在本地 PC-1 上,我可以訪問網際網路。

我在區域網路內也有 PC-2,想在 PC-1 上設置偽裝,為 PC-2 提供網際網路。

我正在嘗試以下 nftables 配置:

# nft list ruleset
table ip filter {
       chain input {
               type filter hook input priority 0; policy accept;
       }

       chain forward {
               type filter hook forward priority 0; policy accept;
       }

       chain output {
               type filter hook output priority 0; policy accept;
       }
}
table ip nat {
       chain input {
               type nat hook input priority 0; policy accept;
               ip protocol icmp accept
       }

       chain prerouting {
               type nat hook prerouting priority 0; policy accept;
       }

       chain postrouting {
               type nat hook postrouting priority 100; policy accept;
               ip saddr 192.168.0.0/24 oifname "modem*" masquerade
       }

       chain output {
               type nat hook output priority 0; policy accept;
       }
}

但它不起作用。我嘗試了幾個不同版本的配置,但都沒有成功。如何為偽裝設置 nftables?

我還設置:

# sysctl -w net.ipv4.ip_forward="1"
net.ipv4.ip_forward = 1

Linux 核心 4.19.0

編輯:

我已經在另一台 PC 上成功配置了帶有 nftables 的偽裝。我注意到的差異(我不知道它是否有意義):

在 PC-1 上:

# sudo iptables -S
iptables: No chain/target/match by that name.

在另一台電腦上:

# sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

所以,問題 -IPV4_DEVCONF_FORWARDINGeth0界面上未設置。我在 -method 的幫助下設置了libnlrtnl_link_inet_set_conf

編輯:

這是相同的選擇sysctl net.ipv4.conf.eth0.forwarding。感謝@AB

引用自:https://serverfault.com/questions/971429