我想在我的服务器上配置 iptables,以便只打开特定端口。但是,如果我在服务器上运行 Web 应用程序,我可以访问端口 3000。为什么 3000 是开放的?
以下是该命令的输出iptables -nv -L INPUT
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F
670 302K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
187 136K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
33 1968 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp spt:25 state ESTABLISHED
在我看来,上面的表格表明只有端口 80、443、22 和 25 是开放的,但显然我遗漏了一些东西。
UPD。内容/etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on ...
*filter
:INPUT ACCEPT [11:812]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [7:2120]
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on ...
# Generated by iptables-save v1.4.21 on ...
*mangle
:PREROUTING ACCEPT [6775:1045434]
:INPUT ACCEPT [6183:992008]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3415:5301713]
:POSTROUTING ACCEPT [3415:5301713]
COMMIT
# Completed on ...
# Generated by iptables-save v1.4.21 on ...
*nat
:PREROUTING ACCEPT [671:58811]
:POSTROUTING ACCEPT [3:243]
:OUTPUT ACCEPT [3:243]
COMMIT
# Completed on ...
# Generated by iptables-save v1.4.21 on ...
*raw
:PREROUTING ACCEPT [6775:1045434]
:OUTPUT ACCEPT [3415:5301713]
COMMIT
UPD。感谢@akhfa 和@Iain 的回答!对我来说,两者都有用。似乎拒绝的选项更好一些(例如,鉴于这个比较),因此我将其标记为已接受。
PS 现在我遇到了一个问题,我无法再从我的服务器 ping google,但这可能超出了原始问题的范围。 PPS 没关系,最后我通过在开头添加以下规则解决了互联网访问问题:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
答案1
您没有任何规则来阻止端口 3000。您的策略是接受,因此端口 3000(和其他所有端口一样)是开放的。您可以尝试在规则末尾添加默认丢弃/拒绝,这很常见
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
并且应该完成这项工作,因为任何到达那里的数据包都将被拒绝,并且远程方将认为没有人在监听该部分。
答案2
您可以像这样将 INPUT 中的默认策略更改为 DROP
iptables -P INPUT DROP
然后,您可以删除 INPUT 链中的所有 DROP 规则。如果进行此更改,则必须在要打开的每个端口中添加 ACCEPT 规则。