Linux防火墙基础
Iptables的规则表、链结构
1.规则表(iptables管理4个不同的规则表,其功能由独立的内核模块实现)
filter表:包含三个链 INPUT OUTPUT FORWARD
nat表: PREROUTING POSTROTING OUTPUT
mangle表: PREROUTING POSTROUTING INPUT OUTPUT FORWARD
raw表: OUTPUT PREROUTING
2.规则链
INPUT链 当收到访问防火墙本机的数据包(入站)时,应用此链中的规则
OUTPUT链 当防火墙本机向外发送数据包(出站)时,应用此链中的规则
FORWARD链 收到需要通过防火墙发送给其他地址的数据包,应用此链
PREROUTING链 做路由选择之前,应用此链
POSTROUTING链 对数据包做路由选择之后,应用此链中的规则
数据包的匹配流程
1.规则表之间的优先级
raw mangle nat filter
2.规则链之间的优先级
入站数据流向: 来自外界的数据包到达防火墙,首先呗PREROUTING规则链处理(是否被修改地址),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机,那么内核将其传递给INPUT链进行处理,通过以后再交给上次的应用程序进行响应
转发数据流向: 来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后进行路由选择,如果数据包的目标地址是其他外部地址,则内核将其传递给FPRWARD链进行处理,然后再交给POSTROUTIING规则链(是否修改数据包的地址等)进行处理。
出站数据流向: 防火墙本身向外部地址发送数据包,首先被OUTPUT规则链处理,之后进行路由选择,然后交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
3.规则链内部各防火墙规则之间的优先顺序
依次按第1条规则、第2条规则、第3条规则……的顺序进行处理,找到一条能够匹配的数据包规则,则不再继续检查后面的规则(使用LOG记录日志的规则例外)。如果找不到匹配规则,就按照规则链的默认策略进行处理
管理和设置iptables规则
Iptables的基本语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
管理iptables规则
Iptables命令的管理控制项
选项名 |
功能及特点 |
|
-A |
在指定链的末尾添加(--append)一条新规则 |
|
-D |
删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则 |
|
-I |
在指定链中插入一条新规则,若未指定插入位置,则默认在链的开头插入 |
|
-R |
修改、替换指定链中的一条规则,按按规则序号或内容确定要替换的规则 |
|
-L |
列出指定链中所有的规则进行查看,若未指定链名,则列出表中所有链的内容 |
|
-F |
清空指定链中的所有规则,若未指定链名,则清空表中所有链的内容 |
|
-N |
新建一条用户自定义的规则链 |
|
-X |
删除表中用户自定义的规则链 |
|
-P |
设置指定链的默认策略(大p) |
|
-n |
使用数字形式显示输出结果,如显示主机的IP地址而不是主机名 |
|
-v |
查看规则列表时显示详细的信息 |
|
-V |
查看iptables命令工具的版本信息 |
|
-h |
查看命令帮助信息 |
|
--line-numbers |
查看规则列表时,同时显示规则在链中的顺序号 |
1.添加及输入规则
# iptables -t filter -A INPUT -p tcp -j ACCEPT //在filter表的INPUT链的末尾添加一条防火墙规则
# iptables -I INPUT -p udp -j ACCEPT //在filter表的INPUT链中插入一条防火墙规则(省略 –t filter,按默认处理filter表)
# iptables -I INPUT 2 -p icmp -j ACCEPT //在filter表的INPUT链中插入一条防火墙规则,作为链中的第二条规则
2.查看规则表
# iptables -L INPUT - -line-numbers //查看filter表中INPUT链中的所有规则,同时显示各条规则的顺序号
# iptables -nvL //-L选项放在最后,否则会将vn当成链名。查看filter表各链中所有规则的详细信息,同时以数字形式显示地址和端口号
3.删除、清空规则
# iptables -D INPUT 2 //删除filter表INPUT链中的第二条规则
# iptables -F //不指定表名时,默认情况filter表
# iptables -t nat -F //清空nat表中各链的所有规则
# iptables -t mangle -F //清空mangle表中各链的所有规则
4.设置规则链的默认策略
# iptables -t filter -P FORWARD DROP //将filter表中FORWARD规则的默认策略设为DROP
# iptables -P OUTPUT ACCEPT //将filter表中OUTPUT规则的默认策略设为ACCEPT
5. 获得iptables相关选项的帮助信息
# iptables -p icmp -h //查看iptables命令中关于icmp协议的帮助信息
6.新增、删除自定义规则链
# iptables -t raw -N TCP_PACKETS //在raw表中新增一条自定义的规则链,链名为TCP_PACKETS
# iptables -t raw -X //清空raw表中用户自定义的所有规则链
条件匹配
1.通用(general)条件匹配(直接使用,而不依赖于其他的条件匹配及其扩展)
协议匹配(允许使用的协议名包含在/etc/protocols文件中)
# iptables -I INPUT -p icmp REJECT //拒绝进入防火墙的所有icmp数据包
# iptables -I FORWARD -p ! icmp -j ACCEPT //允许防火墙转发icmp协议以外的所有数据包(叹号表示取反)
地址匹配
拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0./24网段的数据
# iptables -A FORWARD -s 192.168.1.11 -j REJECT
# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
网络接口匹配
丢弃从外网接口eth1进入防火墙本机的源地址为私网地址的数据
# iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
# iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
管理员在网关服务器上检测到来自某个IP网段(如10.10.30.0./24)的频繁扫描,希望设置iptables规则封堵IP地址段,两个小时后解封
# iptables -I INPUT -s 10.20.30.0/24 -j DROP //设置封堵策略
# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
# at now +2 hours
at> iptables -D INPUT 1
at>iptables -D FORWAD 1
at> <EOT>
job 5 at 2020-09-26 19:15
2. 隐含(implicit)条件匹配(需要指定的协议匹配为前提,其对应的功能由iptables自动(隐含)的装载入内核)
端口匹配
仅允许系统管理员从202.13.0.0/16网段使用SSH方式远程登录防火墙主机
# iptables -A INPUT -p tcp - -dport 22 -s 202.13.0.0/16 -j ACCEPT
# iptables -A INPUT -p tcp - -dport 22 -j DROP
允许本机开放从TCP端口20~1024提供的应用服务
# iptables -A INPUT -P tcp - -dport 20:1024 -j ACCEPT
# iptables -A OUTPUT -p tcp - -sport 20:1024 -j ACCEPT
作为网关使用时,允许转发来自192.168.0.0/24局域网的DNS解析请求数据包
# iptables -A FORWARD -p udp -s 192.168.0.0/24 - -dport 53 -j ACCEPT
# ipatbles -A FORWARD -p udp -d 192.168.0.0./24 - -sport 53 -j ACCEPT
TCP标记匹配
拒绝从外网接口eth1直接访问防火墙本机的数据包,但是允许相应防火墙TCP请求的数据包进入
# iptables -P INPUT DROP
# iptables -I INPUT -i eth1 -p tcp - -tcp-flags SYN,RST,ACK SYN -j ACCEPT
# iptables -I INPUT -i eth1 -p tcp - -tcp-flags ! - -syn -j ACCEPT
ICMP类型匹配
禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机(允许接受ICMP回应数据)
# iptables -A INPUT -p icmp - -icmp-type Echo-Request -j DROP
# iptables -A INPUT -p icmp - -icmp-type Echo-Replay -j ACCEPT
# iptables -A INPUT -p icmp - -icmp-type destination-Unreachable -j ACCEPT
Echo-Request数字代码为8 请求
Echo-Replay数字代码为0 回显
destination-Unreachable 3 目标不可达
3.显示(explicit)条件匹配(由额外的内核模块提供,因此需要手工指定匹配方式)
lsmod 命令查看内核模块
MAC地址匹配(主要用于检查数据包的源MAC地址)
禁止转发来自MAC地址为00:0C:29:27:55:3F的主机数据包
# iptables -A FORWARD -m mac - -mac-source 00:0C:29:27:55:3F -j DROP
多端口匹配(检查数据包的源端口、目标端口时,用于匹配多个不连续的端口号)
允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250~1280
# iptables -A INPUT -p tcp -m multiport - -dport 20,21,25,110,1250:1280 -j ACCEPT
多IP地址匹配
禁止转发IP地址为192.168.1.20~192.168.1.99 的TCP的数据包
# iptables -A FORWARD -p tcp -m iprange - -src-range 192.168.1.20-192.168.1.99 -j DROP
状态匹配
禁止转发与正常TCP连接无关的非 - -syn请求数据包
# iptables -A FORWARD -m state - -state NEW -p tcp ! - -syn -j DROP
拒绝访问防火墙的新数据包,但允许响应或与已有连接相关的数据包
# iptables -A INPUT -p tcp -m state - -state NEW -j DROP
# iptables -A INPUT -p tcp -m state - -state ESTABLISHED,RELATED -j ACCEPT
NEW :与任何连接无关的
ESTABLISHED :响应请求或已经建立的连接
RELATED :与已有连接有相关性
数据包控制
ACCEPT :允许数据包通过
DROP :直接丢弃数据包,不给出任何回应信息
REJECT :拒绝数据包通过,必要时会给数据发送一个响应信息
LOG :在/var/log/messange文件中记录日志信息,然后将数据包传递给下一条规则
对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止其访问
# iptables -I INPUT -p tcp - -dport 22 -j DROP
# iptables -I INPUT -P tcp - -dport 22 -j LOG
将记录日志的频率限制为平均三次/分钟 ,允许的峰值为八次
# iptables -R INPUT 1 -p tcp - -dport 22 -m limit - -limit 3/minite - -limit-burst 8 -j LOG
用户自定义链 :将数据包传递给用户自定义的链进行处理
自定义一个新的链MyLAN1,转发自/至192.168.1.0/24网段的数据包均交给该链中的规则处理
# iptables -t filter -N MyLAN1
# iptables -A FORWARD -s 192.168.1.0/24 -j MyLAN1
# iptables -A FORWARD -d 192.168.10./24 -j MyLAN1
# iptables -A MyLAN1 -p icmp DROP
SNAT :修改数据包的源IP地址
DNAT :修改数据包的目标IP地址
使用防火墙脚本
导出、导入防火墙规则
1.iptables-save //把当前设置的防火墙规则信息输出到终端 将当前调试好的iptables规则保存到配置文件,并通过iptables服务脚本自动加载
# iptables-save > /etc/sysconfig/iptables 或 service iptables save
# service iptables restart
# chkconfig - -level 35 iptables on
2.iptalbes-restore
从已保存的配置文件中导入iptables规则
# iptables-retore < /etc/sysconfig/iptables
编写防火墙脚本
1. 设置网段、网卡、IP地址等变量
2.加载包过滤相关的内核模块
3.开启路由转发功能
4.用户设置的iptables规则