我想使用 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 链中,第 3 行,似乎任何服务器都已打开。
但无法通过浏览器访问网页。
我需要设置什么吗?
作为输出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
答案1
正如我所怀疑的,iptables -L
隐藏了额外的匹配,但iptables-save
揭示了赤裸裸的真相。您的规则 #3 仅匹配lo
— 环回接口。此防火墙仅接受来自外部的 tcp/22 (SSH) 连接。
最简单的解决方法是:
iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT 5 -p tcp --dport 443 -j ACCEPT
您还可以使用 conntrack 进行过滤,并将两个规则合并为一个多端口规则:
iptables -I INPUT 4 -m conntrack --ctstate NEW -p tcp -m multiport --dports 80,443 -j ACCEPT -m comment --comment "HTTP/HTTPS service"
另请注意我添加的注释。使用注释每个规则,如果您的防火墙规则超过 50 条,那么某天您就会感谢我的建议。
不要使用-m state
。这已经过时了。它确实-m conntrack
在幕后使用,像这样明确拼写更为透明。
不要使用iptables -L
。正如您所见,它的输出看起来“更漂亮”,优点到此结束,但它也无法呈现所有需要的细节。 的输出iptables-save
看起来不那么漂亮,但它显示了所有最精细的细节,所以总是使用后者。