Iptables

iptables 規則通過 NAT 轉發 tftp

  • April 12, 2020

我有一個嵌入式 Linux 設備通過乙太網連接到我的 PC。PC 能夠通過 VPN 訪問 tftp 伺服器,我正在嘗試設置 iptables 規則以允許嵌入式設備訪問 tftp 伺服器。

首先,我使用網路管理器在 eno1 設備上建立連接,並將嵌入式設備配置在同一(專用)網路上。我可以成功訪問設備上的 Web 配置頁面。

其次,我在 PC 上添加了 iptables 規則來轉發和 NAT 進出 VPN 的流量,192.168.11.0/24本地乙太網上的私有子網在哪裡,遠端 tftp 伺服器172.16.0.0/16通過以下方式在子網上tun0

-A FORWARD -i eno1 -j ACCEPT
-A FORWARD -o eno1 -j ACCEPT
-A POSTROUTING -s 192.168.11.0/24 -d 172.16.0.0/16 -o tun0 -j MASQUERADE

該設備現在可以通過 VPN 訪問遠端伺服器上的 http,但我找不到將 tftp 流量轉發和 NAT 到同一台伺服器的規則。我已經手動載入了以下核心模組(我不知道這是否必要):

nf_nat_tftp            16384  0
nf_conntrack_tftp      16384  1 nf_nat_tftp

我已經嘗試-A FORWARD ... RELATED,ESTABLISHED -j ACCEPT了我能想到的所有組合(以及網際網路建議的),但沒有任何樂趣。我有限的理解是我需要某種有狀態的轉發規則,但是我可以使用什麼?

自 2016 年的 Linux 4.7 起,預設情況下禁用 conntrack 自動助手分配(在核心消息中對此有多年警告之後):

四年前,我們在 72110dfaa907 中引入了一個新的 sysctl 旋鈕來禁用自動助手分配(“netfilter:nf_ct_helper:禁用自動助手分配”)。此旋鈕預設啟用此行為以保持保守。

引入此措施是為了提供一種通過顯式規則配置 iptables 和連接跟踪幫助程序的安全方法。

雖然很容易恢復到非安全版本,但我寧願使用使用iptables的新方法提供答案(nftables也可以這樣做,但鏈優先級略有不同)。此部落格中記錄了執行此操作的方法:安全使用 iptables 和連接跟踪助手

因此,按照那裡的資訊,這應該在進行 NAT 的路由器上完成:

  • 大警告:

輔助模組必須存在並且能夠在原始表中引用它的規則之前自動載入,否則規則添加將失敗。這甚至可能會阻止iptables-restore防火牆正常工作並使防火牆在啟動時沒有任何規則。

無論如何,模組的 NAT 部分(此處nf_nat_tftp)不會自動載入。所以最好像 OP 一樣在系統啟動時顯式載入這個模組。

  • 假設現在這是預設設置或已完成:
# sysctl -w net.netfilter.nf_conntrack_helper=0
  • 幫助器位置的顯式聲明,這裡的選擇器模仿 OP 的 POSTROUTING 中使用的選擇器(使用 TFTP 伺服器的精確和唯一IP 地址會更好):
iptables -A PREROUTING -t raw -p udp --dport 69 -s 192.168.11.0/24 -d 172.16.0.0/16 -j CT --helper tftp

這個規則現在應該在足夠的時候啟動助手,從而觸發 TFTP 數據和埠的修改,因為 TFTP 是一個複雜的協議,伺服器回复可以從不相關的源埠返回到動態/臨時客戶端源埠,如圖所示在 TFTP 的此Wikipedia 條目中

  • 明確接受通用的已建立流量、到tftp的相關流量和初始 TFTP 查詢:

由於您已經接受來自和去往eno1的任何內容,因此這些規則對您目前的配置沒有用處。如果您選擇收緊防火牆規則,這裡就是。您可以選擇使它們或多或少緊密(添加介面等):

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED -m helper --helper tftp -s 172.16.0.0/16 -d 192.168.11.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.11.0/24 -d 172.16.0.0/16 -p udp --dport 69 -j ACCEPT

第二條規則在回復建立之前授權從伺服器到客戶端的那些特定於 TFTP 的反向連接(因此方向相反)。FORWARD 鏈看到非 NAT 的流量,所以它不必知道 MASQUERADE 期間發生了什麼(雖然 tftp 助手確實干預了那裡)。

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