我正在尝试设置一个 iptables 配置,以便仅当状态为 ESTABLISHED 时才允许来自我的 CentOS 6.2 服务器的出站连接。目前,以下设置对于 sshd 运行良好,但由于我无法弄清楚的原因,所有 Samba 规则都被完全忽略。
iptables Bash 脚本设置所有规则:
# Remove all existing rules
iptables -F
# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Allow incoming SSH
iptables -A INPUT -i eth0 -p tcp --dport 22222 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22222 -m state --state ESTABLISHED -j ACCEPT
# Allow incoming Samba
iptables -A INPUT -i eth0 -s 10.1.1.0/24 -p udp --dport 137:138 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 10.1.1.0/24 -p udp --sport 137:138 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 10.1.1.0/24 -p tcp --dport 139 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 10.1.1.0/24 -p tcp --sport 139 -m state --state ESTABLISHED -j ACCEPT
# Enable these rules
service iptables restart
运行上述脚本后的iptables规则列表:
[root@repoman ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:22222 state NEW,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp spt:22222 state ESTABLISHED
最终,我尝试以与 sshd 相同的方式限制 Samba。此外,我还尝试将连接限制到以下 IP 地址范围: 10.1.1.12 - 10.1.1.19
你们能提供一些建议,甚至可能是完整的解决方案吗?我读过手动 iptables相当广泛,所以我不确定为什么 Samba 规则会被抛弃。
此外,删除-s 10.1.1.0/24旗帜并不能改变规则被忽视的事实。
答案1
问题出service iptables restart
在最后。当您运行命令时iptables
,这些规则会立即生效。iptables
您在那里重新启动的服务使用配置文件在系统启动时加载所有防火墙规则。当您运行它时,它会用存储的配置中的任何内容替换您刚刚制定的所有规则。
根据这您应该做的是使用命令iptables
使防火墙正常工作,然后service iptables save
保存防火墙配置以供下次启动。
答案2
您不明白连接状态的含义。NEW 表示这是连接中的第一个数据包,在 TCP 的情况下是第一个 SYN 数据包。ESTABLISHED 表示数据包属于现有连接,在 TCP 的情况下是第一个 SYN 数据包之后的所有内容。为了使连接进入 ESTABLISHED 状态,第一个数据包需要通过。通过仅允许 ESTABLISHED 连接,您将阻止第一个数据包,因此连接将永远不会建立。
设置 iptables 时通常使用连接跟踪的方法是监管每个连接的第一个数据包(即 NEW 状态),然后允许所有处于 ESTABLISHED 状态的数据包通过。由于只有允许第一个数据包,连接才能进入 ESTABLISHED 状态,因此接受所有处于 ESTABLISHED 状态的数据包是安全的。