我的服务器上有 nginx,我运行以下脚本向 iptables 添加规则:
#!/bin/bash
ip=/sbin/iptables
services='22 25 53 80 443 5432 8000 8080'
$ip -F;
$ip -t nat -F;
echo -e "Opening port 22 for ssh";
$ip -A INPUT -p tcp --dport 22 -j ACCEPT;
$ip -A OUTPUT -p tcp --sport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT;
$ip -P INPUT DROP;
$ip -P OUTPUT ACCEPT;
$ip -P FORWARD DROP;
echo -e "Accept lo";
$ip -A INPUT -i lo -j ACCEPT;
$ip -A OUTPUT -o lo -j ACCEPT;
$ip -A INPUT -i docker0 -j ACCEPT;
$ip -A OUTPUT -o docker0 -j ACCEPT;
# ethernet
#echo -e "Accept eth0";
#$ip -A INPUT -i eth0 -j ACCEPT;
#$ip -A OUTPUT -o eth0 -j ACCEPT;
for service in $services; do
echo -e "Open port $service";
$ip -A INPUT -p tcp -m tcp --sport $service -j ACCEPT;
done
$ip -A INPUT -p udp -m udp --sport 53 -j ACCEPT;
$ip -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT;
$ip -A INPUT -p udp -m udp --dport 51914 -j ACCEPT;
我打开了必要的端口,但是当我尝试使用 wget 访问我的网站时出现以下错误:
--2016-01-20 14:28:33-- <ip>
Connecting to <ip>|:80... failed: Connection timed out.
Retrying.
好吧,我的防火墙脚本有什么问题?
编辑:的输出iptables -L INPUT -vn
是
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
218 18351 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
29 4456 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 * 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 spt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:25
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:53
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:443
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:5432
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:8000
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:8080
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:51914
答案1
您的INPUT
规则允许以下流量来源端口 80 - 但进入 Web 服务器的流量用于目的地端口 80。本质上,你只允许INPUT
流量从其他网络服务器。将规则更改--sport
为,一切都会变得更好。--dport
顺便说一句,这一观点几乎适用于所有其他规则。