iptables的使用
iptables 是Linux一个用于 IP 访问控制的指令,它可以调用内核 Netfilter 进行 IP 访问控制设置,属于网络七层模型中网络层的防火墙。
命令介绍
基本语法如下:
iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
-t 指定要访问的表,不指定,默认为 filter 表
TABLE 上面提到的四张表:filter、nat、mangle、raw,一般常用到的表为 filter 和 nat 表
COMMAND操作参数
分为对链本身操作、规则操作及查询操作:
链本身操作:
-F:flush, 清空规则链;
-N:new, 自建一条链
-X: delete, 删除一条自定义的空链
-Z:zero,计数器归零
-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;
-E:重命名自定义链
链规则操作:
-A 添加规则
-I 插入规则
-D 删除规则
-R 修改规则
查询操作:
-L 列出规则
-n: 数字格式显示主机地址和端口;
-v: 详细格式,-vv, -vvv
-x: exactly,不要对计数器的计数结果做单位换算,而显示其精确值
--line-numbers: 显示规则编号
CRETIRIA匹配条件
即匹配条件,可使用以下参数:
通用匹配
-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;
--src, --source
-d 地址:指定报文目标IP地址匹配的范围;
--dst, --destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;
-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD
-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING
扩展匹配
调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令的-m选项来指定调用哪个模块)
隐式扩展
当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
-p tcp 指定端口采用:
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目标端口
--tcp-flags
要检查标志位列表(用逗号分隔),必须为1的标志位列表(逗号分隔),加参数:
--syn
-p udp同样指定端口如下:
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0: echo-reply, ping响应
8: echo-request, ping请求
显式扩展
必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;
-m 扩展模块名称
multiport: 多端口匹配, 可用于匹配非连续或连续端口;最多指定15个端口;
专用选项
指定端口
--source-ports, --sports port[,port,port:port] 指定源端口
--destination-ports, --dports 指定目标端口
--ports 通用端口,包括源与目标端口
例如:开放22,80端口指令,允许其它机器访问172.16.100.7:
[root@localhost ~]# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
匹配地址
iprange: 匹配指定范围内的地址,匹配一段连续的地址而非整个网络时有用;
[!] --src-ragne IP[-IP]
[!] --dst-range
例如,限定一段连续地址可以通过telnet连接。
[root@localhost ~]# 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
[root@localhost ~]# 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
匹配字符串
string: 字符串匹配,能够检测报文应用层中的字符串
专用选项:
--algo {kmp|bm} 2种不同的算法,选一种
--string "STRING" STRING为你想要匹配的字符串
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
例子:对报文中包含有sex字符串的进行拒绝访问(丢包)
# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
匹配时间
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] 按时期匹配,day可为
Mon, Tue,..... 中间用逗号隔开
例子,允许周一周二8:20-18:40访问172.16.100.7的80端口(即默认的http访问):
[root@localhost ~]# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue -j ACCEPT
匹配连接数
connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;
专用选项:
[!] --connlimit-above [n]
例子:限制同一IP ssh远程连接数。
[root@localhost ~]# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
速率匹配
limit: 速率限制
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
例子:限制每分钟只能ping20次:
[root@localhost ~]# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
匹配状态
state: 根据状态检查匹配,匹配对应的状态
专用选项:
--state
连接追踪中的状态, 状态包括:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
例子:放行所有已建立连接的数据包。
[root@localhost ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
TARGET处理参数
处理目标,即对数据包的处理行为,包含:
1、DROP : 丢弃包,作用同拒绝,一般使用DROP进行拒绝
2、REJECT: 拒绝
3、ACCEPT: 放行
4、自定义的链 : 根据自定义链中的规则进行匹配
创建自定义链:iptables [-t table] -N chain
删除自定义且0引用的空链:iptables [-t table] -X chain
重命名自定义链:iptables [-t table] -E old_name new_name
5、DNAT:明确申明要做的是目的地地址转换操作
6、SNAT:明确申明要做的是源地址转换操作
7、REDIRECT:重定向:主要用于实现端口重定向
8、MARK:打防火墙标记的
9、RETURN:在自义链中无法匹配报文时,将其返回主链
常用例子
- 查询规则
如上截图,对应字段及中文含义为:
pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 流入接口 流出接口 源地址 目标地址
- 添加规则
1)SNAT例子:内网中的主机A想通过主机B访问公网中的WEB主机C。
内网主机A地址:172.16.6.2
网关主机为B:由2个地址,一个是内网地址172.16.0.1,一个外网地址192.168.1.1
公网主机C地址:2.2.2.2
使用IPTABLE指令为:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.16.6.2 -j SNAT --to-source 1.1.1.1
2)DNAT例子:公网中的主机A想通过网关主机B访问公网中的内网主机A。
私网主机A地址:172.16.6.2
网关主机为B:由2个地址,一个是内网地址172.16.0.1,一个外网地址192.168.1.1
公网主机C地址:2.2.2.2
使用IPTABLE指令为:
[root@localhost ~]# iptables -t nat -A PREROUTING -d 1.1.1.1 -j DNAT --to-destination 172.16.6.2
- 删除规则
例如,删除nat的第一条规则:
[root@localhost ~]# iptables -t nat -D 1
注:规则序号为从1开始,依次递增。