前言
iptables详解跳转blog:iptables介绍
iptables管理和规则跳转blog:piptables管理和规则
iptables文档:iptables(8) - Linux man page
iptables指南:iptables-tutorial
防火墙常用策略
拒绝进入防火墙的所有ICMP协议数据包w
1 | iptables -I INPUT -p icmp -j REJECT |
-I : 在指定链中插入一条规则,默认第一行, INPUT链:进入防火墙的必经之链, -p 选择协议 -j 对数据包执行的操作
允许防火墙转发除ICMP协议以外的所有数据包
1 | iptables -A FORWARD -p !icmp -j ACCEPT |
-A:在指定链的末尾添加(append)一条新的规则
拒绝转发来自192.168.1.10主机的数据。允许转发来自192.168.0.0/24网段的数据
1 | iptables -A FORWARD -s 192.168.1.10 -j REJECT |
1 | iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT |
⚠️注意要把拒绝的放在前面,不然无法起作用。
丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
1 | iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP |
私网地址范围
A类地址:10.0.0.0~10.255.255.255.
B类地址:172.16.0.0 ~172.31.255.255.
C类地址:192.168.0.0~192.168.255.255.
只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。
1 | iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT |
1 | iptables -A INPUT -p tcp --dport 22 -j DROP |
SSH使用的传输层协议是TCP
SSH服务开放22端口,-dport num
匹配目标端口号
允许本机开放从TCP端口20-1024提供的应用服务
1 | iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT |
1 | iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT |
端口范围的表示方式:20-1024的表示方式,20:1024
允许开放这个范围的服务,流量不止要能进来,还要进来之后能顺利流出。所以还要制定OUTPUT链的规则。
允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包
1 | iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT |
1 | iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT |
转发这一网段的请求,也是要求能够有进有出。 -d
和 --sport
总是成对出现
DNS解析,使用的传输层协议是UDP
DNS服务开放端口号是53号端口
扩展模块
扩展模块相关内容,章节10中详细介绍了。
比较常用的扩展:
Iptables -m参数
用法:
1 -m 模块关键字扩展模块:
iprange:可以指定一段连续的IP地址范围,用于匹配报文的源地址或目的地址
--src-range
匹配报文的源地址所在范围
--dst-range
匹配报文的目标地址所在范围
1 iptables -t filter -I INPUT -m iprange --src-range 192.168.1.15-192.168.1.149 -j REJECTstring:可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。
如:如果报文中包含字符“hello”,就丢弃当前报文
1 iptables -t filter -I INPUT -m string --algo bm --string "hello" -j REJECT
-m string
表示使用string模块,--algo bm
表示使用bm算法去匹配指定的字符串,--string "OOXX"
则表示我们想要匹配的字符串为”hello”time: 根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。
比如:每天早上9点到下午6点不能看网页
1 iptables -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机
1 | iptables -I INPUT -p icmp --icmp-type 8/0 -j REJECT |
或者
1 | iptables -I INPUT -p icmp --icmp-type "echo-request" -j REJECT |
ping 使用的网络层协议是icmp
流量要一开始就被及时制止,所以用-I
参数,将规则添加到第一行
Icmp扩展匹配条件:
icmp协议类型有很多种,都有对应的type码,每种type码又有对应的code。通常使用
type/code
去匹配具体类型的ICMP报文。使用--icmp-type
表示根据具体的type与code去匹配对应的icmp报文。-m icmp
表示使用icmp扩展。如果已经使用了-p icmp
则可以省略-m icmp
比如
--icmp-type 8/0
表示只有ping请求类型的报文才能被匹配到。也就是说别人对我们发起的ping请求将会被拒绝通过防火墙,而我们可以ping通别人。因为别人回应我们的报文icmp type 为0,code也为0。除了用type code的数字表示,也可以使用文字的描述。直接填写description中的内容表述就可以了。比如
--icmp-type 8/0
可以用以下的方式表示。空格用-
表示
1 --icmp-type "echo-request"
还有udp的扩展:
udp扩展,使用
-sport
和-dport
来匹配UDP协议报文的源端口与目的端口。比如放行samba服务的137与138两个UDP端口。
1 iptables -I INPUT -p udp --dport 137 -j ACCEPT
1 iptables -I INPUT -p udp --dport 138 -j ACCEPT
禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包
1 | iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP |
在文档里匹配mac,找到想要的内容
![Screen Shot 2022-07-19 at 11.30.30](/Users/gryffinbit/Desktop/Screen Shot 2022-07-19 at 11.30.30.png)
允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
1 | iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT |
在文档里匹配TCP,找到想要的内容,其中在dport选项里提到了multiport,于是再去找multiport的扩展匹配
![Screen Shot 2022-07-19 at 11.45.44](/Users/gryffinbit/Desktop/Screen Shot 2022-07-19 at 11.45.44.png)
multiport扩展
![Screen Shot 2022-07-19 at 11.50.51](/Users/gryffinbit/Desktop/Screen Shot 2022-07-19 at 11.50.51.png)
禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包
1 | iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP |
![Screen Shot 2022-07-19 at 14.21.48](/Users/gryffinbit/Desktop/Screen Shot 2022-07-19 at 14.21.48.png)
禁止转发与正常TCP连接无关的非—syn请求数据包
1 | iptables -A FORWARD -m state --state NEW -p tcp !--syn -j DROP |
这里涉及了数据包的连接状态。-m state
表示数据包的连接状态,NEW
表示每次新的连接开始时.
状态参数要放在前面。在选择协议的前面。
连接状态相关的扩展匹配文档
NEW means that the packet has or will start a new connection, or that it is associated with a connection that has not seen packets in both directions.
文档中,查找和syn相关的扩展匹配内容
拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
1 | iptables -A INPUT -p tcp -m state --state NEW -j DROP |
1 | iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT |
这个也是和连接相关的。新数据包就是NEW新的连接。而已有连接相关的数据包,包括已经建立连接了ESTABLISHED的和新旧连接都有关系的RELATED。
NEW means that the packet has or will start a new connection, or that it is associated with a connection that has not seen packets in both directions.
ESTABLISHED means that the packet is part of an already established connection that has seen packets in both directions and is fully valid.
RELATED means that the packet is starting a new connection and is associated with an already established connection.
只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理
1 | iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT |
1 | iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT |
1 | iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT |
1 | iptables -P INPUT DROP |
FTP是使用tcp来传输的,所以-p
的协议选用是tcp