根据此规则,我无法使用 wget 到外部地址或通过外部 SMTP 服务器发送电子邮件:
#!/bin/bash
# Flush all current rules from iptables
iptables -F
# Allow SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Set access for localhost
iptables -A INPUT -i lo -j ACCEPT
# Accept packets belonging to established and related connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow incoming web traffic
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Save settings
/sbin/service iptables save
但如果我添加这个,它就可以工作:
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
以下规则是否应该允许由先前请求发起的任何传入连接?
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
编辑:当我运行脚本时出现 2 个错误:
iptables: Unknown error 4294967295
iptables: Unknown error 4294967295
我使用的是 CentOS 5.5 和 iptables 1.3.5。深入研究后,我发现此版本有一个错误:http://bugs.centos.org/view.php?id=3632这可能是问题的原因吗?
编辑2:如果我运行 demsg,我会重复收到相同的消息:
ip_tables: udp match: only valid for protocol 17
编辑3:成功执行 wget 后运行 iptables -L INPUT -v -n 显示:
# iptables -L INPUT -v -n
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
31 2020 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 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
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
4 938 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53
12 11439 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80
编辑4:运行 sh -x 脚本显示:
# sh -x firewall.conf
+ iptables -F
+ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
+ iptables -P INPUT DROP
+ iptables -P FORWARD DROP
+ iptables -P OUTPUT ACCEPT
+ iptables -A INPUT -i lo -j ACCEPT
+ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables: Unknown error 4294967295
+ iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables: Unknown error 4294967295
+ iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables: Unknown error 4294967295
+ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
+ iptables -A INPUT -p tcp --dport 443 -j ACCEPT
+ /sbin/service iptables save
Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
答案1
您在 OUTPUT 链中没有任何规则,并且其默认策略是 DROP,因此当您尝试打开 http 或 smtp 连接时,系统发送的初始 tcp 数据包将被丢弃。您需要添加如下规则以允许 wget 和电子邮件的出站 http 和 smtp:
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT
您可以使用多端口将它们合并为一条规则:
iptables -A OUTPUT -p tcp -m multiport --dports 25,80 -m state --state NEW -j ACCEPT
答案2
你有没有尝试过
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
它可能与“状态”模块/内核扩展丢失/出现问题/玩心理游戏有关(?)。
值得一试。
答案3
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
这仅对跨输入链的数据进行连接跟踪。您的连接尚未建立,您仍在进行三次握手(TCP 三次握手)。因此 conntrack 会拒绝连接,这是理所当然的。
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
应该修复它。
答案4
您应该将 INPUT 和 OUTPUT 之间的规则“配对”
由于传出的 wget 请求使用端口 21,80 和/或 443 TCP OUTPUT,并且需要来自源端口 20,21,80 和/或 443 的“传入 INPUT”的权限,请尝试以下操作:
# rule OUT first :
iptables -A OUTPUT -p tcp -o ethX -d 0/0 -m multiport --dport 21,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
# rule for "coming back" from OUT to INPUT :
iptables -A INPUT -p tcp -i ethX -s 0/0 -m multiport --sport 20,21,80,443 -m state --state ESTABLISHED -j ACCEPT
其中 ethX 是您的外部 eth 接口(eth0 eth1 或其他)
通过外部 SMTP 发送邮件的规则?执行相同操作,只需更改上述每条规则上的 dport 和 sport
我希望这会有所帮助,它对我有用。
顺便说一句,我的 iptables 是 v1.3.5,并且我的默认 INPUT OUTPUT FORWARD 策略设置为 DROP :-)