三、规则的匹配
3.1 通用匹配
可直接使用,不依赖其他条件或扩展包括网络协议、IP地址、网络接口等条件
协议匹配 |
-p 协议名 |
地址匹配 |
-s 源地址、-d目的地址 #可以是IP、网段、域名、空(任何地址) |
接口匹配 |
-i 入站网卡、-o 出站网卡 |
iptables -A FORWARD ! -p icmp -j ACCEPT #没有-t指定表,就是指默认表filter表 #!代表条件取反,不是ICMP的都放通 iptables -A INPUT -s 192.168.109.132 -j DROP #拒绝从哪个主机发数据包过来 iptables -I INPUT -i ens33 -s 192.168.109.0/24 -j DROP #在行首插入 禁止该网段从ens33网卡进来
案例1
案例2
3.2 隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件
3.2.1 端口匹配
--sport 源端口 --dport 目的端口
可以是个别端口、端口范围 |
|
--sport 1000 |
匹配源端口是1000的数据包 |
--sport 1000:3000 |
匹配源端口是1000-3000的数据包 |
--sport :3000 |
匹配源端口是3000及以下的数据包 |
--sport 1000: |
匹配源端口是1000及以上的数据包 |
注意:--sport和--dport必须配合-p <协议类型> 使用 |
3.2.2 TCP标记匹配
--tcp-flags TCP标记
#丢弃SYN请求包,放行其他包 # SYN,RST,ACK SYN 前面三个包逗号,然后空格跟一个,表明前面的三个里面除了这空格后面的SYN,其他都放行 [root@localhost ~]# iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT [root@localhost ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x16/0x02 DROP all -- 192.168.109.132 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:20:21 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
3.2.3 ICMP类型匹配
--icmp-type ICMP类型
可以是字符串、数字代码
Echo-Request(代码为8) |
请求 |
Echo-Reply (代码为0) |
回显 |
Destination-Unreachable(代码为3) |
目标不可达 |
其他可用的icmp协议类型,可以执行iptables -p icmp -h 查看帮助信息 |
Request--(ping)
Reply --(pong)
有点类似乒乓,一个请求一个回显
iptables -A INPUT -p icmp -j DROP #增加了此条规则不仅别人ping不通自己,自己也ping不通别人,这是因为回复回不来,数据有ping和pong一来一回,ping出去了,pong不回来,被防火墙拦截了 #如果我们想要双标,别人ping不通自己,但是自己也能ing通别人,怎么操作呢
3.3 显示匹配
要求以"-m扩展模块"的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
多端口匹配:
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
#m扩展模块可以一次指定多个端口,不必一条条写了 [root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT [root@localhost ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,22,21,20,53 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
IP范围匹配:
-m iprange --src-range 源IP范围
-m iprange --dst-range 目的IP范围
#禁止转发源地址位于192.168.109.100-192.168.109.200的udp数据包 [root@localhost ~]# iptables -A FORWARD -p udp -m iprange --src-range 192.168.109.100-192.168.109.200 -j DROP [root@localhost ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,22,21,20,53 Chain FORWARD (policy ACCEPT) target prot opt source destination DROP udp -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.109.100-192.168.109.200 Chain OUTPUT (policy ACCEPT) target prot opt source destination
MAC地址匹配: (用的不多)
-m mac --mac-source 源MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:Xx:xx:xx -j DROP #禁止来自某MAC地址的数据包通过本机转发
状态匹配:
-m state --state连接状态
常见的连接状态:
NEW |
主机连接目标主机,在目标主机上看到的第一个想要连接的包 |
ESTABLISHED |
主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态 |
RELATED |
主机已与目标主机进行通信,目标主机发起新的链接方式,一般与ESTABLISHED配合使用 |
INVALID |
无效的封包,例如数据破损的封包状态 |
iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT #第一个包我只看22端口的包 #-p tcp是隐含匹配,可以省略-m tcp iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT #允许放通tcp的这些端口号 #-m multiport加载多个端口模块 iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT iptables -A INPUT -p tcp -m state --state ESTABLISHED ,RELATED -j ACCEPT #表示与上述连接相关的数据我都放通 iptables -P INPUT DROP #默认关闭,将以上的设置设为白名单
总结
Linux防火墙系统
组成 内核态 netilter(保存包过滤处理的规则集);用户态 iptables(防火墙规则管理工具)
四表
raw 对数据包进行状态跟踪
mangle 修改数据包内容,给数据包设置标记
nat 地址转换,转换源/目的IP或者端口
fileter 过滤数据包 放行 丢弃
五链
INPUT 入站
OUTPUT 出站
FORWARD 转发
PREROUTING 路由前修改目的地址
POSTROUTING 路由后修改源IP
链中的规则集:从上往下一次匹配,匹配到规则即停止,若都没有匹配到则按默认策略处理
iptables -t 表 -A 在末尾添加 -j 控制类型
-I 在前面插入
-D 删除
-F 清空
-R 改
-nL 查
-P 设置默认规则
匹配条件
-p tcp|udp|icmp
-s 源IP
-d 目的IP
-i 入站网卡
-o 出站网卡
数据包通信要素
四要素 |
五要素 |
源IP 目的IP |
+协议 UDP/TCP |
源端口 目的端口 |