我的情况是有一个本地网络,里面有 3 台电脑
- 公司 A(10.1.1.7 和 172.16.1.12 和 192.168.0.4)(实际上公司 A 有 3 个网络接口)
- 组分 B (10.1.1.13)
- 公司 C (172.16.1.5)
公司 A 有两个网络接口,我使用 NAT 连接公司 C,它是位于公司 A 后面的 Tomcat 服务器。此外,NAT 是 172.16.1.5:8080<->10.1.1.7:80
现在,我尝试在 Comp A(10.1.1.7)上使用 iptables:
sudo iptables -A INPUT -s 10.1.1.13 -j DROP; sudo iptables -A INPUT -p tcp --dport 80 -j REJECT;
之后,Comp B(10.1.1.13)无法 ping Comp A(10.1.1.7),但我仍然可以访问 Tomcat 页面。我甚至尝试使用第二条命令(REJECT port 80)来阻止端口 80。
我可以封锁 Comp B (10.1.1.13),这样 Comp B 就无法访问 Tomcat 页面了吗?如果我只封锁端口,我是否可以只不允许访问 Tomcat,但仍然可以 ping 10.1.1.7?谢谢
我的iptables -v -x -n -L:
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 147.8.179.216 0.0.0.0/0
0 0 DROP all -- * * 14.0.154.45 0.0.0.0/0
0 0 DROP all -- * * 10.1.1.13 0.0.0.0/0
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
并且,我的iptables -v -x -n -L -t -nat:
Chain PREROUTING (policy ACCEPT 35032 packets, 1969104 bytes)
pkts bytes target prot opt in out source destination
386 19820 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.16.1.5:8080
Chain INPUT (policy ACCEPT 34737 packets, 1955948 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 312260 packets, 19072061 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 312260 packets, 19072061 bytes)
pkts bytes target prot opt in out source destination
385 19780 SNAT tcp -- * * 0.0.0.0/0 172.16.1.5 tcp dpt:8080 to:172.16.1.12
答案1
由于您要丢弃或拒绝的数据包否则将被转发到计算机 C,因此它们实际上不会到达正常的 INPUT 链。此外,nat 表不用于过滤,因此无法在那里完成过滤。mangle PREROUTING 表在 nat PREROUTING 表之前被遍历,因此过滤规则可以放在那里。
sudo iptables -t mangle -A PREROUTING -i $EXTIF -p tcp -s 10.1.1.13 --dport 80 -j DROP
其中 $EXTIF 是网络接口名称。
上述规则已在我的测试计算机上进行了测试,使用了不同的 IP 地址和接口名称。
使用此图帮助追踪 iptables 数据包流。
答案2
如果不查看其余表格,很难说。您可以iptables
使用标志查看所有表格-L
,并列出它们:
sudo iptables -L
请用此输出更新您的问题,特别是当这个答案没有为您提供解决方案时。
阅读此输出时,您必须从顶部开始,然后向下阅读。在此行之前是否有任何规则会 REJECT、DROP 或 ACCEPT 您的流量?由于您试图阻止访问,因此您很可能在端口 80 上的 REJECT 上方有一个 ACCEPT 行。
iptables
使用命令时,您可以附加规则-A
,或插入规则-I
。这意味着,添加的规则-A
将位于现有规则的底部。这可能会使即时修改变得麻烦,相反,您可以从文件中加载规则列表:
sudo iptables -L # Look at tables, test that they work correctly
sudo iptables-save > /etc/iptables # Save tables to a file
....
sudo iptables-restore < /etc/iptables # Restore tables after a reboot or something
您还可以sudo iptables --flush
重新开始制定一组新的规则来接受所有连接。