Debian

NFTables - 如何設置簡單的 ip 和埠轉發?

  • April 17, 2021

我正在嘗試使用帶有 NFTables 的 Raspberry Pi 4 設置埠轉發代理。我想複製廉價家用 nat 路由器的簡單埠轉發功能。這是我正在開發的一個更大的遠端管理應用程序的一個組件。

我可以讓它使用redirect. 但我無法讓它轉發主機之外的任何內容。

我啟用了路由。但我也希望它在區域網路內工作。我不認為這是一個因素。

看著journalctl,似乎我的規則被觸發了。但是瀏覽器永遠不會打開頁面。

  • 埠 80 正在重定向到在 8088 上本地執行的 Web 應用程序,這有效
  • 埠 81 應該轉發到列印機上的管理螢幕
  • 埠 82 正在嘗試轉發到外部網站
$ curl -i http://192.168.10.32:81
^C (no response)
$

日誌和配置如下。

更新:我沒有提到該設備最初也在執行 WireGuard。為了簡化,我禁用了 WireGuard 並重新列出了配置和日誌。所以它現在是一個非常普通的配置。

# nft list ruleset
table inet filter {
   chain input {
       type filter hook input priority 0; policy drop;
       ct state established,related accept
       ct state invalid drop
       iifname "lo" accept
       ip protocol icmp accept
       tcp dport { ssh, 22222 } ct state new log prefix "[nftables] New SSH Accepted: " accept
       tcp dport { http, https, 81, 82, omniorb } accept
       pkttype { host, broadcast, multicast } drop
       log prefix "[nftables] Input Denied: " flags all counter packets 0 bytes 0 drop
   }

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

   chain output {
       type filter hook output priority 0; policy accept;
   }
}
table ip nat {
   chain postrouting {
       type nat hook postrouting priority 100; policy accept;
       masquerade
   }

   chain prerouting {
       type nat hook prerouting priority -100; policy accept;
       tcp dport http log prefix "redirect to 8088 " redirect to :omniorb
       tcp dport 81 log prefix "pre redirect to printer " level debug dnat to 192.168.10.10:http
       tcp dport 82 log prefix "redirect to web " dnat to 104.21.192.38:http
   }
}
  • 將 80 重定向到 8088 作品
  • 轉發到列印機和網路不起作用
Apr 17 13:59:48 douglas kernel: redirect to 8088 IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=20702 DF PROTO=TCP SPT=44984 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0 
Apr 17 14:00:50 douglas kernel: pre redirect to printer IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=2569 DF PROTO=TCP SPT=34024 DPT=81 WINDOW=64240 RES=0x00 SYN URGP=0 
Apr 17 14:00:51 douglas kernel: pre redirect to printer IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=2570 DF PROTO=TCP SPT=34024 DPT=81 WINDOW=64240 RES=0x00 SYN URGP=0 
Apr 17 14:00:53 douglas kernel: pre redirect to printer IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=2571 DF PROTO=TCP SPT=34024 DPT=81 WINDOW=64240 RES=0x00 SYN URGP=0 
Apr 17 14:00:59 douglas kernel: redirect to web IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=36328 DF PROTO=TCP SPT=44326 DPT=82 WINDOW=64240 RES=0x00 SYN URGP=0 
Apr 17 14:01:00 douglas kernel: redirect to web IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=36329 DF PROTO=TCP SPT=44326 DPT=82 WINDOW=64240 RES=0x00 SYN URGP=0 
Apr 17 14:01:02 douglas kernel: redirect to web IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=36330 DF PROTO=TCP SPT=44326 DPT=82 WINDOW=64240 RES=0x00 SYN URGP=0 
Apr 17 14:01:06 douglas kernel: redirect to web IN=eth0 OUT= MAC=dc:a6:32:ab:9c:76:f4:6d:04:63:aa:7d:08:00 SRC=192.168.10.20 DST=192.168.10.32 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=36331 DF PROTO=TCP SPT=44326 DPT=82 WINDOW=64240 RES=0x00 SYN URGP=0 
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
   link/ether dc:a6:32:ab:9c:76 brd ff:ff:ff:ff:ff:ff
   inet 192.168.10.32/24 brd 192.168.10.255 scope global dynamic noprefixroute eth0
      valid_lft 603659sec preferred_lft 528059sec
   inet6 fe80::2cd9:f195:bfe6:38e8/64 scope link 
      valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
   link/ether dc:a6:32:ab:9c:77 brd ff:ff:ff:ff:ff:ff
# ip route
default via 192.168.10.1 dev eth0 proto dhcp src 192.168.10.32 metric 202 
192.168.10.0/24 dev eth0 proto dhcp scope link src 192.168.10.32 metric 202
#  sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

您目前的設置不能僅僅因為轉發被禁用,儘管:

#  sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

由於類型過濾器鉤子轉發鏈設置為policy drop

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

如果您想限制轉發,以防某些系統錯誤地將 RPi4 設置為其網關,而不僅僅是轉發所有內容(通過將上述策略從dropto更改為accept或完全刪除轉發鏈),您可以選擇僅轉發經過dna翻譯:

nft add rule inet filter forward ct status dnat accept

這足以滿足流的所有數據包,因為此資訊儲存在創建的唯一 conntrack 查找條目中(並用於兩個方向和每個數據包)。

引用自:https://unix.stackexchange.com/questions/645561