使用场景
接收到网络包,对网络包到达的某个阶段进行hook操作,实现网络包过滤(fileter),修改(nat)
实现原理
可以hook的地方
数据包到达会经过几个阶段,在这几个阶段配置hook
5个hook点说明:
- PREROUTING: 数据包进入路由表之前
- INPUT:通过路由表后进入本机
- FORWARDING:通过路由表后,目的地不为本机
- OUTPUT:由本机产生,向外转发
- POSTROUTIONG:发送到网卡接口之前。
每个hook动作类型(不同动作类型放到不同表)
表说明
- filter:一般的过滤功能
- nat:用于nat功能(端口映射,地址映射等)
- mangle:用于对特定数据包的修改
- raw:优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
- RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
- RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
表优先级:
- 如果存在多个场景的表,iptables会按raw -> mangle -> nat -> filte表r的顺序执行表里的规则
命令使用说明
iptables -t filter -I INPUT -s 192.168.1.2 -p tcp --dport 22 -j DROP
在【某个hook】,【某个表】上面,加上【规则+动作】
在INPUT这个hook,在filter表上添加规则【来源ip是192.168.1.2,访问tcp22端口的】+【动作:丢弃包】
参数详解:
- -t指定表(table),如果把所有的规则混放在一起肯定会特别乱,因此iptables根据功能划分为不同的表,过滤包的放在filter表,做NAT的放nat表等,还有raw表、mangle表、security表,共5个表。如果不指定该参数,默认会选中filter表。
- -I表示insert操作,在最前面插入这条规则,相对应的还有-A参数,表示从末尾追加规则,-I、-A还可以在后面指定索引位置,将规则插入到指定的位置。
- INPUT表示链hook名称,链可以看做是一个链表,链表元素为规则。iptables一共可操纵5条链,分别为PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。需要注意的是,所有的表都是共享这5条链的,当然并不是所有的表都同时需要这5条链,比如filter表就没有PREROUTING、POSTROUTING。如果多个table都在如上链上插入了规则,则根据raw -> mangle -> nat -> filter的顺序执行。
- -s、-p、--dport都是条件,多个条件是与的关系,即只有满足指定的所有条件才能匹配该规则,如上
- -s指定了源地址IP为192.168.1.2,
- -p指定了协议为TCP,
- --dport指定了端口22,即只有源地址访问目标的22 TCP端口才能匹配这条规则。
- -j指定了行为,当然官方的叫法是目标(target),这里DROP表示丢弃包。
例子
通用操作
查看IPtables防火墙策略
查看某张表的所有链(内置的和自定义的)的规则
查看filter表
iptables -L -n -v
- 默认不指定,查的是filter表
- --list -L [chain [rulenum]]
- - List the rules in a chain or all chains 列出表的所有链的规则
- --verbose -v verbose mode
- 详细模式
- -n numeric output of addresses and ports
- 数字的形式显示ip和端口
查看nat表
iptables -t nat -L -v –n
删除某条规则
完全匹配删除
iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP
-D参数表示删除
按行号删除
- 查看某个Chain的规则,包括行号
[root@kube-master ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
2 ACCEPT all -- anywhere anywhere
3 INPUT_direct all -- anywhere anywhere
4 INPUT_ZONES_SOURCE all -- anywhere anywhere
5 INPUT_ZONES all -- anywhere anywhere
6 ACCEPT icmp -- anywhere anywhere
7 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
- 删除第7行号的规则
iptables -D INPUT 7
[root@kube-master ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
2 ACCEPT all -- anywhere anywhere
3 INPUT_direct all -- anywhere anywhere
4 INPUT_ZONES_SOURCE all -- anywhere anywhere
5 INPUT_ZONES all -- anywhere anywhere
6 ACCEPT icmp -- anywhere anywhere
- 发现没有第7行了
过滤功能(filter表)
限制来源ip
iptables -A INPUT -i eth0 -s 113.125.255.163 -p tcp -j ACCEPT
iptables -A INPUT -i eth0 -s 223.255.252.24 -p tcp -j ACCEPT
iptables -A INPUT -i eth0 -j DROP
- -t filter指定操作表
- 不指定-t参数默认值是filter
- -A INPUT 在INPUT这个hook新增规则
- -A将规则加到末尾
- -I表示将规则加到最前面
- 匹配条件
- -i eth0
- 指定操作的网卡是eth0
- -s 113.125.255.163
- 来源ip是113.125.255.163
- 支持写网段:例如(113.125.255.163/24)
- -p tcp
- 协议是tcp的
- -j 跳转到操作
- -j ACCEPT 表示接收包
- -j DROP 表示丢弃包
NAT功能(nat表)
配置端口转发
将所有到达 eth0 网卡 25 端口的流量重定向转发到 2525 端口
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525
运维操作
保存IPtables规则
iptables-save > ~/iptables.rules
- 默认情况下,管理员对 IPtables 规则的操作会立即生效。但由于规则都是保存在内存当中的,所以重启系统会造成配置丢失
- 要永久保存 IPtables 规则可以使用 iptables-save 命令
- 但这个命令只是将规则永久保存到一个文件,重启后需要重启iptables-restore回去
- 保存的名称大家可以自己改。
还原IPtables规则
- iptables-restore < ~/iptables.rules
清空IPtables规则
清空所有表
iptables -F
清空特定的表:可以使用 -t 参数进行指定
iptables -t nat –F