一、 iptables 查看链表,创建链表,类命令
1. iptables [-t table] -N chain : 创建一条自定义规则的链
1
2
|
# iptables -t filter -N clean_in
注: 自定义链在没有被引用之前是不起作用的。
|
2. iptables [-t filter] -X [chain] : 删除一个自定义链
1
|
# iptables -t filter -X clean_in
|
3. iptables [-t table] -E old-chain-name new-chain-name : 为一个自定义链修改名字
1
|
# iptables -t filter -E clean_in clean_in_httpd
|
4. iptables [-t table] -P chain target : 为链指定默认策略,指定默认规则
5. iptables [-t table] {-F|-L|-Z} [chain [runlenum]] [options…] :查看修改规则命令组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
-F : 清空链中的规则,规则具有编号,从上到下,从1开始
-L: list,列出表中的所有规则
-n: 数字格式显示IP和Port
-
v
: 详细格式显示
pkts bytes target prot opt
in
out
source
destination
每个字段的含义:
pkts: packets, 被本规则所匹配到的报文的个数;
bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;
target: 目标,即处理机制;
prot: 协议,一般为{TCP|UDP|ICMP};
opt: 可选项
in
: 数据包的流入接口;
out: 数据包的流出接口;
source
: 源地址;
destination: 目标地址;
-X: exactly, 精确值,不执行单位换算
--line-number: 显示各规则的行号
-Z: 匹配数量清零
|
二、 iptables 添加和编辑规则相关命令
1. iptables [-t table] {-A | -D} chain rule-specification
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
-A: append, 附加一条规则
-D chain [rulenum] rule-specification: 删除一条规则
-I chain [rulenum] rule-specification : 修改规则
-R chain [rulenum] rule-specification:替换指定规则
-S chain [rulenum] 只显示链上的规则添加
rule-specification格式 :
匹配条件 -j 处理机制
通用匹配条件:
-s: 匹配原地址,可以IP,也可以是网络地址,可以使用!操作符取反,!192.168.0.0
/16
; -s 相当于 --src 或 --
source
-d: 匹配目标地址
-p: 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一;
-i:数据报文流入的接口:通常用于INPUT, FORWARD, PREROUTING
-o:流出接口,通常只用于OUTPUT,FORWARD,和POSTROUTING
-j target
RETURN:返回调用链
ACCEPT: 放行
举例:
1. 允许192.168.98.0
/24
网段
ping
通,当前192.168.98.128主机
# iptables -t filter -A INPUT -i eth0 -s 192.168.98.0/24 -d 192.168.98.128/24 -p ICMP -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128 -d 192.168.98.0/24 -p ICMP -j ACCEPT
结果; ICMP INPUT和OUTPUT链都有匹配到
Chain INPUT (policy ACCEPT 57 packets, 4188 bytes)
pkts bytes target prot opt
in
out
source
destination
29 2436 ACCEPT icmp -- eth0 * 192.168.98.0
/24
192.168.98.0
/24
Chain OUTPUT (policy ACCEPT 41 packets, 4980 bytes)
pkts bytes target prot opt
in
out
source
destination
29 2436 ACCEPT icmp -- * * 192.168.98.128 192.168.98.0
/24
|
2. iptables规则保存
1
2
3
4
5
|
# service iptables save: 默认会被保存在/etc/sysconfig/iptables文件中,start的时候也会从这里读取
下面两种方式也可以存取
# iptables-save > /path/to/some_rulefile
# iptables-restore < /path/from/some_rulefile
|
3. iptables隐含扩展配置
1)tcp协议的隐含扩展
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
-p tcp
--dport m[-n]:匹配的目标端口,可以使连续的多个端口
--sport: 源端口
--tcp-flags rst,syn,ack,fin syn : 空格之前表示匹配哪些标识位,空格之后是哪些标识位为1
--syn:单独匹配某一项标识位
所有使用的值: URG, PSH, RST, SYN, ACK, FIN,ALL, NONE
举例: 释放所有192.168.98.0
/24
网段的
ssh
服务
# iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp --sport 22 -j ACCEPT
# iptables -t filter -P INPUT DROP
# iptables -t filter -P OUTPUT DROP
结果:
ssh
链接不会断开,可以看见进出都有报文匹配,而
ping
报文会被drop
Chain INPUT (policy DROP 45 packets, 3588 bytes)
pkts bytes target prot opt
in
out
source
destination
967 70220 ACCEPT tcp -- * * 192.168.98.0
/24
192.168.98.0
/24
tcp dpt:22
Chain OUTPUT (policy DROP 22 packets, 5608 bytes)
pkts bytes target prot opt
in
out
source
destination
426 48420 ACCEPT tcp -- * * 192.168.98.0
/24
192.168.98.0
/24
tcp spt:22
|
2) udp 协议的隐含扩展
1
2
3
4
5
6
7
8
9
10
|
-p udp : udp报文相关的拓展匹配
--dport
--sport
放行本机的tftp服务
# iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 69 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 69 -j ACCEPT
放行本机DNS服务
# iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 53 -j ACCEPT
# iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 53 -j ACCEPT
|
3) icmp 协议的隐含扩展
1
2
3
4
5
6
7
8
|
-P icmp : icmp协议相关拓展
--icmp-
type
8:
ping
请求
0:
ping
响应
释放本机的
ping
请求
# iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p icmp --icmp-type 8
# iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p icmp --icmp-type 0
|
4. 显示扩展:必须指定的扩展模块
-m 扩展模块名称 –专用选项1 –专用选项2
1) multiport:多端口匹配模块,一次可以指定最多15离散端口。
1
2
3
4
5
6
7
8
9
|
-m multiport
--
source
-ports,--sports port[,port|,port:port] : 指定源端口
--destination-port, --dports: 指定目标端口
--ports: 指定源端口和目标端口
举例:
开放本机所在网络,
ssh
和web服务。
# iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp -m multiport --dport 22,80 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp -m multiport --sport 22.80 -j ACCEPT
|
2) iprange:匹配ip地址范围
1
2
3
4
5
6
7
8
|
-m iprange:
[!] --src-range from[-to]
[!] --dst-range from[-to]
举例:
开放本机
ssh
给192.168.98.1-192.168.98.120访问
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m iprange --src-range 192.168.98.1-192.168.98.120 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 22 -m iprange --dst-range 192.168.98.1-192.168.98.120 -j ACCEPT
|
3)time:指定时间范围匹配
1
2
3
4
5
6
7
8
9
10
|
-m
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...]
举例,在工作日时间开放samba(tcp, 901端口) 服务
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 901 -j ACCEPT
|
4) string:字符串过滤
1
2
3
4
5
6
7
8
|
-m string
--algo {bm|kmp}:字符匹配查找时使用的算法
--string
"STRING"
: 要查找的字符串
--hex-string
"HEX-STRING"
: 要查找的字符,先编码成16进制格式,可以提高查询效率
举例: 禁止本机的web报文,包含‘hello’字符
# iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 80 -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --sport 80 -m string --algo bm --string "hello" -j DROP
|
5) connlimit:每个ip对指定服务的最大并发链接数
1
2
|
-m connlimit
--connlimit-above [0]:此选项用于,坚定某个IP是正常访问还是发起攻击
|
6)limit:报文速率控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-m limit
--limit
#/[/second|/minute|/hour|/day] 限制速率
--limit-burst
# 峰值速率
举例: 防御DDos攻击
# iptables -t filter -I INPUT -d 192.168.98.128 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 10 -j ACCEPT
在另一台主机上,使用hping3命令发起攻击
# hping -1 -c 10000 -i u1 192.168.98.128
结果:
Chain INPUT (policy DROP 9990 packets, 280K bytes)
pkts bytes target prot opt
in
out
source
destination
10 280 ACCEPT icmp -- * * 0.0.0.0
/0
192.168.98.128 icmp
type
8 limit: avg 2
/sec
burst 10
可以看到只有10个报文通过,其他的icmp请求全被drop了
|
7)state:状态匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
-m state
--state
NEW:新建连接
ESTABLISHED:已经建立的连接
RELATED:与现有连接有关联的连接
INVALID: 异常连接
状态匹配是由ip_conntrack, nf_conntrack两个模块实现的。
# cat /proc/sys/net/nf_conntrack_max
定义了连接追踪的最大值,因此,建议按需调大此值;
# cat /proc/net/nf_conntrack
记录了当前追踪的所有连接
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
记录建立的连接超时时间
法则:
1. 对于进入的状态为ESTABLISHED都应该放行;
2. 对于出去的状态为ESTABLISHED都应该放行;
3. 严格检查进入的状态为NEW的连接;
4. 所有状态为INVALIED都应该拒绝;
举例:放行工作于被动模式下的FTP服务
1. 确保iptables加载
ftp
协议支持的模块:ip_nat_ftp, ip_conntrack_ftp
编辑
/etc/sysconfig/iptables-config
文件,定义如下参数:
IPTABLES_MODULES=
"ip_nat_ftp ip_conntrack_ftp"
2. 开放命令连接端口,tcp 21号端口
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
3. 放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态;
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT
如果只开放命令连接的话,依然可以进行身份认证,但是无法下载,或者查看目录
启动服务时的最后一个服务通常是
/etc/rc
.d
/rc
.
local
(
/etc/rc
.
local
),这事实上是一个脚本,但凡写在此脚本中的命令或脚本调用都在系统运行至此服务被执行
|
5. INPUT和OUTPUT默认策略为DROP的一些实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
1. 限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT-s 192.168.98.128 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT
2. 在工作时间,即周一到周五的8:30-18:00,开放本机的
ftp
服务给192.168.98.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个
# iptables -t filter -R INPUT 2 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
# iptables -t filter -R INPUT 3 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.98.128 -s 192.168.98.0/24 -p tcp -m state --state ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT -d 192.168.98.0/24 -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT
3. 开放本机的
ssh
服务给192.168.98.1-192.168.98.100中的主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 192.168.98.1-192.168.98.100 -m limit --limit 2/min -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 192.168.98.1-192.168.98.100 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 22 -m iprange --dst-range 192.168.98.1-192.168.98.100 -m state --state ESTABLISHED -j ACCEPT
4. 拒绝TCP标志位全部为1及全部为0的报文访问本机;
# iptables -t filter -A INPUT -d 192.168.98.128 -p --tcp-flags ALL ALL -j DROP
|
三、 iptables 当做网络防火墙的一些设置
1. FORWARD 链限定本机路由功能
对于Linux主机来说,设定/proc/sys/net/ipv4/ip_forward的值为1,即为开启了路由功能;
如果对于转发进行限定,需要在FORWARD链上面进行限定规则。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
举例: 三台主机,vm1,vm2,vm3
vm1: IP地址,192.168.98.128
vm2: IP地址,192.168.98.129 另一块网卡为172.25.136.1
vm3:IP地址,172.25.136.2
只开通vm1和vm3之间的
ping
请求
## 设置vm1主机
# route add default gw 192.168.98.129
## 设置vm3主机
# route add default gw 172.25.136.2
## 设置vm2主机
# echo 1 /proc/sys/net/ipv4/ip_forward
# iptables -t filter -A FORWARD -s 192.168.98.128 -d 172.25.136.2 -p icmp -j ACCEPT
# iptables -t filter -A FORWARD -s 172.25.136.2 -d 192.168.98.128 -p icmp -j ACCEPT
# iptables -P FORWARD DROP
|
2. NAT(过载技术)地址转换相关应用
Basic NAT: 静态NAT;地址端口池子
内部主机都需要外部主机地址池中的一个地址
NAPT:动态NAT,网络地址端口转换;外部主机端口使用一个地址,但是选择一个动态端口映射,建立一个会话表。
1
2
3
4
5
6
7
|
使用命令:
iptables基于SNAT和DNAT这两个目标实现地址转换技术;
-j SNAT --to-
source
SIP
规则添加:POSTROUTING链
-j MASQUERADE : 地址伪装,无需知道原地址是什么,自动找到可以使用的互联网地址,拨号时候可以使用。
-j DNAT --to-destination DIP[:PORT]
支持端口映射
|
所有nat相关转换,如果限定访问内容,可以在forward 链上面做限定
1)源地址转换:SNAT,用于让内网主机访问互联网
1
2
3
4
5
6
7
8
9
10
|
例子: vm1: IP地址,192.168.98.128 模拟内网
vm2: IP地址,192.168.98.129 另一块外网网卡为172.25.136.1
vm3:IP地址,172.25.136.2 模拟外网
开通使内网通过SNAT访问外网服务器。
## 内网主机vm1设置路由
# route add default gw 192.168.98.129
## 中间主机vm2
# iptables -P FORWARD ACCEPT
# iptables -t nat -A POSTROUTING -d 192.168.98.0/24 -j SNAT --to-source 172.25.136.1
|
2)目标地址转换:DNAT,让互联网上主机访问本地内网中的某服务器上的服务,(发布)
例子: vm1: IP地址,192.168.98.128 模拟内网
vm2: IP地址,192.168.98.129 另一块外网网卡为172.25.136.1
vm3:IP地址,172.25.136.2 模拟外网
开通使内网通过DNAT使得外网访问内网主机web服务器。
## 内网vm1服务器需要路由指向vm2内网地址,否则请求无法返回
# route add default gw 192.168.98.129
## 外网vm3需要可以向vm2外网地址通信
# route add default gw 172.25.136.1
## vm2主机设置目标地址转换条目
# iptables -t nat -A POSTROUTING -d 172.25.136.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.98.128
这样外网地址主机发出访问到中间主机,请求会被转发到内网主机。