我想使用 iptables 设置防火墙。
服务器在运行httpd服务(httpd) 操作系统是Centos7,下面的信息是安装iptables-services后,不做任何修改就启动iptables。
[root@iptables ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
如您所见,在 INPUT 链第 num3 行中,似乎服务器已打开。
但是无法通过浏览器访问网页。
有什么我必须设置的吗?
作为iptables-save
(取自评论)的输出:
# Generated by iptables-save v1.4.21 on Thu Sep 16 13:41:53 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [527:50260]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Thu Sep 16 13:41:53 2021
正如我所怀疑的那样,
iptables -L
隐藏了额外的匹配,但iptables-save
显示了赤裸裸的真相。您的规则 #3 仅匹配lo
- 环回接口。此防火墙仅接受来自外部的 tcp/22 (SSH) 连接。最简单的解决方案是:
您还可以使用 conntrack 进行过滤,并将两个规则组合成一个带多端口的规则:
还要注意我添加的评论。为每条规则使用注释,如果您的防火墙发展到超过 50 条规则,您会感谢我的建议。
不要使用
-m state
. 这是过时的。它确实-m conntrack
在引擎盖下使用,并且像这样明确地拼写更加透明。不要使用
iptables -L
. 如您所见,它的输出看起来“更漂亮”,优势到此为止,但它也未能呈现所有需要的细节。的输出iptables-save
看起来不太漂亮,但它显示了所有最好的细节,所以总是使用后者。