Linux下的包过滤软件:iptables剖析
netfilter/iptables 是Linux平台下的包过滤防火墙,iptables位于用户空间,通过命令操作 netfilter 来实现网络数据包的处理和转发,netfilter位于内核空间,是真正的管理网络数据包。iptables 包括了“表(tables)”、“链(chain)”和“规则(rules)”三个层面。 tables 表示不同类型的数据包处理流程, filter 表用于过滤数据包, nat 表用于地址转换, mangle 表, raw 表用于处理异常。 Netfilter为iptables提供了五个数据包的挂载点(Hook):PRE_ROUTING、INPUT、OUTPUT、FORWARD与POST_ROUTING。 下图是 netfliter 的数据包流:
表
iptables 总共有五张表:filter表、nat表、mangle表、raw表、security表(security表极少使用)。同样 chain 下 表的优先顺序是 raw -> mangle -> nat -> filter,比如 PREROUTING 链在 raw, mangle 和 nat 都有,其处理顺序是raw(PREROUTING) -> mangle(PREROUTING) -> nat(PREROUTING)。
filter 表
filter 表是默认表,主要做包过滤,用于防火墙规则,filter 表内建有三条链:
- INPUT,输入链。发往本机的数据包通过此链。
- OUTPUT,输出链。从本机发出的数据包通过此链。
- FORWARD,转发链。本机转发的数据包通过此链。
nat 表
nat 表,主要做地址转换,用于网关路由器,其内建三条链:
- PREROUTING,路由前链。
- POSTROUTING,路由后链。
- OUTPUT,输出链。
mangle 表
mangle 表主要做数据包修改,针对每一个数据包进行处理,其内建五条链:
- PREROUTING,路由前链
- OUTPUT,输出链
- INPUT,输入链
- FORWARD,转发链。
- POSTROUTING,路由后链。
raw 表
raw 表主要用-j notrack
给不需要被连接跟踪的包打标记(UNTRACKED状态),这种让数据包不进入链接跟踪/NAT子系统行为,所以raw表可以用在那些不需要做nat和链接跟踪的情况,提升系统性能。其内建两条链:
- PREROUTING,路由前链
- OUTPUT,输出链
命令行参数解说
iptalbes 命令参数讲解:
$ iptables -h
-t:指定要操纵的表,默认条件下是filter表;
-A:--append,向链中添加规则条目;
-D:--delete,从链中删除规则条目;
-i:--insert,向链中插入规则条目;
-R:--replace,替换链中的规则条目;
-L:--list,显示链中已有的规则条目;
-F:--flush,清空链中选择的规则条目,如果后面不跟参数代表所有规则;
-N:--new-chain,创建新的用户自定义链;
-X: --delete-chain,从删除用户定义链,不过必须是这个链里面的规则都被清空了才能删除;
-E: --rename-chain,为用户自定义的链重命名;
-P:--policy,定义链中规则的默认目标;
-p:--protocol,指定要匹配的数据包协议类型;
-s:--source,指定要匹配的数据包源ip地址;
-j:--jump,指定指定的目标执行规则,accept接收数据包,DROP丢弃数据包,REDIRECT重定向,SNAT源地址转换,DNAT目标地址转换,还有MASQUERADE,LOG等动作;
-i:--in-interface,指定数据包进入本机的网络接口,后面跟网络接口名字;
-o:--out-interface,指定数据包要离开本机所使用的网络接口,后面跟网络接口名字;
iptable 主要是针对IPv4,如果针对IPv6处理可以用 ip6tables, 命令是一样的。
以一个端口转换为例:
其命令如下:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
命令行解读:
-t nat
表示针对的 nat 表;
-A PREROUTING
表示添加一个 PREROUTING 规则;
-p tcp
表示规则的包协议,这里说明适应的协议是 tcp 协议;
-j REDIRECT
表示指定的目标执行规则,即数据包匹配,该怎么办,REDIRECT 表示重定向动作;
-dport 80
表示目标端口是80;
--to-port 8080
表示重定向端口是8080;
意思就是向 nat 表添加一条 PREROUTING 规则,将目标端口80的 tcp 请求重定向到 8080。
设置好规则后可以通过iptables-save
输出整个规则列表存储起来,后面再通过iptables-restore
恢复。
参考文献
- https://zh.wikipedia.org/wiki/Iptables
- https://unix.stackexchange.com/questions/243079/netfilter-iptables-why-not-using-the-raw-table
- 数据库结构版本控制
- 数据库安全·内容版本控制,撰改留痕
- 数据库安全·为数据安全而分库
- 数据库安全·时间一致性
- 帝国cms栏目别名如何调用?
- 数据库安全·保护表字段
- 【实践】伪造名人的脸—做一个小示例了解生成式对抗网络
- Spring 常见问题与解决方法
- 如何通过css控制内容显示顺序 第二行的内容优先显示
- 杨廷琨 - 用SQL解析神奇的扑克牌魔术
- Spring boot with Spring security
- Spring RestFul and RestTemplate
- Spring boot with Velocity template
- Oracle 11g R2 RAC 高可用连接特性 – SCAN 详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在生产中应用广泛的排序算法
- SQL | SQL 必知必会笔记 (一 )
- 如何在树莓派4B上安装EMQ X Broker
- SQL | SQL 必知必会笔记 (二)
- 基于桶子法实现的两种排序算法
- Notes | 微观经济学课堂笔记(一)
- 将终结点图添加到你的ASP.NET Core应用程序中
- Stata | 爬取 CFPS 文献传送门并制作成 Markdown
- 委托的好处
- Elasticsearch安装和配置
- Notes | QUAIDS 模型
- Stata | 520,听说你也想快点找到...
- Stata | 批量替换变量值的小技巧
- 手把手教你完成课设作业使用Pandas对海平面温度异常进行分析,小白也能看的懂
- 谈谈自学 Stata 的体会