iptable规则的执行顺序
众所周知,iptable的中包含了各种各样的table和规则链条。这篇博文对规则链的执行顺序做一个简单的介绍。
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt: to:172.30.57.2:5000
正常来说,iptable会对一条报文逐条匹配某个表中的规则,如果匹配成功,那么就执行这条规则对应的TARGET。例如上面这条规则的作用是,如果报文满足以下条件:
- tcp协议
- 源地址为任何地址
- 目的地址为任何地址
- 发送到本地5000端口的(dpt:5000)
那么就做Destination NAT,NAT至172.30.57.2:5000。如果报文匹配了该条规则,那么它会跳出OUTPUT,转而执行下一个对应的规则链。
这个例子说明了当TARGET为DNAT时的情况。但是我们知道iptable中的TARGET有很多种,DNAT只是其中之一。不同的TARGET有不同的跳转规则,有的TARGET在执行完成后就跳出当前的规则链跳往下一个规则链(例如在PREROUTING时从mangel表的PREROUTING链跳往nat表的POSTROUTING链). 而有的TARGET 在执行完成后会接着执行当前规则链中的下一个规则。
从网上抄了一个2007年的博文:
-------------------------------------------------------------------------
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
------------------------------------------------------------------------------------
ref: http://bbs.chinaunix.net/thread-936284-1-1.html
还有一种情况这个帖子中没有给出,那就是自定义的规则链。例如:
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
KUBE-POSTROUTING all -- anywhere anywhere /* kubernetes postrouting rules */
RETURN all -- 192.168.122.0/ 224.0.0.0/
RETURN all -- 192.168.122.0/ 255.255.255.255
MASQUERADE tcp -- 192.168.122.0/ !192.168.122.0/ masq ports: -
MASQUERADE udp -- 192.168.122.0/ !192.168.122.0/ masq ports: -
MASQUERADE all -- 192.168.122.0/ !192.168.122.0/
RETURN all -- 172.30.0.0/ 172.30.0.0/
MASQUERADE all -- 172.30.0.0/ !224.0.0.0/
RETURN all -- !172.30.0.0/ 172.30.57.0/
MASQUERADE all -- !172.30.0.0/ 172.30.0.0/
MASQUERADE tcp -- 172.30.57.2 172.30.57.2 tcp dpt: Chain KUBE-POSTROUTING ( references)
target prot opt source destination
MASQUERADE all -- anywhere anywhere /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
在这个例子中,有两个规则链,分别是iptable默认的POSTROUTTING链,还有一个是kube-proxy定义的KUBE-POSTROUTTING。当报文走到POSTROUTTING是,会匹配第一条。很显然,这条规则会匹配所有的报文。
然后跳转到KUBE-POSTROUTTING规则链,这个规则链只有一条规则,它的意思是如果报文带有0x4000的标记,那么就执行target,也就是MASQUERADE。如果报文不携带0x4000标记,那么该报文就不会匹配这条规则,然后返回,接着匹配
POSTROUTTING中的下一条报文。
iptable规则的执行顺序的更多相关文章
- CSS规则的执行顺序(转)
你对CSS规则的执行顺序是否了解,这里和大家分享一下,若两条规则具有相同的权值.起源及特殊性,那在样式表中最后出现的规则优先. 1.CSS规则之特殊性 首先来看一下这个例子将会发生的情形: <s ...
- 性能测试学习之路 (二)jmeter详解(jmeter执行顺序 && 作用域 && 断言 && 事务 &&集合点 )
1 Jmeter 工作区介绍 jmeter工作区分为3个部分:目录树.测试计划编辑区域.菜单栏. 2 Jmeter 执行顺序规则 Jmeter执行顺序规则如下: 配置元件 前置处理器 定时器 采样器s ...
- JMeter学习笔记--JMeter执行顺序规则
JMeter执行顺序规则: 配置元件 前置处理器 定时器 采样器 后置处理器(除非服务器响应为空) 断言 监听器 只有当作用域内存在采样器时,定时器.断言.前置/后置处理器才会被执行,逻辑控制器和采样 ...
- jmeter执行顺序及作用域规则
1.执行顺序 配置元件 前置处理器 定时器 采样器 后置处理器 断言 监听器 备注: 服务器响应为空的话后三个不执行 作用域内存在采样器时定时器.断言.前置/后置处理器才执行 逻辑控制器和采样器按照在 ...
- Iptables规则执行顺序详解
1.The first is the mangle table which is responsible for the alteration of quality of service bits ...
- JMeter专题系列(三)元件的作用域与执行顺序
1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(conf ...
- Select查询执行顺序
链接:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...
- java中return与finally的执行顺序
可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...
- Oracle sql语句执行顺序
sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...
随机推荐
- springMVC的简单了解和环境搭建
一,什么mvc 模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计思想.它主要通过 分离模型.视图及控制器在应用程序中的角色 将业务逻辑从界面中解耦.通常, 模型负责封装应用程 ...
- Mybatis中的拦截器
作者:moshenglv的专栏 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法. ...
- js 获取json对象的 键 和 值
直接上图 结果:
- API接口防止参数篡改和重放攻击
{近期领导要求我对公司业务的支付类的ocr接口做研究,是否存在支付接口重放攻击,so.....} API重放攻击(Replay Attacks)又称重播攻击.回放攻击.他的原理就是把之前窃听到的数据原 ...
- avcodec_decode_video2函数
转自 https://www.xuebuyuan.com/2156374.html 该函数的作用是实现压缩视频的解码.在avcodec.h中的声明方式如下: int avcodec_decode_vi ...
- keras计算指定层的输出
import keras model = keras.models.Sequential([ keras.layers.Dense(4, activation='relu', input_dim=1, ...
- Vue 项目中对路由文件进行拆分(解构的方法)
项目需求场景: 在开发项目过程中,在项目过于庞大,路由信息非常多的情况下,如果将路由配置信息都放在一个文件里面,那么这个JS是不方便维护的, 那么,这个时候需要我们把这个庞大的路由文件,根据项目功能分 ...
- Unable to copy file, Access to the path is denied
Unable to copy file, Access to the path is denied http://stackoverflow.com/questions/7130136/unable- ...
- learing cbor protocol
https://tools.ietf.org/html/rfc7049 https://github.com/panzidongfamily/tinycbor
- Java事务不回滚的原因总结
1.首先要检查数据的引擎,InnoDB支持事务,MyIsam不支持事务 2. 默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚. spring aop 异常 ...