Iptables 無法阻止來自特定 ip 的入站

Iptables 無法阻止來自特定 ip 的入站

你好,我有一個線上伺服器,我使用它,例如網關,而 iptables 表現得很奇怪

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -m state --state NEW -j ACCEPT

但 173.230.154.149 仍然可以在 80 或 443 中存取 apache 伺服器,它不應該被阻止

-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited

是的,它是一個線上伺服器,透過 VPN 和 openvpn 將所有 Web 服務路由到個人更大的伺服器

一切都按預期工作,只是我無法阻止來自某些 ip 的傳入連接,女巫顯然正在攻擊伺服器

網路的類型是

外部 IP XX.XX.X.XX VPN 10.0.0.0/24

-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.100
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.100

答案1

正在路由而不是由本地進程接收的封包會遍歷過濾器/FORWARD 鏈,而不是過濾器/INPUT 鏈,即使這是由使用 NAT 引起的。所以目前filter/INPUT中的阻止規則不起作用。這些規則:

-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

應該簡單地替換為:

-A FORWARD -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A FORWARD -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

顯然,它們應該添加在允許存取 Web 伺服器的規則之前,以便它們可以發揮作用。因此,至少在這些之前添加它們:

-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT

因為一旦初始連線被接受,所有進一步的資料包將被此規則短路:

-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

所以第一時間看到他們就必須被阻止。


附加說明:

  • 冗餘規則

    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -i tun+ -j ACCEPT
    -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    

    上面的第一條規則,還有第二條規則,每條規則都是單獨的,使得第三條規則變得多餘。

    同樣地:

    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    

    第一條規則使以下兩條規則變得多餘。

    但這一切可能都是為了測試當前的問題。

  • 除非執行最新的核心(問題已修復),否則任何 REJECT 規則都不允許拒絕處於 INVALID 狀態的封包。此類資料包應該「僅」被丟棄,否則可能會發生合法流量的罕見隨機連線失敗。

    這現在記錄在iptables-extensions(8):

    警告:您不應不加區別地將 REJECT 目標套用於連線狀態分類為 INVALID 的封包;相反,你應該只刪除這些。

    (手冊頁隨後提供了進一步的理由。)

    所以通常情況下,

    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    後面應該是:

    -A FORWARD -m conntrack --ctstate INVALID -j DROP
    

相關內容