Iptables
iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。术语 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多 前端[broken link: invalid section] 和 图形界面[broken link: invalid section] 配置。iptables 用于 ipv4,ip6tables 用于 ipv6
基本概念
iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4 数据包的代码已经内置于内核中,并且按照不同的目的被组织成 表 的集合。表 由一组预先定义的 链 组成,链 包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(称为 目标),如果谓词为真,该动作会被执行。也就是说条件匹配。iptables 是用户工具,允许用户使用 链 和 规则。很多新手面对复杂的 linux IP 路由时总是感到气馁,但是,实际上最常用的一些应用案例(NAT 或者基本的网络防火墙)并不是很复杂。 –ArchWiki
表(tables)
iptables包含4张表
- raw 用于配置数据包,raw 中的数据包不会被系统跟踪。
- filter 是用于存放所有与防火墙相关操作的默认表。
- nat 用于 网络地址转换(例如:端口转发)。
- mangle 用于对特定数据包的修改(参考 损坏数据包)。
大部分情况仅需要使用filter和nat。
链(chains)
5条链
- PREROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
表由链组成,链是一些按顺序排列的规则的列表。默认的 filter 表包含 INPUT, OUTPUT 和 FORWARD 3条内建的链,这3条链作用于数据包过滤过程中的不同时间点,参考流程图。nat 表包含PREROUTING, POSTROUTING 和 OUTPUT 链。
默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。链的默认规则通常设置为 ACCEPT,如果想确保任何包都不能通过规则集,那么可以重置为 DROP。默认的规则总是在一条链的最后生效,所以在默认规则生效前数据包需要通过所有存在的规则。
用户可以加入自己定义的链,从而使规则集更有效并且易于修改。
1)对自定义链的操作
#默认为filter表
#给表中添加一条自定义规则链
iptables [-t table] -N chain_name
#删除一条自定义规则链
iptables -X chain_name
#修改自定义链名
iptables -E old_chain_name new_chain_name
2)对链的操作
#为链指定默认处理机制
iptables -P chain_name target
#清空链中的规则
iptables -F chain_name
#列出表中所有的链与链的规则,[-n]数字格式显示,[-v]详细格式信息
iptables -L [-n] [-v]
iptables -L -n -v | |
pkts | packets, 被本规则所匹配到的报文的个数 |
bytes | 被本规则所匹配到的所有报文的大小之和,会执行单位换算 |
target | 目标,即处理机制 |
prot | 协议,一般为[TCP |
opt | 可选项 |
in | 数据包的流入接口 |
out | 数据包的流出接口 |
source | 源地址 |
destination | 目标地址 |
3)表和链的对应关系
表和链对应关系 | |
filter | INPUT,FORWARD,OUTPUT |
nat | PREROUTING,OUTPUT,POSTROUTING |
mangle | PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
raw | PREROUTING,OUTPUT |
规则(rules)
数据包的过滤基于规则。规则由一个目标(数据包包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。
规则命令
#添加一条规则
iptables -A chain_name rule
#删除一条规则
iptables -D chain_name rule_number
#插入一条规则
iptables -I chain_name rule_number rule
#修改一条规则
iptables -R chain_name rule_number new_rule
#只显示指定链上的规则添加命令
iptables -S chain_name
规则 = 匹配条件 + 处理机制
处理机制
- DROP
- REJECT
- ACCEPT
- SNAT
- DNAT
- RETURN
- REDIRECT
- LOG
匹配条件
参数 | |
-s | 匹配原地址,可以IP,也可以网络地址;可以使用!操作符取反, ! 172.16.0.0/16 |
-d | 匹配目标地址 |
-p | 匹配协议,通常只使用{TCP |
-i | 数据报文流入的接口;通常只用于INPUT、FORWARD和PREROUTING |
-o | 流出的接口;通常只用于OUTPUT、FORWARD和POSTROUTING |
隐含匹配
参数 | |
–dport | 匹配的目标端口 |
–sport | 匹配的源端口 |
–tcp-flags | 例:rst,syn,ack,fin syn。表示,rst,syn,ack,fin中除了syn=1其他都为0 |
–icmp-type | 8请求,0相应 |
基于模块做扩展匹配
模式:-m 扩展模块名称 --专用选项1 --专用选项2...
multiport:多端口匹配,最多15个
- –dports:目标端口
- –sports:源端口
例
iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange:ip地址范围
- [!] –src-range from[-to]
- [!] –dst-range from[-to]
例
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
time:指定时间范围
- datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- –timestart hh:mm[:ss]
- –timestop hh:mm[:ss]
- [!] –weekdays day[,day…]
例
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT
string:字符串匹配
- –algo{bm | kmp}:字符串匹配查找时使用算法
- –string “STR”:要查找的字符串
- –hex-string “HEX-STR”:要查找的字符,先编码成16进制格式
connlimit:每个IP对指定服务的最大并发连接数
- –connlimit-above [n]
limit:保温速率控制
- –limit #[/second|/minute|/hour|/day]
- –limit-burst #
state:状态匹配
- –state NEW
- –state ESTABLISHED
- –state RELATED
- –state INVALID