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 将所有 web 服务路由到更大的个人服务器

一切都按预期进行,只是我无法阻止来自某些 IP 的传入连接,这些 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 导致的。因此,过滤器/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
    

相关内容