我有以下网络模式:
- 计算机 A:三个网卡:
- NIC 1(eth0):dhcp,公共互联网
- NIC 2(eth1):静态 192.168.1.1,计算机 B 的网关
- NIC 3(eth2):静态 192.168.2.1,计算机 C 的网关
- 计算机 B:静态 192.168.1.2,使用网关 192.168.1.1(NIC 2)。
- 计算机 C:静态 192.168.2.2,使用网关 192.168.2.1(NIC 3)。
因此我应用这个来使 NAT 工作:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
现在每台计算机都可以连接到互联网。我已经对主计算机(计算机 A)应用了规则,例如断开与某些端口的连接,例如 ssh:
iptables -A INPUT -p tcp --dport 22 -j DROP
但例如现在我想仅有的允许计算机 C 的端口 20、21、22、53 和 80 的连接,如果外部流量与这些端口无关,则忽略它。允许的连接应该是从计算机 C 到外部,而不是从外部到计算机 C(我的意思是 - 计算机 C 没有托管任何 HTTP 或 SSH,但它将使用它们作为客户端)。
我想应该这样做:
iptables -A OUTPUT -i eth2 -o eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -o eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
最后一条规则(删除任何不同于这些流量的其他流量)位于配置的末尾,因此 -A 应该可以正常工作。
问题是...它不起作用。如果我将最后一条规则设置为如下形式:
iptables -A FORWARD -i eth2 -o eth0 -j DROP
它只是放弃一切,例如,端口 21(之前已打开,如您上面所见)也不起作用。
你能告诉我我可能做错了什么吗?我已经被这个问题困扰了一段时间,但无法解决。谢谢!
答案1
您允许 TCP 21 发出新的/已建立的连接,并且允许 TCP 21 传入的已建立连接。但是您丢弃了前向链中的每个流量。
我认为问题出在这里,那么您应该添加转发规则以允许传出和传入流量。