iptables,纠结的顺序


今天做MYSQL监控的时候遇到两个纠结的问题,一是本机localhost只使用了unix socket,因为my.cnf加入了skip-networking,那么TCP/IP的连接方式被彻底禁止了,所以,即使没有bind-address在127.0.0.1的限制,即使创建了@‘%’的用户,外面还是连接不上,结果折腾了好久,不过,坏不算过分,因为,更加过分的是我的iptable设置。。。
这是我一开始的顺序

然后我限定只有指定IP可以访问本机3306端口的时候运行如下命令

结果死活连接不上,cat规则,已经输入了,但是-L不出来~

用个google充电:

iptables执行规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则, 执行后根据本规则的动作(accept, reject, log等),决定下一步执行的情况(iptable有三种队列(表)规则,mangle queue, filter queue, nat),后续执行一般有三种情况。
1.一种是继续执行当前 规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
2.一种是中止当前规则队列的执 行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
3.一种是中止所有规则队列的 执行。
iptables 是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的 IP 判断是否需要转送出去,接着就会跳到 INPUT 或 Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述流程继续进行下一个规则炼的过滤(注意:这一点与 ipchains 不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。
ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting)。
REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭连接),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
iptables -A FORWARD -p TCP ——dport 22 -j REJECT ——reject-with tcp-reset
DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式 porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp ——dport 80 -j REDIRECT ——to-ports 8080
MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE ——to-ports 1024-31000
LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则。例如:
iptables -A INPUT -p tcp -j LOG ——log-prefix "INPUT packets"
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT ——to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 ——dport 80 -j DNAT ——to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR 镜像封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用……等。
RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp ——dport 22 -j MARK ——set-mark 2

再看我的iptables表,悲剧的一幕,子链Chain RH-Firewall-1-INPUT被放在最上面,而这个子chain的最后一条是

REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

而通过shell条用iptables建立的规则都不属于子链Chain RH-Firewall-1-INPUT,这个readhat自建的子链会在使用诸如setup,system-config-securitylevel-tui等文本图形化工具创建的规则自动加入这个子连,而CentOS集成了这个“光荣传统”,所以,我用iptables自建的规则全部得不到执行,因为这个先执行的子连的最后一句就已经全部reject了。。。。。。。

知道了原因,就是条换一下顺序么


下面记录几条iptables命令。方便自己copy&paste

这个人博客蛮好的
http://hi.baidu.com/chenshake/blog/item/8bb5cd166f872711962b43e4.html

Author Info :
  • From:iptables,纠结的顺序
  • URL:http://blog.ihipop.info/2010/03/705.html
  • Please Reserve This Link,Thanks!
  • 发表评论

    电子邮件地址不会被公开。 必填项已用*标注