Linux

iptables 僅允許通過 VPN 進行 FTP

  • November 15, 2021

我已經定義了這個 iptables 鏈:

iptables -N VPNonly  # create a new chain "VPNonly"
iptables -A VPNonly -i lo -j ACCEPT  # allow localhost
iptables -A VPNonly --src xxx.xxx.xxx.xxx -j ACCEPT  # allow Server IP
iptables -A VPNonly --src 192.168.223.0/24 -j ACCEPT # allow VPN
iptables -A VPNonly --src 10.8.0.0/24 -j ACCEPT      # allow VPN
iptables -A VPNonly --src 10.8.1.0/24 -j ACCEPT      # allow VPN
iptables -A VPNonly -j DROP  # drop everyone else
iptables -I INPUT -m tcp -p tcp --dport 21 -j VPNonly  # use chain VPNonly on port 21

我通過 OPENVPN 連接,伺服器的點對點地址是 192.168.223.1 並獲得相應的 IP,比如說 192.168.223.6

我還有一條規則允許通過 nat 通過 VPN 訪問網路,如下所示:

iptables -t nat -A POSTROUTING -s 192.168.223.0/24 -o venet0 -j MASQUERADE

現在,如果我通過 192.168.223.1 連接到 VPN,則對伺服器的 FTP 訪問工作正常,但不能通過伺服器 IP 或域名工作。

如果我通過以下方式暫時取消對埠 21 的限制:

iptables -D INPUT -m tcp -p tcp --dport 21 -j VPNonly 

通過 VPN 連接時,所有 IP 和域名都適用於 FTP。

**問題:**如何修改我的 iptables 鏈以允許通過 VPN 進行連接(可能使用 nat),其中我的 FTP 客戶端連接到伺服器 IP/域名而不是 VPN 上的伺服器 IP?

**注意:**對外界來說,我的 IP 是伺服器的 ip xxx.xxx.xxx.xxx,然後通過 nat 翻譯。我本來希望伺服器知道它正在與自己對話,並且流量會通過環回介面 127.0.0.1 / localhost 但我不確定,因為我的規則鏈仍然將我鎖定在外面。

**注2:**通過SSH連接伺服器並在shell上使用FTP可以連接到伺服器的ip xxx.xxx.xxx.xxx/域名/127.0.0.1/localhost。只有當我通過 VPN 連接並且由於 nat 規則我的 IP 似乎是伺服器時,我的 iptables 才阻止我連接到埠 21。

長話短說:為了維護 VPN 隧道數據包總是會被發送到伺服器的公共 IP。當嘗試連接到伺服器以獲取其他服務(例如 FTP/SMTP/SSH 數據包)時,仍將採用相同的路由。也就是說,無論我們想要什麼,他們都不會穿過隧道

解決方案:在不提供上述任何服務或通過伺服器的點對點地址連接的第二台機器上設置 VPN 伺服器。(192.168.223.1 在我上面的設置中)

  1. 所有 FTP 伺服器都有兩種模式。被動模式和主動模式。
  2. 當您處於活動模式時,這意味著您的客戶端發起的所有連接都將收到一個高埠範圍

$$ 1024-65535 $$從您的伺服器傳輸數據。 3. 當您處於被動模式時,您必須允許客戶端回答它將能夠連接的埠

$$ 21 $$和數據流,因為客戶端將確定埠範圍$$ xxxx-yyyyyy $$. 因此,考慮到這一點,當您定義埠 21 限制時,所有高埠都將停止為您的客戶端在 VPN 之外選擇的數據流工作,否則您允許埠 21 和您區域網路中其他客戶端執行良好的任何範圍。 4. 在修復到初始連接開始到埠 21 後,您必須在鏈中定義數據流事件的埠範圍。 5. FTP 使用與 Works 相同的兩個連接:連接和數據流。您必須為您的 VPN 伺服器動態創建的正確網路介面定義連接和流。

  1. ip route 命令將為每個介面和 IP 地址範圍(公共或私有)確定路由範例:ip route add 192.168.99.0/24 dev ppp0
  2. sysctl -w net.ipv4.ip_forward=1 將允許您通過這些介面路由和發送數據
  3. 假設您的 VPN 伺服器是基於 Linux 的服務,請檢查 proxyarp 選項

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