透過 nftables 防火牆的靜態路由

透過 nftables 防火牆的靜態路由

我有一個帶有 2 個 NIC 的網關“X”

enp0s3 (192.168.0.100) 連接到 192.168.0.0/24(假設這是一個 WAN 網路)

enp0s8 (172.16.0.1) 連接到 172.16.0.0/24(大概是 LAN 網路)

我使用 nftables 創建了一個 NAT 連接,以允許 LAN (172.16.0.0/24) 中的主機透過網關「X」瀏覽互聯網。

/etc/nftables/nftables_firewall

flush 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
    iifname enp0s8 accept
    ip protocol icmp accept
    reject
  }

  chain forward {
    type filter hook forward priority 0;
    oifname enp0s3 accept
    iifname enp0s3 ct state related, established accept
    iifname enp0s3 drop
  }

  chain output {
    type filter hook output priority 0;
  }

}

/etc/nftables/nftables_nat

flush ruleset
table ip nat {
  chain prerouting {
    type nat hook prerouting priority 0;
  }

  chain postrouting {
    type nat hook postrouting priority 0;
    oifname enp0s3 masquerade
  }
}

現在,我需要一台主機(192.168.0.101),它是來自 WAN(192.168.0.0/24 網路)的筆記型電腦,透過網關「X」存取 LAN(172.16.0.0/24 網路)中的主機。即我需要設定從WAN中的該主機(192.168.0.101)到LAN(172.16.0.0/24網路)的靜態路由。

這是我嘗試透過其 wlo1 介面在 192.168.0.0/24 網路上的筆記型電腦上新增的靜態路由

ip route add 172.16.0.0/24 via 192.168.0.100 dev wlo1

網關防火牆中的規則會阻止這些封包進入 172.16.0.0/24 網路。

如何在我的網關上允許此操作?

我知道防火牆規則正在丟棄資料包,因為

測試用

ping 172.16.0.2 

運行時來自 192.168.0.101

tcpdump -lnni any src 192.168.0.101

來自網關“X”的回复

11:41:53.240815 IP 192.168.0.101 > 172.16.0.2: ICMP echo request, id 8, seq 1, length 64
11:41:54.243947 IP 192.168.0.101 > 172.16.0.2: ICMP echo request, id 8, seq 2, length 64
11:41:58.247687 ARP, Request who-has 192.168.0.100 tell 192.168.0.101, length 46

答案1

你的規則集有一個缺陷:

flush ruleset

如果兩者按順序執行,因為flush ruleset只剩下最後一個。

每個flush ruleset應該分別改為:

table inet filter
delete table inet filter

和:

table ip nat
delete table ip nat

每次都獲得冪等表定義,該定義在第一次使用時不會失敗,也不會重複自身,也不會影響其他桌子。


現在關於這個問題,就像插入一個轉送規則以在正確的位置允許這樣做一樣簡單:在刪除規則之前,因此:

# nft insert rule inet filter forward index 2 ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept

要不然:

# nft add rule inet filter forward index 1 ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept

去測試,

或直接透過在正確的位置編輯規則集來保留它:

...
iifname enp0s3 ct state related, established accept
ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept
iifname enp0s3 drop
...

為了額外的安全性,可以選擇新增該規則iifname enp0s3(=> )。iifname enp0s3 ip saddr 192.168.0.101 ip daddr 172.16.0.0/24 accept

返回流量已由有狀態規則 ( ... ct state related, established ...) 處理。

相關內容