你好,我有一个在线服务器,我使用它作为网关,但 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