pkts:对应规则匹配到的报文的个数。
bytes:对应匹配到的报文包的大小总和。
target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
prot:表示规则对应的协议,是否只针对某些协议应用此规则。
opt:表示规则对应的选项。
in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。
iptables --line-numbers -nvL -t filter
iptables --line-numbers -nvL -t filter FORWARD
添加
iptables -t filter -I INPUT -s 192.168.1.2,192.68.1.1 -j DROP #向前添加
iptables -t filter -I INPUT 2 -s 192.168.1.2,192.68.1.1 -j DROP #向前添加
iptables -t filter -A INPUT 2 -s 192.168.1.2 -j DROP #向后添加
iptables -t filter -A INPUT ! -s 192.168.1.2 -j ACCEPT #取反,表示除了这个ip的都接受,但是这个ip依然能ping通,因为未指定此ip的规则,系统会默认匹配默认规则
删除
iptables --line-numbers -nvL #查询序号
iptables -D INPUT 1
iptables -D INPUT -s 192.168.1.2 -j DROP
删除表所有规则
iptables -t 表明 -F 链名
修改规则
iptables -t filter -R INPUT 1 -s 192.168.1.2 -j REJECT
修改默认规则
iptables -t filter -P FORWARD DROP
保存
iptables-save > /etc/iptables.rules
或者直接编辑 /etc/iptables.rules后
iptables-restore < /etc/iptables.rules
首次保存时需添加
vim /etc/network/if-pre-up.d/iptables #打开
#!/bin/bash
iptables-restore < /etc/iptables.rules
chmod +x /etc/network/if-pre-up.d/iptables
扩展模块
#添加目的地址
iptables -t filter -I INPUT -s 192.168.1.1 -d 192.168.255.129 -j DROP #从192.168.1.1发生至192.168.255.129的报文将丢弃
iptables -t filter -I INPUT -s 192.168.1.1 -d 192.168.255.129 -p tcp -j DROP #从192.168.1.1发生至192.168.255.129的tcp协议会被丢弃,-p后参数为tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
-i 指定流入网卡 -o指定流出网卡
-m 指定扩展匹配条件,若不指定,默认和-p相同 --dport 指定目标端口,--sport 指定源端口,必须和-p,-m配合使用
指定端口可使用22:25形式,表示22,23,24,25,或:80,表示从1到80端口所有端口
#若指定多个离散端口,则需要使用 -m multiport模块,如
iptables -t filter -I INPUT -s 192.168.255.1 -p tcp -m multiport -dport 22,36,80 -j DROP
-
iprange扩展模块
可以指定连续范围的ip,有–src-range,–dst-range选项iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.255 -j DROP
-
string
指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件
需配合–algo(参数为bm和kmp,为匹配不同算法,随便选一个)和–string使用,如
iptables -I INPUT -t filter -m string --algo bm --string "HELLO" -j REJECT
#如果报文中含有HELLO,则丢弃
- time
配置限制时间,指定某一时间某一策略,主要有
–timestart 00:00:00 开始时间
–timestop 00:00:00 结束时间
–weekdays 6,7 星期,可取反
–monthdays 29,30 每个月多少号,可取反
–datestart 2020-07-27 开始日期
–datestop 2020-10-20 结束日期
-
connlimit
限制每个IP地址同时链接到server端的链接数量–connlimit-above 10 限制每个ip最多有十个连接,
–connlimit-mask 27 在255.255.255.224 网段中,表示最多有多少个连接,比如27则最多有30个连接
-
limit
对"报文到达速率"进行限制,如:可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。比如,限制每秒中最多流入3个包,或者限制每分钟最多流入30个包,都可以
“–limit-burst"指定"空闲时可放行的包的数量”
–limit 10/minute 表示每分钟10个,即6秒钟一个,同理
/second
/minute
/hour
/day
–limit-burst 3 指定闲时最多三个连接
扩展匹配条件之’–tcp-flags’
https://www.zsythink.net/archives/1578
ICMMP扩展
https://www.zsythink.net/archives/1588
state扩展
http://www.zsythink.net/archives/1597
自定义链
http://www.zsythink.net/archives/1625
作为边缘主机网络防火墙
http://www.zsythink.net/archives/1663
NAT
root@cjs-virtual-machine:~# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 9 packets, 922 bytes)
pkts bytes target prot opt in out source destination
3 180 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 7 packets, 802 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 85 packets, 6070 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 85 packets, 6070 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
root@cjs-virtual-machine:~# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 1 packets, 67 bytes)
pkts bytes target prot opt in out source destination
5 284 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 1 packets, 67 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 10 packets, 793 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 12 packets, 897 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:55555
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
2 104 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:55555 to:172.17.0.2:55555
-
SNAT
内部的主机可以借助SNAT隐藏自己的IP地址,同时还能够共享合法的公网IP,让局域网内的多台主机共享公网IP访问互联网。iptables -t nat -A POSTROUTING -s 内部ip -j SNAT --to-source 外部ip
-
DNAT
将公网客户端发送过来的报文的目标地址与端口号做了映射,将访问web服务的报文转发到了内网中的C主机中,将访问远程桌面的报文转发到了内网中的D主机中。iptables -t nat -I PREROUTING -d 外部ip -p tcp --dport 外部端口 -j DNAT --to-destination 内部ip:内部端口
-
MASQUERADE
与SNAT相似,只不过不用绑定外部ip,绑定对应的物理interface就行
iptables -t nat -A POSTROUTING -s 内部ip -j MASQUERADE -o 出口interface
-
REDIRECT
将本机的端口映射到另外一个端口
iptables -t nat -A PREROUTING -p tcp --dport 源端口 -j REDIRECT --to-ports 目标端口
ubuntu保存
#若是第一次使用iptables
vim /etc/network/if-pre-up.d/iptables
#!/bin/bash
iptables-restore < /etc/iptables.rules
#保存后
iptables-save > /etc/iptables.rules
#之后保存只需
iptables-save > /etc/iptables.rules