iptables的基本使用
iptables
的基本使用方式如上图所示,上图包含了基础与扩展的使用方式.
iptables
: 用户空间的工具,写规则,并自动发往netfilter,立即生效;netfilter: 接收并生效规则;
iptables工具语法
规则与链的计数器:
- pkts:由规则或链所匹配到的报文的个数.
- bytes: 由规则或链匹配到的所有报文大小之和.
iptables [-t TABLE] SUBCOMMANDS chain CRETIRIA -j TARGET
#表
-t TABLES:
filter, nat, mangle, raw, security
可以省略,省略默认为filter
#链的管理规则
SUBCOMMANDS:
#链管理
-F: --flush [chain] ,清空规则链;
-N: --new-chain chain , 创建新的自定义规则链;
-X: --delete-chain [chain] , 删除用户自定义的空的规则链;
-Z: --zero [chain [rulenum]] , 置零,规则计数器置零;
-P: --policy chain target , 为指定链设置默认策略,对filter表来讲,默认规则为ACCEPT, DROP, REJECT;
-E: --rename-chain old-chain new-chain , 重命名自定义链;引用计数不为0的自定义链,无法改名,也无法删除;
#链规则管理
-A:--append chain rule-specification ,将新规则追加于指定链的尾部;
-I:--insert chain [rulenum] rule-specification ,将新规则插入至指定链的指定位置;
-D:--delete chain rulenum ,删除指定链上的指定规则;
有两种指定方式:
1. 指定匹配条件
2. 指定规则编号
-R: --replace chain rulenum rule-specification , 替换/修改指定链上的指定规则;
#查看
-L: list [chain] ,列出指定链上的指定规则
-n: numberic, 以数值格式显示地址和端口号;
-v: verbose, 显示详细信息;
-vv,-vvv
--line-numbers: 显示规则编号;
-x: exactly, 显示计数器计数的精确值;
-S: --list-rules [chain] , 打印所选链中的所有规则,以iptables命令方式打印;
#链
chain:
#默认
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
#指定匹配规则
CRETIRIA:
#基本匹配
[!] -s, --src, --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围;
[!] -d, --dst, --destination IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围;
[!] -p, --protocol {tcp|udp|icmp|icmpv6}: 检查报文中的协议,即ip首部中的protocols所标识的协议;
[!] -i, --in-interface IFACE: 数据报文的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上;
[!] -o, --out-interface IFACE:数据报文的流出接口;仅能用于FORWARD, OUTPUT及POSTROUTING链上;
#扩展匹配
-m, --macth macth_name --spec_options: 指定要使用的匹配项,即测试特定属性的扩展模块。
例如:-m tcp --dport 22
#隐式扩展:对-p protocol指明的协议进行的扩展,可以省略-m选项.
-p tcp
--dport PORT[-PORT]: 目标端口,可以是单个端口或者连续的多个端口;
--sport PORT[-PORT]: 源端口,可以是单个端口或者连续的多个端口;
--tcp-flags LIST1 LIST2: 检查LIST1所指明的所有标志位,且这其中LIST2表示的所有标记位必须为1,而余下的必须为0;没有LIST1中指明的,不作检查;
SYN, ACK, FIN, RST, PSH, URG
例如:--tcp-flags SYN,ACK,FIN,RST SYN 这个表示:syn.ack,rst,fin四个位要求syn必须是1
--syn: 表示是否新建的tcp请求
-p udp
--dport: PORT[-PORT]: 目标端口,可以是单个端口或者连续的多个端口;
--sport: PORT[-PORT]: 源端口,可以是单个端口或者连续的多个端口;
-p icmp
--icmp-type: 0:echo-reply, 8:echo-request
#显示扩展:必须使用-m选项指定使用的扩展;
#目标
-j TARGET:jump至指定的TARGET
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT: 端口重定向
LOG: 记录日志
MARK: 做防火墙标记
DNAT: 目标地址转换
SNAT: 源地址转换
MASQUERADE: 地址伪装
....
自定义链: 由自定义链上的规则进行匹配检查.
#链信息标注
[root@study3 ~]# iptables -L -n
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
目标 协议 选项 来源地址 目标地址 连接追踪状态
[root@template ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
385 30401 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
# pkts:由规则或链所匹配到的报文的个数.
# bytes: 由规则或链匹配到的所有报文大小之和.
# target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
# prot:表示规则对应的协议,是否只针对某些协议应用此规则。
# opt:表示规则对应的选项。
# in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
# out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
# source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
# destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。
iptables链操作示例
查看链信息
#查看filter链信息
[root@study02 ~]# iptables -L #不指定默认为filter链
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD_IN_ZONES (0 references) #references表示应用此表的数量
target prot opt source destination
#查看filter链详细信息
[root@study02 ~]# iptables -t filter -L -v
Chain INPUT (policy ACCEPT 401 packets, 23451 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 243 packets, 78008 bytes)
pkts bytes target prot opt in out source destination
增删改链
#删除自定义链
[root@study02 ~]# iptables -t filter -X #-X不加参数表示删除所有自定义链
[root@study02 ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#添加自定义链
[root@study02 ~]# iptables -t filter -N IN_public
[root@study02 ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain IN_public (0 references) #这是我们添加的自定义链,自定义的链会显示引用计数.
target prot opt source destination
#修改自定义链名字
#修改是需要注意的是,如果内部没有规则且没有被引用就可以更改链名
[root@study02 ~]# iptables -t filter -E IN_public OUT_public
[root@study02 ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain OUT_public (0 references) #修改后的链名
target prot opt source destination
修改链规则
#修改链的默认规则
[root@study02 ~]# iptables -F
[root@study02 ~]# iptables -X
[root@study02 ~]# iptables -t filter -P FORWARD DROP #修改链默认规则
[root@study02 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#删除某个链的规则
[root@study02 ~]# iptables -t filter -L --line-numbers
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
...
7 FORWARD_OUT_ZONES all -- anywhere anywhere
8 DROP all -- anywhere anywhere ctstate INVALID
9 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited #删除第9条规则
[root@study02 ~]# iptables -t filter -D FORWARD 9 #删除FORWARD链第9条规则
[root@study02 ~]# iptables -t filter -L --line-numbers
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
......
6 FORWARD_OUT_ZONES_SOURCE all -- anywhere anywhere
7 FORWARD_OUT_ZONES all -- anywhere anywhere
8 DROP all -- anywhere anywhere ctstate INVALID
增加基本链规则管理
#在INPUT链上添加一条规则,任何地址都能访问本机,本机IP:10.10.1.109
[root@study02 ~]# iptables -F #清空规则
[root@study02 ~]# iptables -X #清空自定义链
[root@study02 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp -j ACCEPT
[root@study1 ~]# iptables -t filter -L INPUT -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/24 10.10.1.109
# -s: 源地址,可以省略.
# -d: 目标地址
# -P: 报文类型
# -j: 目标类型
#在OUTPUT链添加一条规则,本机任何响应的TCP报文都放行,本机IP:10.10.1.109
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp -j ACCEPT
[root@study1 ~]# iptables -t filter -L OUTPUT -n
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 10.10.1.109 0.0.0.0/24
# -s: 源地址
# -d: 目标地址,可以省略.
# -P: 报文类型
# -j: 目标类型
#本机ssh报文匹配显示示例
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
263 16920 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
23 2488 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0
#修改filter链规则为DROP,测试以上规则是否会放行ssh
[root@study1 ~]# iptables -t filter -P INPUT DROP
[root@study1 ~]# iptables -t filter -P FORWARD DROP
[root@study1 ~]# iptables -t filter -P OUTPUT DROP
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
369 23176 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
83 7916 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0
# 只要是tcp类型的报文依然可以继续访问.
#但是在其他机器是无法ping通
[root@study02 ~]# ping 10.10.1.109 -c 3
PING 10.10.1.109 (10.10.1.109) 56(84) bytes of data.
--- 10.10.1.109 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms
- 放行ICMP协议
#放行icmp协议报文让其他机器可以ping通
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p icmp -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p icmp -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
845 51080 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109
0 0 ACCEPT icmp -- * * 0.0.0.0/0 10.10.1.109
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
335 29468 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0
0 0 ACCEPT icmp -- * * 10.10.1.109 0.0.0.0/0
#在其他机器上ping测试
[root@study02 ~]# ping 10.10.1.109 -c 3
PING 10.10.1.109 (10.10.1.109) 56(84) bytes of data.
64 bytes from 10.10.1.109: icmp_seq=1 ttl=64 time=0.231 ms
64 bytes from 10.10.1.109: icmp_seq=2 ttl=64 time=0.169 ms
64 bytes from 10.10.1.109: icmp_seq=3 ttl=64 time=0.161 ms
--- 10.10.1.109 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.161/0.187/0.231/0.031 ms
- 放行eth0接口报文流入流出
#查看规则序号
[root@study1 ~]# iptables -t filter -L --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- anywhere study1
2 ACCEPT icmp -- anywhere study1
Chain FORWARD (policy DROP)
num target prot opt source destination
Chain OUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- study1 anywhere
2 ACCEPT icmp -- study1 anywhere
#删除规则
[root@study1 ~]# iptables -t filter -D INPUT 2
[root@study1 ~]# iptables -t filter -D OUTPUT 2
#添加规则
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -i eth0 -j ACCEPT #-i表示流入
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -o eth0 -j ACCEPT #-o表示流出
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1727 107K ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109
0 0 ACCEPT all -- eth0 * 0.0.0.0/0 10.10.1.109
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
882 75676 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0
0 0 ACCEPT all -- * eth0 10.10.1.109 0.0.0.0/0
扩展匹配-链规则管理
扩展匹配所需要的扩展模块:/usr/lib64/xtables/
,大写的扩展模块是TARGET
;小写的模块可以做匹配条件.
#扩展匹配方式放行本机ssh服务报文,以插入的方式修改第一条规则
[root@study1 ~]# iptables -t filter -I INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp --dport 22 -j ACCEPT
[root@study1 ~]# iptables -t filter -I OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp --sport 22 -j ACCEPT
#INPUT放行规则是没有办法确定sport的端口所以可以省略sport
#OUTPUT放行规则是没有办法确定dport的端口所以可以省略dport
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
401 24896 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:22
2010 124K ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109
3 228 ACCEPT all -- eth0 * 0.0.0.0/0 10.10.1.109
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
51 4972 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:22
1232 112K ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0
4 304 ACCEPT all -- * eth0 10.10.1.109 0.0.0.0/0
#尝试放行httpd服务报文
# 1. study1的iptables规则
[root@study1 ~]# iptables -t filter -L INPUT -n -v
Chain INPUT (policy DROP 6 packets, 759 bytes)
pkts bytes target prot opt in out source destination
902 53044 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:22
7352 19M ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 #这条规则是允许任何地址访问本机
32 5974 ACCEPT all -- eth0 * 0.0.0.0/0 10.10.1.109
# 2.在其他机器测试httpd服务是否能访问
[root@study02 ~]# curl 10.10.1.109 -I #因此测试study2机器可以正常访问
HTTP/1.1 403 Forbidden
Date: Tue, 11 Feb 2020 10:28:46 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
# 3. 删除INPUT与OUTPUT第2,3 条规则尝试能否访问
[root@study1 ~]# iptables -t filter -D INPUT 2
[root@study1 ~]# iptables -t filter -D OUTPUT 2
[root@study1 ~]# iptables -t filter -L INPUT -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1056 62208 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:22
38 6736 ACCEPT all -- eth0 * 0.0.0.0/0 10.10.1.109
# 访问测试
[root@study02 ~]# curl 10.10.1.109 -I
curl: (7) Failed connect to 10.10.1.109:80; 连接超时
# 4. 使用扩展匹配放行httpd服务的报文
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp --dport 80 -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp --sport 80 -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1711 102K ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:80
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
888 95764 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:22
0 0 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:80
[root@study02 ~]# curl 10.10.1.109 -I
HTTP/1.1 403 Forbidden
Date: Tue, 11 Feb 2020 11:49:31 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
- 扩展匹配方式放行ICMP报文
#例如放行本机ICMP报文出去
# 1.本机ping 10.10.1.110主机
[root@study1 ~]# ping 10.10.1.110 -c 2
PING 10.10.1.110 (10.10.1.110) 56(84) bytes of data.
ping: sendmsg: 不允许的操作
ping: sendmsg: 不允许的操作
# 2.放行本机ICMP报文
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p icmp --icmp-type 0 -j ACCEPT
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2662 158K ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:22
32 3458 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:80
0 0 ACCEPT icmp -- * * 0.0.0.0/0 10.10.1.109 icmptype 0
[root@study1 ~]# iptables -t filter -L OUTPUT -n -v
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1271 130K ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:22
30 8366 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:80
0 0 ACCEPT icmp -- * * 10.10.1.109 0.0.0.0/0 icmptype 8
# 3.本机ping测试
[root@study1 ~]# ping -c 3 10.10.1.110
PING 10.10.1.110 (10.10.1.110) 56(84) bytes of data.
64 bytes from 10.10.1.110: icmp_seq=1 ttl=64 time=0.235 ms
64 bytes from 10.10.1.110: icmp_seq=2 ttl=64 time=0.169 ms
64 bytes from 10.10.1.110: icmp_seq=3 ttl=64 time=0.200 ms
--- 10.10.1.110 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.169/0.201/0.235/0.029 ms
# 4.其他机器ping本机
[root@template ~]# ping 10.10.1.109
PING 10.10.1.109 (10.10.1.109) 56(84) bytes of data.
^C
--- 10.10.1.109 ping statistics ---
30 packets transmitted, 0 received, 100% packet loss, time 28999ms
# 5.放行本机icmp报文出去
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p icmp --icmp-type 8 -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT
[root@study3 ~]# ping -c3 10.10.1.109
PING 10.10.1.109 (10.10.1.109) 56(84) bytes of data.
64 bytes from 10.10.1.109: icmp_seq=1 ttl=64 time=0.185 ms
64 bytes from 10.10.1.109: icmp_seq=2 ttl=64 time=0.178 ms
64 bytes from 10.10.1.109: icmp_seq=3 ttl=64 time=0.156 ms
--- 10.10.1.109 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.156/0.173/0.185/0.012 ms
#此时双方的主机都能ping通
- ICMP报文类型
版权属于:龙之介大人
本文链接:https://i7dom.cn/229/2020/11/iptables2.html
本站所有原创文章采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 您可以自由的转载和修改,但请务必注明文章来源和作者署名并说明文章非原创且不可用于商业目的。