iptables自定义chain

iptables自定义chain

iptables应该可以算是一个脚本语言?基本概念比较简单,应用其实还是比较复杂。

基本词汇

chain:指这个规则发生的位置或者说时机。这个应该是内核钩子决定了的,没法改变。
  1. PREROUTING (路由前)
  2. INPUT (数据包流入口)
  3. FORWARD (转发管卡)
  4. OUTPUT(数据包出口)
  5. POSTROUTING(路由后)

table: 指这个规则的类型,对数据包做怎么样的操作?

  1. filter 定义允许或者不允许的
  2. nat 定义地址转换的
  3. mangle功能:修改报文原数据

table与chain的关系

不是任何位置都可以对包做任何操作的,table与chain有一些组合关系。
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

下面是一个经典的图:

 

自定义chain

参考:
https://www.safaribooksonline.com/library/view/linux-server-hacks/0596004613/ch04s06.html

目的:方便管理我们自己添加的iptables规则而不影响原来的规则。添加和删除

创建一个chain:
>iptables -N name_of_chain

要删除chain有两步:

1先删除chain上的规则
>iptables -F name_of_chain

2删除chain
>iptables -X name_of_chain

既然是自定义chain,这个chain一定就要属于某个位置。

假设我们需要加两条自己定义chain,一条接入PREROUTING ,另一条接入POSTROUTING
暂时定义为:
PREROUTING_TEST
POSTROUTING_TEST怎么把自定义的chain加入到对应的位置?答案是从系统自带的chain进行跳转,处理完之后再跳转回来, 用-j参数。

iptables -t nat -A PREROUTING -j PREROUTING_TEST  #把PREROUTING_VIP链接到PREROUTING后面
iptables -t nat -A PREROUTING_TEST …#增加规则到自定义chain
iptables -A PREROUTING_TEST -j RETURN  #从自定义链退出到上一层链。这里就是PREROUTING同样的方法把POSTROUTING_TEST链加入到POSTROUTING后面

怎样删除一条规则

一般有两种方法,
第一个是通过规则的内容,在前面加-D进行删除。
iptables -D INPUT -s 127.0.0.1 -p tcp –dport 111 -j ACCEPT
第二种是基于chain和这条规则在这个chain上面的序号,序号从1开始,比如删除INPUT里第四条规则:
iptables -D INPUT 4

发表评论

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