什么是防火墙?
- 用于保护内网安全的一种设备
- 已经规则进行防护
- 用户定义规则
- 允许或拒绝外部用户访问
防火墙的分类
-
逻辑上划分:
主机防火墙:针对单个主机进行防护
网络防火墙:正对网络进行防护,处于网络边缘,防火墙背后是本地局域网
-
物理上划分:
硬件防火墙:在硬件级别实现防火墙功能,另一部分基于软件实现,性能高、硬件成本高;
软件防火墙:应用软件处于逻辑运行于通用硬件平台上的防火墙,成本低,对于Linux系统已自带,直接使用
防火墙性能指标
吞吐量:防火墙能够流经的流量(背板的转发能力)
并发连接:并发连接数越多越好
新建连接:适宜
时延:(ping里面有个times选项,越小越好)
抖动:不能由抖动
硬件防火墙
什么是硬件防火墙?
-
软件嵌入至硬件设备中;
-
硬件防火墙处于网络边缘
硬件防火墙品牌:
Juniper、cisco(思科ASA)、华为、天融信
软件防火墙
软件防火墙是单独使用具备配置数据包通过规则的软件来实现数据包过滤,即通过软件配置规则,运行或拒绝数据包通过;多见于主机系统和个人计算机
iptables防火墙基础
iptables是什么
- iptables不是防火墙,是防火墙用户代理
- 用于把用户的安全设置添加到安全框架中
- 安全框架是防火墙
- 安全框架的名称是netfilter
- netfilter位于内核空间中,是Linux操作系统核心层内部的一个数据包处理模块
- iptables是用于在用户空间对内核空间的netfilter进行操作的命令行工具
netfilter/iptables功能
netfilter/iptables可简称为iptables,为Linux平台下的包过滤防火墙,是开源的,内核自带的,可以代替成本较高的企业级硬件防火墙,能够实现如下功能:
- 数据包过滤,即防火墙
- 数据包重定向,即转发
- 网络地址转换,即可NAT
iptables概念
iptables工作依据------规则(rules)
iptables是按照规则(rules)来办事的,而规则就是运维人员所定义的条件;规则一般定义为“如果数据包头符合这样的 条件,就这样处理这个数据包”。
规则存储在内核空间的数据包过滤表中,这些规则分别指定了源地址、目的地址,传输协议(TCP、UDP、ICMP)和服 务类型(HTTP、FTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,比如放行(ACCEPT)、拒绝(REJECT)、 丢弃(DROP)等
配置防火墙主要工作就是对iptables规则进行添加、修改、删除等
总结:
-
工作依据是规则
-
规则存放在表中
-
规则指定了什么?源地址或目的地址或传输协议或服务类型
-
如果数据包被匹配到了,则按照规则指定的动作去执行
Linux包过滤防火墙概述
规则链
存放规则的地方叫做规则链
规则作用:对数据包进行过滤或处理
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机
默认包括5种规则链
INPUT: 处理入站数据包
OUTPUT: 处理出站数据包
FORWARD: 处理转发数据包
POSTROUTING: 在进行路由选择后处理数据包
PREROUTING: 在进行路由选择前处理数据包
规则表
表的作用:容纳各种规则链
表的划分依据:防火墙规则的作用相似
默认包括4个规则表
raw: 确定是否对该数据包进行状态**跟踪**
mangle: 为数据包设置**标记**
nat: 修改数据包中的源、目标P地址或端口
filter: 确定是否放行该数据包(过滤)
注意:着重关注filter表和nat表;raw表和mangle表的使用较少
数据包过滤的匹配流程
规则表之间的顺序
raw→mangle→nat→filter
规则链之间的顺序
入站:PREROUTING>INPUT
出站: OUTPUT>POSTROUTING
转发:PREROUTING>FORWARD>POSTROUTING
规则链内的匹配顺序
当数据包经过每条规则链时,按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理
iptables安装
要使用iptables
,需要先关闭firewalld
防火墙
systemctl stop firewalld
systemctl disable firewalld
安装iptables
yum install iptables-services -y
systemctl start iptables
systemctl enable iptables
iptables基本语法
iptables [-t 表名] [选项] [链名] [条件] [-j 控制类型]
表名:filter nat mangle raw;
不指定表名,默认filter表
链名:INPUT OUTPUT FORWARD 主要是这三个链;
不指定链名,默认指定表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余小写
数据包的常见控制类型
ACCEPT: 允许通过
DROP: 直接丢弃,不给出任何回应
REJECT: 拒绝通过,必要时会给出提示
LOG: 记录日志信息,然后传给下—条规则继续匹配
选项:
添加新的规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入—条规则
# 在filter表INPUT链的末尾添加一条防火墙规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
# 使用-I时,未指定序号时默认作为第一条
iptables -I INPUT -p udp -j ACCEPT # 省略-t,默认使用filter表
iptables -I INPUT 2 -p icmp -j ACCEPT
查看规则列表
-L:列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号
# 查看filter表INPUT链中的所有规则,并显示规则序号
iptables -L INPUT --line-numbers
# 以数字地址形式查看filter表INPUT链中的所有规则
iptables -nL INPUT
删除、清空规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
# 删除filter表INPUT链中的第三条规则
iptables -D INPUT 3
iptables -n -L INPUT # 确定删除结果
# 清空filter表INPUT链中的所有规则
iptables -F INPUT
# 清空nat表所有链的规则
iptables -t nat -F
iptables -t nat -n -L # 确定删除结果
设置默认策略
-P:为指定的链设置默认规则
# 将filter表中FORWARD链的默认策略设为丢弃
iptables -t filter -P FORWARD DROP
# 将filter表中OUTPUT链的默认策略设为允许
iptables -P OUTOUT ACCEPT
规则的匹配条件
同一条防火墙规则,可以指定多个匹配条件,条件需要满足规则才能生效
————————————————————————————————————————————————————————————————————————————————
通用匹配
可直接使用,不依赖于其他条件或扩展;
———————————————————————————————————————————
网络协议匹配:
-p:检查数据包使用的网络'协议';--protocol
# 丢弃通过icmp协议访问防火墙本机的数据包
iptables -I INPUT -p icmp -j DROP
# 允许转发经过防火墙的除icmp协议之外的数据包
iptables -A FORWARD ! -p icmp -j ACCEPT # !表示取反
# 使主机可以连接外网,其他主机不能访问本机
iptables -t filter -I INPUT -p icmp -j REJECT
———————————————————————————————————————————
IP地址匹配:
-s:检查数据包的'源地址';--source
-d:检查数据包的'目标地址';--destination
# 拒绝转发源地址为192.168.1.11的数据
iptables -A FORWARD -s 192.168.1.11 -j REJECT
# 允许转发源地址位于192.168.7.0/24网段的数据
iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
———————————————————————————————————————————
网络接口匹配:
-i:检测数据包从防火墙的'入站网卡'接口进入;--in-interface
-o:检测数据包从防火墙的'出战网卡'接口发出;--out-interface
# 丢弃从外网接口ens33访问防火墙本机且源地址为私有地址的数据包
iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP
iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP
————————————————————————————————————————————————————————————————————————————————
隐含匹配
要求以特定的协议匹配作为前提
———————————————————————————————————————————
端口匹配:
针对TCP或UDP协议
--sport:检测数据包的'源端口';--source-port
--dport:检测数据包的'目标端口'(这里是别人访问我);--destination-port
# 允许转发网段192.168.4.0/24转发DNS查询数据包
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
# 构建vsftpd服务器,需要开放20、21端口,设置被动模式的端口范围为24500到24600
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
# 通过‘:’分割指定端口范围
iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
———————————————————————————————————————————
ICMP类型匹配:
--icmp-type:检查ICMP数据包类型;
请求:Echo-Request代码为8
回显:Echo-Reply代码为0
不可达:Destination-Unreachable代码为3
# 禁止从其他主机ping本机,但允许本机ping其他主机
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
# 显示可用的ICMP协议类型
iptables -p icmp -h
————————————————————————————————————————————————————————————————————————————————
显式匹配
要求以"-m扩展模块"的形式明确指出类型
包括多端口、MAC地址、IP范围、数据包状态等条件
———————————————————————————————————————————
多端口匹配:
-m multiport --sports 源端口列表
-m multiport --dports 目的端口列表
# 允许本机开放25,80,110,143端口
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
———————————————————————————————————————————
IP范围匹配:
-m iprange --src-range IP源地址范围
-m iprange --dst-range IP目标地址范围
# 禁止转发源地址位于192.168.4.21与192.168.4.28之间的TCP数据包
# IP范围采用“起始地址-结束地址”
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j DORP
———————————————————————————————————————————
MAC地址匹配:
-m mac --mac-source MAC地址:检查数据包的源MAC地址;一般用于内部网络
# 根据MAC地址封锁主机,禁止其访问本机的任何应用
iptables -A INPUT -m mac --mac-source 00:0c:29:f5:7e:3d -j DROP
———————————————————————————————————————————
状态匹配:
-m state --state 连接状态
常见的连接状态:
NEW:与任何连接无关
ESTABLISHED:响应请求或者已建立连接的
RELATED:与已有连接有相关性
# 禁止转发与正常TCP连接无关的非--syn请求数据包(如伪造的网络工具数据包)
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
# 只开放本机的web服务80端口
iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
# 对发给本机的TCP应当数据包予以放行,对其他入站数据包均丢弃
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
————————————————————————————————————————————————————————————————————————————————
总结:
常见的通用匹配条件
协议匹配: -p 协议名
地址匹配: -s 源地址、-d 目的地址
接口匹配: -i 入站网卡、-o 出站网卡
———————————————————————————————————————————
常用的隐含匹配条件
端口匹配: --sport 源端口、--dport 目的端口
TCP标记匹配: --tcp-flags 检查范围被设置的标记
ICMP类型匹配: --icmp-type ICMP类型
———————————————————————————————————————————
常用的显式匹配条件
多端口匹配: -m multiport --sports 源端口列表
-m multiport --dports 目的端口列表
IP范围匹配: -m iprange --src-range IP源地址范围
-m iprange --dst-range IP目标地址范围
MAC地址匹配: -m mac --mac-source MAC地址
状态匹配: -m state --state 连接状态
iptables实战演练
需求:在2号服务器搭建httpd
服务器,开启iptables
防火墙,设置策略能访问web,拒绝ping,在1号服务器完成访问测试
1 在server2搭建WEB服务器
yum install httpd -y
systemctl start httpd
2 在server2上配置iptables防火墙
# 拒绝其他主机连接server2
iptables -I INUPT -p icmp -j DROP
3 开放server2上的80/tcp,允许访问WEB服务器
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
4 在server1上测试,能打开测试页,说明配置成功
SNAT策略
SNAT策略概述
SNAT(Source Network Address Translation)源地址转换是Linux防火墙的一种地址转换操作 ,也是iptables
命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址。
正常情况下,作为网关的Linux服务器必须打开路由转发,才能沟通多个网络。未使用地址转换策略,从局域网PC访问英特网经过网关转发后其源IP地址不变,当英特网的主机收到请求数据包后,响应数据包将无法正确返回(私有地址无法在英特网中正常路由),导致访问失败。
要使得局域网PC能够正常访问英特网,需要开启路由转发,并设置SNAT转换:
当局域网PC访问英特网的数据包到达网关服务器时,进行路由选择,若数据包需要从外网接口eth0向外转发,则将其源IP地址修改为网关的外网接口地址,然后再发送给目标主机。相当于从网关服务器的公网IP地址提交数据访问请求,同理,目标主机也可以正确返回相应。
策略的应用
需求描述
- 局域网的Web服务器能够访问Internet
- Linux网关服务器通过两块网卡分别连接英特网和局域网
网卡 | IP地址 | 连接对象 |
---|---|---|
ens33 | 192.168.27.130 | internet网 |
ens34 | 192.168.153.130 | 局域网 |
-
局域网PC的默认网关设为192.168.153.130,且设置正确的DNS
-
要求192.168.27.0/24网段的PC能正常访问Internet
1 设置局域网PC网关与DNS
# 在局域网PC机
vim /etc/sysconfig/network-scripts/ifcfg-ens34
IPADDR=192.168.153.131
NETMASK=255.255.255.0
GATEWAY=192.168.153.130 # 设置为网关服务器局域网IP
DNS1=8.8.8.8
2 打开网关的路由转发
# 在网关服务器
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 # 1表示开启;0表示关闭
# 读取修改后的配置
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
# 临时开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward = 1
3 在网关服务器设置SNAT策略
将源IP地址(私有地址)转换为网关的公网IP地址
iptables -t nat -I POSTROUTING -s 192.168.153.0/24 -o ens33 -j SNAT --to-source 192.168.27.130
拓展:共享动态IP地址上网MASQUERADE
MASQUERADE适用于外网IP不固定的情况;对于ADSL拨号连接,接口通常为ppp0
,ppp1
某些情况下,网关的外网IP地址不是固定的,就不能使用--to-source
指定固定的IP地址
iptables -t nat -I POSTROUTING -s 192.168.153.0/24 -o ens33 -j MASQUERADE
# MASQUERADE用于伪装数据包源IP地址
4 清空FORWARD
因为局域网PC要访问英特网需要经过网关服务器转发,所以需要更改网关服务器filter表FORWARD链
iptables -t filter -F
此时,局域网PC就可以ping通外网
拓展:如果局域网PC出现ping域名无法ping通,而IP地址可以ping通
考虑网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens34
没有正确设置DNS服务器
vim /etc/sysconfig/network-scripts/ifcfg-ens34
···
DNS1 8.8.8.8
或者可以修改DNS配置文件
vim /etc/resolv.conf
nameserver 8.8.8.8 # 里面添加一行,DNS地址于网卡配置文件里面相同
DNAT策略
DNAT策略概述
DNAT(Destination Network Address Translation)目标地址转换是Linux防火墙的另一种地址转换操作,同样也是iptables
中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址和目标端口。
如图,公司对外只有一个公网IP地址,Internet中的客户机无法访问公司内的服务器,除非在网关服务器中设置DNAT策略。
当Internet中的客户机提交的HTTP请求到企业的网关服务器时,网关首先判断数据包的目的地址和目的端口,若发现该数据包需要访问本机的80端口,则将其目的IP地址修改为内网中真正的网站服务器的IP地址,然后才发送到内部的网站服务器。
DNAT策略的应用
环境描述
- 公司的网站服务器位于局域网内
IP地址 | 局域网段 | 角色 |
---|---|---|
192.168.27.130 | - | 网关服务器ens33 |
192.168.153.131 | 192.168.153.0/24 | 企业的网站服务器 |
- 要求能够从Internet中的任意主机访问网站服务器内容
在网关设置DNAT策略
1 打开路由转发
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
2 设置DNAT策略
针对Internet中的任意主机访问网关的80端口的数据包,将目标地址修改为位于内网的网站服务器的IP地址
iptables -t nat -I PREROUTING -i ens33 -d 192.168.27.130 -p tcp --dport 80 -j DNAT --to-destination 192.168.153.131
3 检验
使用与网关服务器ens33同IP段(192.168.27.0/24)ping企业的网站服务器(192.168.153.131)
此时Internet中的任意主机可以访问网站服务器内容
规则的导出和导入
iptables
服务默认的规则配置文件位于/etc/sysconfig/iptables
;
规则的导出
iptables-save
# 若需要保存为固定的文件,结合重定向操作
iptables-save > iptables.txt
# 如果不使用重定向规则指定,则规则文件在
/etc/sysconfig/iptables
规则的导入
iptables-restore
# 规则的恢复
iptables-restore < iptables.txt
使用防火墙的脚本
#!/bin/bash
# # 定义基本变量
# INET_IF= "eth0" # 外网接口
# INET_IP="218.29.30.31" # 外网接口地址
# LAN_IF="eth1" # 内网接口
# LAN_IP= "192.168.1.1" # 内网接口地址
# LAN_NET="192.168.1.0/24" # 内网网段
# LAN_WWW_IP="192.168.1.6" # 网站服务器的内部地址
# IPT="/sbin/iptables" # iptables命令的路径
# MOD="/sbin/modprobe" # modprobe命令的路径
# CTL="/sbin/sysctl" # sysctl命令的路径
#
# # 加载内核模块
# $MOD ip_tables # iptables基本模块
# $MoD ip_conntrack # 连接跟踪模块
# $MOD ipt_REJECT # 拒绝操作模块
# $MOD ipt_LOG # 日志记录模块
# $MoD ipt_iprange # 支持IP范围匹配
# $MOD xt_tcpudp # 支持TCP、UDP协议
# $MOD xt_state # 支持状态匹配
# $MOD xt__multiport # 支持多端口匹配
# $MOD xt_mac # 支持MAC地址匹配
# $MOD ip_nat_ftp # 支持FTP地址转换
# $MOD ip_conntrack_ftp # 支持FTP连接跟踪
#
# # 调整/proc参数
# $CTL -w net.ipv4.ip_forward=1 # 打开路由转发功能
# $CTL -w net.ipv4.ip_default_ttl=128 # 修改ICMP响应超时
# $CTL -w net.ipv4.icmp_echo_ignore_all=1 # 拒绝响应IPCM请求
# $CTL -w net.ipv4.icmp_echo_ignore_broadcasts # 拒绝响应ICMP广播
# $CTL -w net.ipv4.tcp_syncookies=1 # 启用SYN Cookie机制
# $CTL -w net.ipv4.tcp_syn_retries=3 # 最大SYN请求重试次数
# $CTL -w net.ipv4.tcp_synack_retries=3 # 最大ACK确定重试次数
# $CTL -w net.ipv4.tcp_fin_timeout=60 # TCP连接等待超时
# $CTL -w net.ipv4.tcp_max_syn_backlog=3200 # SYN请求的队列长度
#
# # 清理已有的规则
# $lPT -t filter -x # 删除各表中自定义的链
# $IPT -t nat -X
# $IPT -t mangle -X
# $IPT -t raw -X
# $IPT -t filter -F # 清空各表中已有的规则
# $IPT -t nat -F
# $IPT -t mangle -F
# $IPT -t raw -F
#
# # 设置默认策略
# $IPT-P INPUT DROP
# $IPT -P FORWARD DROP
# $IPT -P oUTPUT ACCEPT
#
# # 设置SNAT策略
# $IPT-t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP
# # 或者
# $IPT-t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j MASQUERADE
#
# # 设置DNAT策略
# $IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
firewalld防火墙
firewalld防火墙概述
firewalld防火墙是CenOS7版本系统默认的防火墙管理工具,取代了iptables防火墙,与iptables防火墙一样也属于典型的包过滤防火墙或称之为网络层防火墙,firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构同样是指向netfilter网络过滤子系统(属于内核态)以实现包过滤防火墙功能。
firewalld和iptables的区别
- firewalld支持动态更新以及加入了防火墙的’zone’概念
- firewalld防火墙同时支持IPv4和IPv6地址
- firewalld可以通过字符管理工具
firewall-cmd
和图形化管理工具firewall-config
进行管理
firewalld配置文件
firewalld拥有两套配置文件。
firewalld会优先使用/etc/firewalld/
中的配置,若不存在配置文件,则使用/usr/lib/firewalld/
中的配置
/usr/lib/firewalld/
默认配置文件,不建议修改;如果需要恢复默认配置,可删除/etc/firewalld/
中的配置/etc/firewalld/
用户自定义配置文件,需要时可以从/usr/lib/firewalld/
中拷贝
firewalld区域
firewalld防火墙为简化管理,将所有网络流量分为多个区域,根据数据包的源IP或传入的网络接口条件等将流量出入响应的区域,每个区域具有不同限制程度的规则。
用户可根据具体环境选择使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口。
默认情况下public
区域是默认区域,包含所有接口(网卡)
区域 | 描述 |
---|---|
drop丢弃 | 丢弃所有传入流量 |
block拒绝 | 拒绝所有传入流量 |
public公共(默认) | 允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝 |
external外部 | 允许与ssh预定义服务匹配的传入流量,其余均拒绝;默认将通过此区域转发的IPv4传出流量进行地址伪装<=>iptables中SNAT策略 |
dmz非军事区 | 允许与ssh预定义服务匹配的传入流量,其余均拒绝;用于您的非军事区的电脑,对内部网络访问权限限制<=>iptables中的DNAT策略 |
work工作 | 用于工作区,允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝 |
home家庭 | 用于家庭网络,允许与ssh、ipp-client、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,区域均拒绝 |
internal内部 | 内部,对网络上的其他计算机信任的较高,默认值与home区域相同 |
trusted信任 | 最高信任级别;可接受所有的网络连接 |
常用firewall-cmd
命令
--get-default-zone # 显示网络连接或接口的默认区域
--set-default-zone=<zone> # 设置网络连接或接口的默认区域
--get-active-zones # 显示已激活的所有区域
--get-zone-of-interface=<interface> # 显示指定接口绑定的区域
--zone=<zone> --add-interface=<interface> # 为指定接口绑定区域
--zone=<zone> --change-interface=<interface> # 为指定的区域更改绑定的网络接口
--zone=<zone> --remove-interface=<interface> # 为指定的区域删除绑定的网络接口
--query-interface=<interface> # 查询区域中是否包含某接口
--list-all-zones # 显示所有区域及其规则
[--zone=<zone>] --list-all # 显示所有指定区域的所有规则
# 显示指定区域内允许访问的所有端口号
[--zone=<zone>] --list-ports
# 启用区域端口和协议组合,可选配置超时时间
[--zone=<zone>] --add-port=<port>[-<port>]/<protocol>[--timeout=<seconds>]
# 禁止区域端口和协议组合
[--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
# 查询区域中是否启用了端口和协议组合
[--zone=<zone>] --query-port=<port>[-<port>]/<protocol>
# 使配置永久生效
--permanent
在使用firewall-cmd命令时,未指定--permanent选项,则该命令为临时设置且立即生效;
若指定了--permanent选项,则该命令在重启firewalld后或者添加--reload选项才能生效
常见配置
1 查询默认区域
[root@localhost ~]# firewall-cmd --get-default-zone
public
2 修改默认区域
[root@localhost ~]# firewall-cmd --set-default-zone=internal
success
3 查询激活区域
[root@localhost ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33 ens34
4 查询接口绑定的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens34
internal
5 手动修改网卡到某个区域
[root@localhost ~]# firewall-cmd --add-interface=ens34 --zone=public
The interface is under control of NetworkManager, setting zone to 'public'.
success
6 显示默认区域的所有规则
[root@localhost ~]# firewall-cmd --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh mdns samba-client dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
7 显示默认区域允许的服务
[root@localhost ~]# firewall-cmd --list-services
ssh mdns samba-client dhcpv6-client
8 向默认区域中添加协议与删除协议
[root@localhost ~]# firewall-cmd --add-service=http
success
[root@localhost ~]# firewall-cmd --remove-service=http
success
9 向默认区域中添加端口
[root@localhost ~]# firewall-cmd --add-port=80/tcp
success
[root@localhost ~]# firewall-cmd --remove-port=80/tcp
success
10 如果你需要帮助,查看所有命令
firewall-cmd --help
地址伪装(SNAT)
前提
net.ipv4.ip_forward = 1
- 其他电脑配置网关
方法①:直接把网卡添加到external区域
firewall-cmd --add-interface=ens33 --zone=external
方法②:使用命令在其他区域添加地址伪装功能
firewall-cmd --add-masquerade --zone=public
端口转发(DNAT)
基本语法
firewall-cmd --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:[toport=<目标端口号>:]toaddr=<目标IP地址> [--permanent]
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=192.168.20.9
# 如果目标端口与源端口一致可以不用指定
# 列出端口转发配置
firewall-cmd --list-forward-ports
实战演练1
环境
要求:
- 设置内网192.168.153.0/24添加到区域internal
- 设置网关192.168.27.130添加到区域external
- firewalld防火墙设置地址伪装和端口转换,实现内网能够上英特网,英特网中的客户机能够访问web服务器
操作配置
1 打开网关的路由转发
sysctl -w net.ipv4.ip_forward=1
2 在网关服务器添加网卡到区域
[root@localhost zones]# firewall-cmd --add-interface=ens33 --zone=external
The interface is under control of NetworkManager, setting zone to 'external'.
success
此时,server2可以ping通外网,地址伪装完成
[root@localhost zones]# firewall-cmd --add-interface=ens34 --zone=internal
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[root@localhost zones]# firewall-cmd --get-active-zones
internal
interfaces: ens34
external
interfaces: ens33
3 在web服务器添加网卡到区域
[root@localhost ~]# firewall-cmd --add-interface=ens33 --zone=internal
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[root@localhost ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33
4 在网关服务器设置端口转发
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.153.131 --zone=external
5 在web服务器添加http协议到internal区域
[root@localhost ~]# firewall-cmd --add-service=http --zone=internal
success
[root@localhost ~]# firewall-cmd --list-service --zone=internal
ssh mdns samba-client dhcpv6-client http
此时在192.168.27.0/24网段的主机访问web服务器,可以成功访问
实战演练2
环境
要求
- server2和server3能正常上外网
- 配置对应的防火墙区域
- 真机和server2能够访问web服务器网站
操作配置
1 在server1设置地址伪装,使 server2和server3能正常上外网
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
——————————————————————————————————————
[root@localhost ~]# firewall-cmd --add-interface=ens33 --zone=external
The interface is under control of NetworkManager, setting zone to 'external'.
success
[root@localhost ~]# firewall-cmd --get-active-zones
external
interfaces: ens33
public
interfaces: ens34 ens35
此时server2和server3可以上外网
设置server1剩余网卡对应的防火墙区域
2 设置server2网卡的防火墙区域
[root@localhost ~]# firewall-cmd --add-interface=ens33 --zone=dmz
The interface is under control of NetworkManager, setting zone to 'dmz'.
success
——————————————————————————
# 为方便之后访问web服务器,在dmz区域添加http协议
[root@localhost ~]# firewall-cmd --add-service=http --zone=dmz
success
3 设置server3网卡的防火墙区域
[root@localhost ~]# firewall-cmd --add-interface=ens34 --zone=work
The interface is under control of NetworkManager, setting zone to 'work'.
success
4 在server1设置端口转发
# 使真机能够访问web
[root@localhost ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.153.131 --zone=external
success
# 使server3能够访问web
[root@localhost ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.153.131 --zone=work
success