小阿轩yx-iptables 防火墙
Linux 防火墙基础
体系主要工作在
- 网络层
- 针对TCP/IP 数据包实施过滤和限制
属于典型的包过滤防火墙(或者称为网络层防火墙)
体系基于内核编码实现
好处
- 具有非常稳定的性能
- 高效率
防火墙两个表示
- netfilter
- iptables
区别
- netfilter:指的是 Linux 内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(Kernel Space,又称为内核空间)的防火墙功能体系
- iptables:指的是用来管理 Linux 防火墙的命令程序,通常位于/sbin/iptables 目录下,属于“用户态”(User Space,又称为用户空间)的防火墙管理体系
iptables 的表、链结构
- 每个规则“表”相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表
- 在每个“表”容器内包括不同的规则“链”,根据处理数据包的不同时机划分为五种链
- 而决定是否过滤或处理数据包的各种规则,则是按先后顺序存放在各规则链中
作用
- 为包过滤机制的实现提供规则(或称为策略)
- 通过不同的规则告诉 netfilter 对来自某些源、前往某些目的或具有某些协议特征的数据包应该如何处理
规则表
四个不同规则表的名称、包含的链以及用途
- filter 表:filter 表用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。
- filter 表对应的内核模块为 iptable_filter,表内包含三个链,即 INPUT、FORWARD、 OUTPUT。
- nat 表:nat(Network Address Translation,网络地址转换)表主要用来修改数据包的 IP 地址、端口号等信息。nat 表对应的内核模块为 iptable_nat,表内包含三个链,即 PREROUTING、POSTROUTING、OUTPUT。
- mangle 表:mangle 表用来修改数据包的 TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期),或者为数据包设置 Mark 标记,以实现流量整形、策略路由等高级应用 。mangle 表 对 应 的 内 核 模 块 为 iptable_mangle , 表 内 包 含 五 个 链 , 即 PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。
- raw 表:raw 表是自 1.2.9 以后版本的 iptables 新增的表,主要用来决定是否对数据包进行状态跟踪。raw 表对应的内核模块为 iptable_raw,表内包含两个链,即 OUTPUT、 PREROUTING
(注:mangle表和raw表应用较少)
规则链
五种不同的规则链名称、各自的介入时机
- INPUT 链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则
- OUTPUT 链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则
- FORWARD 链:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则
- PREROUTING 链:在对数据包做路由选择之前,应用此链中的规则
- POSTROUTING 链:在对数据包做路由选择之后,应用此链中的规则
(注:“主机型防火墙”要用的链
- INPUT
- FORWARD
针对服务器本机进行保护
“网络型防火墙”要用的链
- FORWARD
- PREROUTING
- POSTROUTING
如使用 Linux 防火墙作为网关服务器,在公司内网与 Internet 之间进行安全控制)
数据包过滤的匹配流程
iptables 管理着四个默认表和五种链,各种防火墙规则依次存放在链中
规则表之间的顺序
raw表→mangle表→nat表→filter表
规则链之间的顺序
- 入站数据流向:来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处);如果数据包的目标地址是防火墙本机(如 Internet 用户访问网关的 Web 服务端口),那么内核将其传递给 INPUT 链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如 httpd 服务器)进行响应。
- 转发数据流向:来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理,然后再进行路由选择;如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问 QQ 服务器),则内核将其传递给 FORWARD 链进行处理(允许转发或拦截、丢弃),最后交给 POSTROUTING 链(是否修改数据包的地址等)进行处理。
- 出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS 服务时),首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,最后再交给 POSTROUTING 链(是否修改数据包的地址等)进行处理
规则链内部各条防火墙规则之间的顺序
数据包经过每条规则链时依次按以下顺序进行匹配和处理
- 第一条规则
- 第二条规则
- ……
过滤遵循的原则
- 匹配即停止
编写防火墙规则
iptables 的安装
CentOS 7.3 默认使用 firewalld 防火墙,使用 iptables 防火墙,必须先关闭firewalld 防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
yum 安装 iptables
[root@localhost ~]# yum -y install iptables
启动 iptables 防火墙并设置开机启动
[root@localhost ~]# systemctl start iptables
[root@localhost ~]# systemctl enable iptables
在filter表的input链中插入一条规则,拒绝发给本机的使用ICMP协议的数据包
(注:-I:插入一条规则,要指定在哪一行插入,不指定默认第一行REJECT:拒绝)
[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j REJECT
删除此规则
# -D:删除
iptables -t filter -D INPUT -p icmp -j REJECT
添加、查看、删除规则等基本操作
添加新的规则
在filter表INPUT链的末尾添加一条防火墙规则
\\允许tcp的数据包通过
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT
(注:
- -A:在末尾追加
- -I:在开头添加
- ACCEPT:允许)
在filter表INPUT链的添加两条规则,分别位于第一条和第二条(指定位置:-I,大写i)
\\允许udp数据包通过,放到第一条
[root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT
\\允许icmp数据包通过,放到第二条
[root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
查看规则列表
查看filter表INPUT链中的所有规则,并显示规则序号(列出所有规则:-L)
[root@localhost ~]# iptables -L INPUT --line-numbers
或
[root@localhost ~]# iptables -L INPUT --line # --line:显示行号
以数字形式查看filter表INPUT链中的所有规则(数字形式显示:-n))
[root@localhost ~]# iptables -n -L INPUT
或
[root@localhost ~]# iptables -nL INPUT
[root@localhost ~]# iptables -nL INPUT -t filter --line
删除、清空规则
删除filter表INPUT链中的第三条规则
[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -nL INPUT --line
清空指定链或表中的所有防火墙规则,使用管理选项“-F”
清空filter表INPUT链中所有的规则
[root@localhost ~]# iptables -F INPUT
[root@localhost ~]# iptables -nL INPUT --line
分别清空filter表,nat表,mangle表中所有链的规则
\\等同iptables -t filter -F
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# iptables -t mangle -F
设置默认策略
(找不到匹配项时,就是用该默认规则)
\\找不到转发规则,丢弃
[root@localhost ~]# iptables -t filter -P FORWARD DROP
\\出站数据包找不到规则,允许通过
[root@localhost ~]# iptables -t filter -P OUTPUT ACCEPT
规则的匹配条件
通用匹配
常规匹配(包括协议、地址、网络接口)可独立使用
协议匹配
\\丢弃icmp包
[root@localhost ~]# iptables -I INPUT -p icmp -j DROP
\\允许转发除icmp之外的其他包
[root@localhost ~]# iptables -A FORWARD ! -p icmp -j ACCEPT
地址匹配
[root@localhost ~]# iptables -A FORWARD -s 192.168.10.202 -j REJECT
[root@localhost ~]# iptables -A FORWARD -s 192.168.10.0 -j ACCEPT
当遇到小规模的网络攻击或扫描时,应封锁IP地址
[root@localhost ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[root@localhost ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
网络接口匹配
要丢弃从外网卡接口(eth1)访问防火墙本机且源地址为私有地址的数据包
[root@localhost ~]# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
[root@localhost ~]# iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
[root@localhost ~]# iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
隐含匹配
要以协议匹配作为前提条件,不可独立使用(带有子条件)
端口匹配
允许为网段192.168.4.0/24转发DNS查询数据包
[root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
(注:隐含匹配需要有一个匹配的前提条件,这个前提条件就是隐含要匹配的内容。上面案例中“ -p udp --dport”就是隐含的子条件,意思是,只匹配一个端口号还不行,还要指定这个端口号是UDP的端口号,并且是目标端口号)
搭建vsftpd服务时需要开放20、21端口,以及用于被动模式的端口范围为24500-24600
[root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
ICMP 类型匹配
若要禁止从其他主机ping本机,但是允许本机ping其他主机 iptables -F
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp -j DROP
查看icmp协议类型的帮助信息
[root@localhost ~]# iptables -p icmp -h
显式匹配
多端口匹配(multiport用于多端口)
# 允许本机开放25、80、110、143端口,以提供电子邮件服务
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
IP范围匹配(iprange用于ip范围)
# 禁止转发源IP地址位于192.168.4.21-192.168.4.28之间的TCP数据包
[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
MAC地址匹配
# 根据MAC地址封锁主机,禁止其访问本机的任何应用
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0C:29:C9:3D:F7 -j DROP
状态匹配
# 要禁止转发与正常TCP连接无关的非"--syn"请求的数据包,如伪造的网络攻击数据包
[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
只开放本机的WEB服务(80端口),但对发给本机的TCP应答数据包予以放行,其他入站数据包均丢弃,对应的入站规则为(ESTABLISHED:已建立的)
[root@localhost ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
基本语法、数据包控制类型
使用 iptables 命令管理、编写防火墙规则时,基本的命令格式
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
(注:表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter 表;管理选项表示 iptables 规则的操作方式)
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包,不给出任何回应信息
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息
- LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
(注:防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助动作,并没有真正处理数据包)
规则的匹配条件设置
(注:有决定性作用,避免防火墙误杀)
- 清晰
- 准确
同一条防火墙规则
- 可指定多个匹配条件
- 条件必须都满足规则才会生效
匹配条件设置包括三大类
- 通用匹配
- 隐含匹配
- 显式匹配
通用匹配
也称为常规匹配
好处
- 可以独立使用
- 不依赖于其它条件或扩展模块
常见的通用匹配包括
- 协议匹配
- 地址匹配
- 网络接口
协议匹配
- 使用 -p 协议名形式指定,用来检查数据包所使用的网路协议(--protocol)
地址匹配
使用 -s 源地址或 -d 目标地址形式指定,用来检查数据包的源地址(--source)或目标地址(--destination)
可以接受的有
(注:不建议使用主机名、域名地址(解析过程会硬性效率))
- IP地址
- 网段地址
网路接口匹配
使用 -i 接口和 -o 接口的形式,用来检查数据包从防火墙的哪一个接口进入或发出
分别对应
- 入站网卡(--in-interface)
- 出站网卡(--out-interface)
隐含匹配
- 要以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用
- 其对应的功能由 iptables 在需要时自动(隐含)载入内核
常见的隐含匹配包括
- 端口匹配
- TCP 标记匹配
- ICMP 类型匹配
端口匹配
使用
- --sport 源端口
- --dport 目标端口形式
协议
- TCP或UDP,用来检查数据包的源端口(--source-port)或目标端口(--destination-port)
- 单个端口号或者以冒号“:”分隔的端口范围都是可以接受的
(注:不连续的多个端口不能采用这种方式)
ICMP类型匹配
- 0 响应应答(ECHO-REPLY)(应答报文)
- 3 不可到达 (目标主机不可达)
- 4 源抑制
- 5 重定向
- 8 响应请求(ECHO-REQUEST)(请求报文)
- 11 超时
- 12 参数失灵
- 13 时间戳请求
- 14 时间戳应答
- 15 信息请求(*已作废)
- 16 信息应答(*已作废)
- 17 地址掩码请求
- 18 地址掩码应答
使用 --icmp-type ICMP 类型的形式
针对协议为
- ICMP,用来检查 ICMP 数据包的类型(--icmp-type)
ICMP 类型表示使用
- 字符串
- 数字代码
显式匹配
- 要求有额外的内核模块提供支持
- 必须手动以“-m 模块名称”的形式调用相应的模块方可设置匹配条件
添加带显式匹配条件的规则以后查看相关的内核扩展模块
lsmod | grep xt_
- 多端口匹配
- IP 范围匹配
- MAC 地址匹配
- 状态匹配
多端口匹配
(注:多个端口之间以逗号进行分隔)
- “-m multiport --dports 端口列表”
- “-m multiport --sports 端口列表”
- 源端口
- 目标端口
IP 范围匹配
(注:其中 IP 范围采用“起始地址-结束地址” 的形式表示)
- “-m iprange --src-range IP 范围”
- “-m iprange --dst-range IP 范围”
- 源地址
- 目标地址
MAC 地址匹配
(注:由于 MAC 地址本身的局限性,此类匹配条件一般只适用于内部网络)
- “-m mac --mac-source MAC 地址”
- 源 MAC 地址
状态匹配
- “-m state --state 连接状态”
基于 iptables 的状态跟踪机制用来检查数据包的连接状态(State)
常见的连接状态包括
- NEW(与任何连接无关的)
- ESTABLISHED(响应请求或者已建立连接的)
- RELATED(与已有连接有相关性的
小阿轩yx-iptables 防火墙