文章目录
- 一、Linux防火墙基础
- 1.1 Linux包过滤防火墙概述
- 1.2 iptables的表链结构
- 1.3 数据包控制的匹配流程
- 二、编写防火墙规则
- 2.1 iptables安装
- 2.2 基本语法、控制类型
- iptables的基本语法
- 数据包的常见控制类型
- 2.3 iptables的管理选项
- **添加新的规则**
- **查看规则列表**
- **删除、清空规则**
- **设置默认策略**
- **常用管理选项汇总**
- 2.4 规则的匹配条件
- 三、SNAT策略及应用
- 3.1 SNAT策略概述
- 四、DNAT策略及应用
- 4.1 DNAT策略概述
- 4.2 **DNAT策略的应用**
一、Linux防火墙基础
1.1 Linux包过滤防火墙概述
netfilter(过滤)
- 位于Linux内核中的包过滤功能体系
- 称为Linux防火墙的"内核态"
iptables
- 位于/sbin/iptables,用来管理防火墙规则的工具
- 称为Linux防火墙的"用户态"
以上两种称呼都可以表示Linux防火墙
防火墙
关联端口–对应服务
基于 ip
基于协议:TCP/UDP、ICMP
包过滤的工作层次
- 主要是网络层,针对IP数据包
- 体现在对包内的IP地址、端口等信息的处理上
1.2 iptables的表链结构
规则链
- 规则的作用:对数据包进行过滤或处理
- 链的作用:容纳各种防火墙规则
- 链的分类依据:处理数据包的不同时机
默认包括5中规则链
- INPUT:处理入站数据包(进防火墙的时候就会读这个链)
- OUTPUT:处理出站数据包
- FORWARD:处理转发数据包
- POSTROUTING链:在进行路由选择后处理数据包 (SNAT基于源地址)(由内网往外网)
- PREROUTING链:在进行路由选择前处理数据包 (DNAT基于目的地址)
规则表
- 表的作用:容纳各种规则链
- 表的划分依据:防火墙规则的作用相似
默认包括4个规则表
- raw表:确定是否对该数据包进行状态追踪
- mangle表:为数据包设置标记
- nat表:修改数据包中的源、目标IP地址或端口
- filter表:确定是否放行该数据包(过滤)(核心,默认定义filter表)
默认的表、链结构示意图
1.3 数据包控制的匹配流程
规则表之间的顺序
raw → mangle → nat → filter
规则链之间的顺序
入站:PREROUTING → INPUT
出站:OUTPUT → POSTROUTING
转发:PREROUTING → FORWARD → POSTROUTING
规则链内的匹配顺序
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理
总结:
PREROUTING—>INPUT---->FORWARD---->OUTPUT---->POSTROUTING
匹配流程示意图
二、编写防火墙规则
2.1 iptables安装
关闭firewalld防火墙
- CentOS 7默认使用firewalld防火墙,若想使用iptables防火墙必须先关闭firewalld防火墙
[root@hostname ~]# systemctl stop firewalld.service
[root@hostname ~]# systemctl disable firewalld.service
安装iptables防火墙
[root@hostname ~]# yum -y install iptables iptables-services
设置iptables开机启动
[root@hostname ~]# systemctl start iptables.services
[root@hostname ~]# systemctl enable iptables iptables.services
2.2 基本语法、控制类型
iptables的基本语法
语法结构
- iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
[rooat@hostname ~]# ipitables -t filter -I INPUT -p icmp -j REJECT '禁止icmp协议ping测试'
注意事项
- 不指定表名时,默认指filter表(此时可以不写-t )
- 不指定链名时,默认指表内的所有链 (-A末尾加入、-I开头加入)
- 除非设置链的默认策略,否则必须指定匹配条件 (-P协议、-s源地址、-d目标地址)
- 选项、链名、控制类型使用大写字母,其余均为小写
数据包的常见控制类型
- ACCEPT:允许通过
- DROP:直接丢弃,不给出任何回应
- REJECT:拒绝通过,必要时会给出提示
- LOG:记录日志信息,然后传给下一条规则继续匹配
2.3 iptables的管理选项
添加新的规则
- -A:在链的末尾追加一条规则
- -I:在链的开头(或指定序号)插入一条规则
- -p:用来指定协议
[rooat@hostname ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[rooat@hostname ~]# iptables -I INPUT -p udp -j ACCEPT
[rooat@hostname ~]# iptables -I INPUT 2 -p icmp -j ACCEPT '-p 用来指定协议'
查看规则列表
- -L:列出所有的规则条目
- -n:以数字形式显示地址、端口等信息
- -v:以更详细的方式显示规则信息
- –line-number:查看规则时,显示规则的序号(查看第几行)
[root@hostname ~]# iptables -n -L INPUT '-n -L 可合写为-nL'
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
删除、清空规则
- -D:删除链内指定序号(或内容)的一条规则
- -F:清空所有的规则
[root@localhost ~]# iptables -D INPUT 3 '删除INPUT里面的第三条规则'
[root@localhost ~]# iptables -n -L INPUT '查看INPUT规则(-nL 前后不能颠倒)'
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
[root@hostname ~]# iptables -F '清空默认表的所有链(接-F 只清filter表,其他三张表要加规则)'
[root@hostname ~]# iptables -t -nat -F '清空nat表的所有链'
[root@hostname ~]# iptables -t mangle -F '清空mangle表的所有链'
[root@hostname ~]# iptables -t raw -F '清空raw表的所有链'
设置默认策略
- -p:为指定的链设置默认规则
[root@localhost ~]# iptables -t filter -P FORWARD DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
清空所有默认策略要么是ACCEPT、要么是DROP表所有的链
常用管理选项汇总
2.4 规则的匹配条件
通用匹配
- 可直接使用,不依赖于其他条件或扩展
- 包括网络协议、IP地址、网络接口等条件
隐含匹配
- 要求以特定的协议匹配作为前提
- 包含端口、TCP标记、ICMP类型等条件
显式匹配
- 要求以 “-m 扩展模块” 的形式明确指出类型
- 包含多端口、MAC地址、IP范围、数据包状态等条件
常见的通用匹配条件
- 协议匹配:-p 协议名
- 地址匹配:-s 源地址 、-d 目的地址
- 接口匹配:-i 入站网卡 、-o 出站网卡
[root@hostname ~]# iptables -I INPUT -p icmp -j DROP
[root@hostname ~]# iptables -A FORWARD ! -p icmp -j ACCEPT '叹号!表示条件取反''除了icmp协议,其他协议都允许通过'
[root@hostname ~]# iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP
[root@hostname ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
[root@hostname ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/12 -j DROP 'ens33:外网接口'
- -i 和 -o 是按照数据的流向而言(双向)
- (内网访问外网,内网网卡为in接口,外网网卡为out接口;外网访问内 网,外网网卡为in接口,内网网卡为out接口)
常用的隐含匹配条件
- 端口匹配:- - sport 源端口、- -dport 目的端口
- ICMP类型匹配:- -icmp-type ICMP类型
[root@hostname ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT '53;DNS'
[root@hostname ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT '多端口以冒号隔开,FTP:20、21'
TFTP UDP:69
FTP UDP 20 21
[root@hostname ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP '8表示请求'
[root@hostname ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT '0表示回显'
[root@hostname ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT '3表示不可达'
[root@hostname ~]# iptables -A INPUT -p icmp -j DROP
常用的显示匹配条件
- 多端口匹配:
- -m multiport --sports 源端口列表
- -m multiport --dports 目的端口列表
- IP范围匹配:-m iprange --src-range IP范围
- MAC地址匹配:-m mac --mac-source MAC地址
- 状态匹配:-m state --state 连接状态
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT '范围用中间-'
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP '用的多,指定性拒绝,相当于封杀,除非拆网卡'
上面三条命令常用
常用管理选项汇总
三、SNAT策略及应用
- SNAT(源地址转换),根据指定条件修改数据包的源IP地址。DNAT(目标地址转换),根据指定条件修改数据包目标IP地址和目标端口。
- 如何区分SNAT和DNAT:从定义来讲它们一个是源地址转换,一个是目标地址转换。都是地址转换的功能,将私有地址转换为公网地址。
- 要区分这两个功能可以简单的由连接发起者是谁来区分:内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
- 当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
在配置防火墙或者路由acl策略时要注意这两个NAT一定不能混淆。
3.1 SNAT策略概述
SNAT策略的典型应用环境
- 局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理
- 源地址转换,Source Network Address Translation
- 修改数据包的源地址
SNAT策略的应用
- 前提条件
- 局域网各主机正确设置IP地址/子网掩码
- 局域网各主机正确设置默认网关地址
- Linux网关支持IP路由转发
实现方法
- 编写SNAT转换规则
[root@hostname ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to-source 218.29.30.31
四、DNAT策略及应用
4.1 DNAT策略概述
DNAT策略的典型应用环境
- 在Internet中发布位于企业局域网内的服务器
DNAT策略的原理
- 目标地址转换,Destination Network Address Translation
- 修改数据包的目标地址
4.2 DNAT策略的应用
前提条件
- 局域网的Web服务器能够访问Internet
- 网关的外网IP地址有正确的DNS解析记录
- Linux网关支持IP路由转发
实现方法
- 编写DNAT转换规则
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens33 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
SNAT用来修改源IP地址,而DNAT用来修改目标IP地址、目标端口;
SNAT只能用在nat表的POSTROUTING链,而DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中。