![iptables 配置在一台 Centos 6 服务器中有效,但在另一台服务器中无效](https://linux22.com/image/606994/iptables%20%E9%85%8D%E7%BD%AE%E5%9C%A8%E4%B8%80%E5%8F%B0%20Centos%206%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%AD%E6%9C%89%E6%95%88%EF%BC%8C%E4%BD%86%E5%9C%A8%E5%8F%A6%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%AD%E6%97%A0%E6%95%88.png)
这个 iptables 脚本:
#!/bin/sh
service iptables stop
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
service iptables save
service iptables restart
在 Centos 6.3 服务器(由 VPSBlocks.com.au 提供)上按预期工作,但在 Centos 6.0 服务器(由 VPSNine.com 提供)上则不行。“按预期工作”是指它至少允许对端口 22、80 和 443 的传入访问。而“不工作”是指它不允许访问。
有效的版本具有以下 /etc/sysconfig/iptables:
# Generated by iptables-save v1.4.7 on Wed Feb 27 19:10:38 2013
*filter
:INPUT DROP [3:453]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:52]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Wed Feb 27 19:10:38 2013
而不起作用的那个有以下/etc/sysconfig/iptables:
# Generated by iptables-save v1.4.7 on Wed Feb 27 11:28:36 2013
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Wed Feb 27 11:28:36 2013
# Generated by iptables-save v1.4.7 on Wed Feb 27 11:28:36 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Wed Feb 27 11:28:36 2013
# Generated by iptables-save v1.4.7 on Wed Feb 27 11:28:36 2013
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Wed Feb 27 11:28:36 2013
如果我将不起作用的 /etc/sysconfig/iptables 替换为另一台服务器上起作用的 /etc/sysconfig/iptables,它允许我保留当前的 ssh 连接,但是当我尝试重新进入时,我被锁定了。
为什么完全相同的 iptables 配置在一台服务器上有效,而在另一台服务器上无效? Centos 的小版本(6.3 与 6.0)之间的差异是否能解释不同的行为?
更新: Centos 6.3 服务器(iptables 配置可在其上运行)使用 iptables 1.4.7-5.1.el6_2。另一台服务器使用 iptables 1.4.7-3.el6。
更新:
iptables --list
在两个服务器上都返回以下内容:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere multiport dports ssh,http,https state NEW,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
更新: 当我登录到 6.0 服务器时,看到以下警告:
Warning: Unknown iptable module: nf_conntrack_ipv4, skipped
我不确定如何安装它。它是内核模块吗?如果是,那看来我被坑了。
答案1
iptables multiport 是一个模块,检查它是否安装在目标 CentOS 系统上。
答案2
flush
在您的脚本中,除了(-F)之外,您可能还需要所有表filter
(默认为过滤表)。
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/etc/sysconfig/iptables
然后使用环回接口的接受规则正上方的以下行接受与已建立会话的连接。
-A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
您可能还需要使用以下方法手动加载nf_conntrack_ipv4
模块 -
modprobe nf_conntrack_ipv4
如果多端口给您带来问题,您可以单独添加端口进行测试。