在 Centos 6.4 上,我想阻止除 22、80 和 443 之外的所有传入端口。80(外部)应重定向到 8080(内部)。443(外部)应重定向到 8181(内部)。我使用了以下命令:
service iptables stop
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8181
service iptables save
service iptables restart
但是,我仍然可以访问端口 8080 和 8181。有没有办法从外部阻止端口 8080 和 8181,同时仍在内部开放端口以便从 80 和 443 进行重定向?
答案1
您的规则中没有任何内容会丢弃任何数据包。您可以通过将INPUT
链的默认策略设置为来实现这一点DROP
。默认情况下,它是ACCEPT
:
iptables -P INPUT DROP
当你这样做时,你可能会开始注意到你的传出连接不再起作用。
您可以在链顶部添加规则,INPUT
以便ACCEPT
重新引入已经建立的流量。
使用以下命令进行操作:
iptables -A INPUT -m state --state ESTABLISHED,RELATED
该RELATED
部分允许其他相关流量通过(例如,由于连接中发生某些事情而发送的 ICMP 数据包ESTABLISHED
)
答案2
我最好创建一个新的链,然后将我的规则添加到这个链中。你可以这样做:首先删除传入/转发/传出流量
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
然后创建一个带有判断ACCEPT的链,并在里面添加规则:
iptables -N myrules # Create a new chain
iptables -A myrules -m state --state ESTABLISHED,RELATED
iptables -A myrules -j LOG --log-prefix="Myrules: " # Just a log prefix
iptables -A myrules -j ACCEPT # Packets matching this rule will be ACCEPTed
iptables -A INPUT -i eth0 -p tcp --dport 22 -j myrules
然后,添加重定向规则:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8181
答案3
服务器上是否有多个 NIC?您可以通过这种方式锁定它。您还可以通过源 IP 轻松锁定它,这样您就可以只允许来自特定 IP 的那些端口的“INPUT”规则,以及来自其他 IP 的所有“FORWARD”或“PREROUTING”规则。