数据包先经过PREOUTING,由该链确定数据包的走向:
1、目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;
①--->③--->④--->⑥
主机发送数据包时,流程则是⑤--->⑥
iptables安装配置
linux一般默认都已经安装iptables,只需要开启服务即可
|
iptables规则书写
基本语法:iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作]
表 | 说明 | 支持的链 |
raw | 一般是为了不再让iptables对数据包进行跟踪,提高性能 | PREROUTING、OUTPUT |
mangle | 对数据包进行修改 | 五个链都可以 |
nat | 进行地址转换 | PREROUTING、OUTPUT、POSTROUTING |
filter(默认) | 对包进行过滤 | INPUT、FORWARD、OUTPUT |
常用操作命令 | 说明 |
-A | 在指定链尾部添加规则 |
-D | 删除匹配的规则 |
-R | 替换匹配的规则 |
-I | 在指定位置插入规则 例:iptables -I INPUT 1 --dport 80 -j ACCEPT (将规则插入到filter表INPUT链中的第一位上) |
-L/S | 列出指定链或所有链的规则 |
-F | 删除指定链或所有链的规则 |
-N | 创建用户自定义链 例:iptables -N allowed |
-X | 删除指定的用户自定义链 |
-P | 为指定链设置默认规则策略,对自定义链不起作 用 例:iptables -P OUTPUT DROP |
-Z | 将指定链或所有链的计数器清零 |
-E | 更改自定义链的名称 例:iptables -E allowed disallowed |
-n | ip地址和端口号以数字方式显示 例:iptables -Ln |
常见规则匹配器 | 说明 |
-p tcp|udp|icmp|all | 匹配协议,all会匹配所有协议 |
-s addr[/mask] | 匹配源地址 |
-d addr[/mask] | 匹配目标地址 |
--sport port1[:port2] | 匹配源端口(可指定连续的端口) |
--dport port1[:port2] | 匹配目的端口(可指定连续的端口) |
-o interface | 匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT。 例:iptables -A FORWARD -o eth0 |
-i interface | 匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。 |
--icmp-type | 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型) |
--tcp-flags mask comp | 匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。 例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT (表示匹配SYN和ACK标记的数据包) |
目标动作 | 说明 |
ACCEPT | 允许数据包通过 |
DROP | 丢弃数据包 |
REJECT | 丢弃数据包,并且将拒绝信息发送给发送方 |
SNAT | 源地址转换(在nat表上) 例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 |
DNAT | 目标地址转换(在nat表上) 例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102 |
REDIRECT | 目标端口转换(在nat表上) 例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80 |
MARK | 将数据包打上标记 例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60 |
注意要点:
1、目标地址转换一般在PREROUTING链上操作
2、源地址转换一般在POSTROUTING链上操作
保存和恢复iptables规则
使用iptables-save可以保存到特定文件中
|
使用iptables-restore可以恢复规则
|
iptables的进阶使用
1、limit限制流量:
-m limit --limit-burst 15 #设置一开始匹配的最���数据包数量
-m limit --limit 1000/s #设置最大平均匹配速率
-m limit --limit 5/m --limit-burst 15 #表示一开始能匹配的数据包数量为15个,每匹配到一个,
limit-burst的值减1,所以匹配到15个时,该值为0,以后每过
12s,limit-burst的值会加1,表示又能匹配1个数据包
例子:
|
注意要点:
1、--limit-burst的值要比--limit的大
2、limit本身没有丢弃数据包的功能,因此,需要第二条规则一起才能实现限速的功能
2、time :在特定时间内匹配
-m time | 说明 |
--monthdays day1[,day2] | 在每个月的特定天匹配 |
--timestart hh:mm:ss | 在每天的指定时间开始匹配 |
--timestop hh:mm:ss | 在每天的指定时间停止匹配 |
--weekdays day1[,day2] | 在每个星期的指定工作日匹配,值可以是1-7 |
例子:
|
3、ttl:匹配符合规则的ttl值的数据包
参数 | 说明 |
--ttl-eq 100 | 匹配TTL值为100的数据包 |
--ttl-gt 100 | 匹配TTL值大于100的数据包 |
--ttl-lt 100 | 匹配TTL值小于100的数据包 |
例子:
|
4、multiport:匹配离散的多个端口
参数 | 说明 |
--sports port1[,port2,port3] | 匹配源端口 |
--dports port1[,port2,port3] | 匹配目的端口 |
--ports port1[,port2,port3] | 匹配源端口或目的端口 |
例子:
|
5、state:匹配指定的状态数据包
参数 | 说明 |
--state value | value可以为NEW、RELATED(有关联的)、ESTABLISHED、INVALID(未知连接) |
例子:
|
6、mark:匹配带有指定mark值的数据包
参数 | 说明 |
--mark value | 匹配mark标记为value的数据包 |
例子:
|
7、mac:匹配特定的mac地址
例子:
|