CentOS 5.5 和 iptables 1.3.5 中的 wget 被 iptables 阻止

CentOS 5.5 和 iptables 1.3.5 中的 wget 被 iptables 阻止

根据此规则,我无法使用 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 :-)

相关内容