目录
一、防火墙介绍
1.1、什么是防火墙
1.2、防火墙的功能:
1.3、linux防火墙的架构
二、iptables
2.1iptables介绍
2.2名词术语:
什么是容器?
什么是Netfilter/Iptables?
什么是表(tables)?
什么是链(chians)?
什么是规则(Policy)?
iptables工作流程:
2.3iptables命令规则:
iptables防火墙规则的保存与恢复:
2.4主机防火墙配置:
2.5配置SNAT和DNAT
开启路由转发的方式:
三、firewalld
3.1firewalld简介
firewalld和iptables不同之处:
3.2firewalld区域
firewalld中常见的区域名称(默认为public)以及相应的策略规则:
firewall-cmd命令的参数说明:
3.3firewalld配置模式
3.4firewalld安装与运行管理
3.5firewalld配置
使用命令行接口配置firewalld
3.6firewall-cmd配置防火墙
3.7firewalld防火墙部署NAT服务
使用SNAT技术实现共享上网
使用DNAT技术向互联网发布服务器
四、nftables入门
使用nftables进行SNAT和DNAT的配置:
SNAT
DNAT
一、防火墙介绍
1.1、什么是防火墙
防火墙:
防火墙是位于内网和外网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。
防火墙又可以分为硬件防火墙与软件防火墙。
硬件防火墙
是由厂商设计好的主机硬件,这台硬件防火墙
的操作系统主要以提供数据包数据的过滤机制为主,并将其他不必要的功能拿掉。
软件防火墙
就是保护
系统网络安全的一套软件(或称为机制),例如Netfilter与TCP Wrappers都可以称为软件防火墙。这儿
主要介绍linux系统本身提供的软件防火墙的功能,那就是
Netfilter
,即
数据包过滤机制
。
数据包过滤,也就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决定该连
接为放行或抵挡的机制。由于这种方式可以直接分析数据包头部数据,包括硬件地址,软件地址,
TCP、UDP、ICMP等数据包的信息都可以进行过滤分析,因此用途非常广泛(主要分析OSI七层协议的
2、3、4层)。由此可知,linux的Netfilter机制可以进行的分析工作有:
-
拒绝让internet的数据包进入主机的某些端口;
-
拒绝让某些来源ip的数据包进入;
-
拒绝让带有特殊标志(flag)的数据包进入,最常用的就是带有SYN的主动连接的标志了;
-
分析硬件地址(MAC)来决定连接与否;
虽然Nefilter防火墙可以做到这么多事情,不过,某些情况下,它
并不能保证我们的网络一定就很安全。例如:
-
防火墙并不能有效地阻挡病毒或木马程序(假设主机开放开了www服务,防火墙的设置是一定要将www服务的port开放给client端的、假设www服务器软件有漏洞,或者请求www服务的数据包本身就是病毒的一部分时,防火墙是阻止不了的)
-
防火墙对内部LAN的攻击无能为力(防火墙对于内部的规则通常比较少,所以就很容易造成内部员工对于网络无用或者滥用的情况)
1.2、防火墙的功能:
①过滤进出网络的数据包,
封堵某些禁止的访问行为
②对进出网络的访问行为作出
日志记录,并提供网络使用情况的统计数据,实现对网络存取和访问的
监控审计。
③
对网络攻击进行检测和告警。
防火墙可以保护网络免受基于路由的攻击,如IP选项中的源路由攻击和ICMP重定向中的重定向路径,并通知防火墙管理员。
④
提供数据包的路由选择和网络地址转换(NAT),从而解决局域网中主机使用内部IP地址也能够顺利访问外部网络的应用需求。
1.3、linux防火墙的架构
linux防火墙系统由以下三层架构的三个子系统组成:
①内层的netfilter:
-
netfilter是集成在内核中的一部分
-
作用是定义、保存相应的过滤规则。
-
提供了一系列的表,每个表由若干个链组成,而每条链可以由一条或若干条规则组成。
-
netfilter是表的容器,表是链的容器,而链又是规则的容器。
-
表→链→规则的分层结构来组织规则
②中间层服务程序:是连接内核和用户的与内核直接交互的监控防火墙规则的
服务程序或守护进程,它将用户配置的规则交由内核中的netfilter来读取,从而调整防火墙规则。
③用户层工具:是Linux系统为用户提供的用来定义和配置防火墙规则的工具软件。
二、iptables
2.1iptables介绍
防火墙会从
自上而下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(放行/阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策
略。一般而言,防火墙策略规则的设置有两种:一种是“
通”(即放行
),一种是“
堵”(即阻止
)。
当防火
墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为
允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
在进行路由选择前处理数据包,用于
目标地址转换
(
PREROUTING
);
处理
流入
的数据包(
INPUT
);
处理
流出
的数据包(
OUTPUT
);
处理
转发
的数据包(
FORWARD
);
在进行路由选择后处理数据包,用于
源地址转换
(
POSTROUTING
)。
2.2名词术语:
-
什么是容器?
容器本身就是指装东西的,如(箱、包、坛)。词典里面对容器解释,容器是用来包装或装载物品的储存器(如箱、坛、罐)或者成形或柔软不成形的包覆材料。在iptables中,就是用来
描述这种包含或者说属于的关系。
-
什么是Netfilter/Iptables?
Netfilter是表(tables)的容器。比如,如果把
Netfilter比作某小区的一栋大楼,那么
表(tables)就是楼里的其中一套房子。这套房子“表(tables)”属于这栋楼“Netfilter”。比如家里所在的小区的楼就是Netfilter。
-
什么是表(tables)?
表(tables)是链的容器,即所有的链(chains)都属于表(tables)。如上,如果把
Netfilter看成是某小区的一栋楼,那么
表(tables)就是楼里的某一套房子。表可能不止一个。
-
什么是链(chians)?
链(chains)是规则(Policys)的容器,
链属于表。如果把
表(tables)当作是一套房子,那么
链(chains)就可以说是房子里的家具(桌子、柜子等),每一套房子里都可能会有桌子,柜子等。
-
什么是规则(Policy)?
规则(Policy)属于链(chains),就是iptables一系列过滤信息规范和具体的操作方法。可以理解为为
购买什么家具,并且如何摆放、设计的更符合要求等。
iptables工作流程:
Iptables是采用数据
包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析并根据我们预先设定的规则进行匹配来决定是否可以进入、流出、流经主机。下面我们以iptables进入主机进行过滤的流程图为例进行讲解:
注意:防火墙规则的顺序默认是认为从前到后依次执行,遇到匹配的规则就不再继续向下查,如果遇到不匹配的规则会继续向下进行;重点:匹配上了拒绝规则也是匹配,因此,不在继续向下进行iptables 命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成 功, iptables 就会根据策略规则所预设的动作来处理这些流量。
语法格式: iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
2.3iptables命令规则:
-
显示相关参数
-n/-numeric 以数字的方式显示地址或者端口信息-L/-list 列出一个链或者所有链中的规则信息--list-rules/-S Print the rules in a chain or all chains: 打印出规则--line-number 当列出规则信息时 ,打印规则行号-v 显示详细信息,可以叠加-h 显示帮助信息
语法格式 :iptable [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或者跳转]
-
清除默认规则
iptables -F: 清除所有规则iptables -X: 删除用户自定义的链iptables -Z: 计数器清零器
-
配置常用参数
-t 表名称 指定配置哪个表,指定配置表名称--append/-A 链名称 附加或者追加上相应规则策略到指定链(链名称必须大写),默认将配置的规则插入到最后一条--check/-C Check for the existence of a rule (检查规则是否存在)-insert/-l 链名称 插入相应的规则策略,到指定链上,默认将配置的规则插入到第一条(可以根据规则序号插入到指定位置)---封Ip地址使用--delete/-D 链名称 删除指定的规则(可以根据规则序号进行删除)--replace/-R replace rule rulenum (1=first )in chain : 替换-P 链名称 改变链上的最终默认规则策略--new/-N 创建新的用户定义链-p 协议名称 指定规则的协议名称 (all tcp udp icmp)--dport 指定匹配的 目标端口信息--sport 指定匹配的 源端口信息-j 动作 匹配数据后的动作ACCEPT 允许DROP 丢弃(没有响应)REJECT 拒绝(回应请求者明确的拒绝)MASQUERADE 伪装上网时使用SNAT 共享地址上网DNAT 目的地址改写-i 在INPUT链配置规则中, 指定哪一个网卡接口进入的流量(只能配置在INPUT链上)-o 在OUTPUT链配置规则中, 指定从哪一个网卡出去的流量(只能配置在OUTPUT链上)-s 指定 源ip地址或者源网段信息-d 指定 目标ip地址或者目标网段信息
-
配置扩展参数
-m 模块 表示增加扩展,匹配功能扩展匹配(可以加载扩展参数)multiport 实现不连续 多端口 扩展匹配icmp 使用icmp的扩展state 状态模块扩展--icmp-type 只有类型8是真正会影响ping ,或者也可以采用any;了解很多icmp类型iptables -p icmp -h--limit n/{second/minute/hour} 指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时--limit-burst [n] 在同一时间内允许通过的请求”n”为数字,不指定默认为5--exact/-x 扩展数字(显示精确数值)
注意:
在iptables 中所有链名必须大写,表名必须小写,动作必须大写,匹配必须小写;
iptables防火墙规则的保存与恢复:
使用命令iptables-save 来保存规则。
一般用 iptables-save > /etc/sysconfig/iptables
也可以使用
service iptables save (它自动将规则保存到/etc/sysconfig/iptables中)
保存:service iptables save
安装服务包:
yum install -y iptables-nft-services.noarch
-
iptables常用规则举例
1、禁止 ssh 默认的 22 端口。
# iptables -A INPUT -p tcp --dport 22 -j DROP
#iptables默认用的表示filter表 提示:
执行此命令后,终端无法ssh连接,需要先放行本地的ssh连接,先添加下面命令 :
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
2、禁止192.168.150.0/24网段连入
# iptables -A INPUT -i ens33 -s 192.168.150.0/24 -j DROP
2.5、仅仅允许本网段对本主机进行远程连接
iptables -I INPUT 2 -p tcp --dport 22 -s 192.168.159.0/24 -j ACCEPT
2.6、拒绝某一主机对本地的远程连接
iptables -I INPUT 2 -p tcp --dport 22 -s 192.168.159.132 -j REJECT
3、测试[!(非)]
iptables -I INPUT -p icmp --icmp-type 8 -s ! 192.168.159.132 -j DROP 只允许合法地址192.168.159.132
这个地址ping防火墙。
4、匹配指定的协议
iptables -A INPUT -p tcp
iptables -A INPUT -p udp
5、匹配主机
iptables -A INPUT –s 192.168.1.101
6、匹配网络
iptables -A INPUT –s 192.168.1.0/24
7、匹配单一端口
iptables -A INPUT -p tcp -s --sport 53
iptables -A INPUT -p udp -s --dport 53
8、匹配端口范围
iptables -A INPUT -p tcp --sport 22:80
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
9、匹配ICMP端口和ICMP类型
iptables -A INPUT -p icmp --icmp-type 8
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
10、匹配指定的网络接口
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
2.4主机防火墙配置:
1、清除所有的规则
iptables -F
iptables -Z
iptables -X
2、配置运行SSH登录端口进入
iptables -A INPUT -p tcp -dport 22 -s 192.168.159.0/24 -j ACCEPT
3、配置运行lo接口的进入和流出
iptables -A INPUT -i IO ACCEPT
iptables -A OUTPUT -o IO ACCEPT
4、配置默认的防火墙禁止和允许规则
iptables -P INPUT DORP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
5、开启信任的IP段
iptables -P INPUT -s 192.168.159.0/24 -p all -j ACCEPT
iptables -P INPUT -s 192.168.158.0/24 -p all -j ACCEPT
iptables -P INPUT -s 192.168.157.0/24 -p all -j ACCEPT
6、允许http服务无条件通过
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
7、允许icmp类型协议通过
iptables -A INPUT -p icmp -m icmp-type any -j ACCEPT
iptables -A INPUT -p icmp -s 192.168.159.0/24 -m icmp icmp-type any -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
8、允许关联的状态包通过
iptables -A INPUT -m
state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
注意:
配置完毕要保存配置(查看保存文件:
vim /etc/sysconfig/iptables
)
2.5配置SNAT和DNAT
源地址转换(Source Network Address Translation)是linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,并
根据指定条件修改数据包的源IP地址。SNAT策略的典型应用环境:
局域网主机共享单个公网IP地址接入Internet
[]DNAT
目标地址转换(Destination Network Address Translation)是Linux防火墙的另一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是
根据指定条件修改数据包的目标IP地址、目标端口。DNAT是一种改变数据包目的IP地址等功能的技术,
它可以使多台服务器共享一个IP地址连如internet,并且继续对外提供服务。通过对同一个外部ip地址分配不同端口,映射到不同的内部服务器的ip和端口,从而实现各种服务的目的。
DNAT策略的典型应用环境:
在Internet中发布位于企业局域网内的服务器
[]MASQUERADE
地址伪装,算是snat中的一种特例,可以
实现自动化的snat。 典型应用:
共享动态IP地址上网
开启路由转发的方式:
临时开启:
方法1:echo 1 > /proc/sys/net/ipv4/ip_forward
方法2:sysctl -w net.ipv4.ip_forward=1
永久开启:
方法一:vim /etc/sysctl.conf
方法二:vim /etc/sysctl.d/99-sysctl.conf
写入之后保存: sysctl -p
三、firewalld
3.1firewalld简介
iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么
firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新即可,它具备对 IPv4 和 IPv6防火墙设置的支持。
相比于传统的防火墙管理工具,
firewalld支持动态更新技术并加入了区域的概念。
区域
就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以选择不同的集合,从而实现防火墙策略之间的快速切换。
firewalld和iptables不同之处:
-
iptables service 在/etc/sysconfig/iptables中存储配置,而firewalld将配置文件存储在/usr/lib/firewalld/和/etc/firewalld中的各种XML文件里面
-
使用iptables service每一个单独更改意味着清除所有旧有的规则和从/etc/sysconfig/iptables里读取所有新的的规则,然而使用firewalld却不会再创建任何新的规则;仅仅运行规则中的不同之处。因此firewalld可以在运行时间内,改变设置而不丢失现行连接。
-
iptables通过 控制端口来控制服务,而firewalld则是通过 控制协议来控制端口
3.2firewalld区域
firewalld中常见的区域名称(默认为public)以及相应的策略规则:
区域
|
默认规则策略
|
阻塞区域(block)
|
拒绝流入的流量,除非与流出的流量相关
|
工作区域(work)
|
拒绝流入的流量,除非与流出的流量相关
|
家庭区域(home)
|
拒绝流入的流量,除非与流出的流量相关
|
公共区域(public)
|
不相信网上的任何计算机,只有选择接收传入的网络连接
|
隔离区域(DMZ)
|
隔离区域也称之为非军事化区域,内外网络之间增加的一层网络,起到缓冲作用、对于隔离区域,只有选择接收传入的网络连接
|
信任区域(trusted)
|
允许所有的数据包
|
丢弃区域(drop)
|
拒绝流入流量,除非与流出的流量相关
|
内部区域(internal)
|
等同于home区域
|
外部区域(external)
|
拒绝流入的流量,除非与流出的流量有关;而如果流量与ssh服务相关,则允许该流量
|
firewalld
默认提供的九个
zone
配置文件都保存在
“
/usr/lib/firewalld/zones/
”
目录下,分别为:
block.xml drop.xml home.xml public.xml work.xml dmz.xml external.xml internal.xml trusted.xml
在
RHEL7
中,
firewalld
服务是默认的防火墙配置管理工具,他拥有基于
CLI
(命令行界面)和基于
GUI(图形用户界面)的两种管理方式。
firewall-config
和
firewall-cmd
是直接编辑
xml
文件
,其中
firewallconfig是图形化工具,
firewall-cmd
是命令行工具。
firewall-cmd命令的参数说明:
参数
|
作用
|
--get dafault-zone
|
查询默认的区域名称
|
--set-default-zone<区域名称>
|
设置默认的区域,即其永久生效
|
--get-zones
|
显示可用的区域
|
--get-services
|
显示预先定义的服务
|
--get-active-zones
|
显示当前正在使用的区域与网卡名称
|
--add-soure=
|
将源自此ip或子网的流量导向某个指定区域
|
--remove-source=
|
不再将源自此ip或者子网的流量导向指向某个区域
|
--list-all
|
显示当前区域的网卡配置参数、资源、端口以及服务等信息
|
--list-all-zones
|
显示所有区域的网卡配置参数、资源、端口以及服务等信息
|
--add-service=<服务名>
|
设置默认区域允许该服务的流量
|
--add-port=<端口号/协议>
|
设置默认区域允许该端口的流量
|
--remove-service=<服务名>
|
设置默认区域不再允许该服务的流量
|
--remove-port=<端口号/协议号>
|
设置默认区域不再允许该端口的流量
|
--reload
|
让“永久生效”的配置规则立即生效,并且覆盖当前的配置规则
|
--panic-on
|
开启应急状况模式
|
--panic-off
|
关闭应急状况模式
|
使用firewalld配置的防火墙策略默认为当前生效,会随着系统的重启而失效。如果想让策略一直存在,就需要使用永久模式了,即在使用firewall-cmd命令设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效了,最后想要使用这种方式设置的策略生效,只能重启或者输入命令:firewallcmd --reload。
3.3firewalld配置模式
-
运行时模式:表示当前内存中运行的防火墙配置,在系统或者firewalld服务 重启、停止时将失效;
-
永久模式:表示重启防火墙或者重新加载防火墙时的规则配置,是 永久存储在配置文件中的。
-
firewalld-cmd命令工具与配置模式相关的选项有三个:
-
--reload :重新加载防火墙规则并且保持状态信息,即将永久配置应用为运行时配置
-
--permanent:带有此选项的命令用于 设置永久性规则,这些规则只有在重新启动或者重新加载防火墙规则时才会生效;如果不带此选项,表示用于设置运行时规则。
-
--runtime-to-permanent:将当前运行时的配置写入规则配置文件中, 使当前内存中的规则成为永久性配置
-
3.4firewalld安装与运行管理
-
安装firewalld软件包
-
rpm -qa | grep firewalld
-
yum -y install firewalld firewalld-config
-
-
firewalld服务的运行管理
-
firewalld防火墙的状态查看、启动、停止、重启、重载服务的命令格式:systemctl |status |start |stop |restart |reload | firewalld.service
-
开启自启动或者停止的命令格式为:systemctl enable | distable firewalld.service
-
屏蔽iptables:systemctl mask iptables
-
停止屏蔽iptables:systemctl unmask iptables
-
注意:mask和distable的区别:mask将服务链接至/dev/null,禁止开启自启动;
3.5firewalld配置
使用命令行接口配置firewalld
-
查看
-
firewall-cmd --state ##查看当前活动的区域,并附带一个目前分配给它们的接口列表
-
firewall-cmd --get-active-zones ##查看当前活动区域
-
firewall-cmd --get-default-zone ##查看默认区域:
-
firewall-cmd --zone=public –list-all ##列出所有预设服务
-
firewall-cmd --get-services ##列出全部服务
-
firewall-cmd --list-all-zones ##列出所有区域的设置
-
-
添加、改变、删除 网络接口
-
firewall-cmd --permanent --zone=internal --add-interface=eth0
-
firewall-cmd --permanent –zone=internal –change-interface=eth0
-
firewall-cmd --permanent –zone=internal –remove-interface=eth0
-
如果没有添加区域,则为当前默认区域
-
-
添加、删除 服务
-
firewall-cmd –permanent –zone=public –add-service=smtp
-
firewall-cmd –permanent –zone=public –remove--service=smtp
-
-
列出、添加、删除 端口
-
firewall-cmd –zone=public –list-ports
-
firewall-cmd –permanent –zone=public –add-port=8080/tcp
-
firewall-cmd –permanent –zone=public –remove-port=8080/tcp
-
-
端口转发 和 地址伪装
-
firewall-cmd –permanent –zone=< ZONE > –add-masquerade 在做伪装的时候,一定要先打开伪装选项(masquerade )
-
firewall-cmd –permanent –zone=< ZONE > –add-rich-rule=’rule family=ipv4 source addres=172.25.0.0/24 masquerade’ 富规则做地址转发
-
firewall-cmd –permanent –zone=< ZONE > –add-forward-port=port=80:proto=tcp:toport=8080:toaddr=172.25.0.10 端口转发
-
3.6firewall-cmd配置防火墙
配置步骤:
-
查看当前的默认区域->查询ens160网卡所属的区域->设置默认区域为dmz->将ens160网卡永久移至dmz区域->重新载入防火墙设置使上述设置立即生效
#firewalld-cmd --get-default-zone public #firewall-cmd --get-zone-of-interface=ens160 public #firewall-cmd --permanent --zone-dmz --change-interface=ens160 interface=ens160 #firewall-cmd --reload
2.安装http服务软件包->启动http服务->创建网站的浏览器首页
#yum -y install httpd
#systemctl start httpd
#echo "防火墙配置测试" > /var/www/html/index.html
3.测试:在本机可成功访问网站->在网段192.168.159.0/24中的其他主机访问失败
4.在dmz区域欲奴徐http服务流量通过,要求立即生效且永久有效
#firewall-cmd --permantent --zone=dmz
--add-service=http
#firewall-cmd --reload
3.7firewalld防火墙部署NAT服务
使用SNAT技术实现共享上网
-
SNAT主要通过在连续互联网的外部网卡上 配置“伪装”,来实现的步骤具体如下:
1.在SANT服务器上开启防火墙->将网络接口ens160移至外部区域(external)->将网络接口---移至内部区域(internal),并确保设置永久生效和立即生效。
#systemctl start firewalld
#firewalld-cmd --change-interface=ens... --zone=external --permanent
#firewalld-cmd --change-interface=esn... --zone=external
#firewalld-cmd --change-interface=ens... --zone=internal --permanent
#firewalld-cmd --change-interface=esn... --zone=internal
2.查看在外网卡所属的外部区域(external)上是否添加伪装(masquerading)功能(默认已经添加),若未添加,则执行添加命令。
#firewall-cmd --list-all --zone=external
#firewall-cmd --zone=external --add-masquerade --permannet
3.在NAT服务器上开启ip转发服务
#vim /usr/lib/sysctl.d/00-system.conf
net.ipv4.ip_forward=1
#sysctl -p /usr/lib/sysctl.d/00-system.conf
4.将NAT服务器内部区域设置为默认区域->重载防火墙规则,将以上设置的永久状态信息在当前运行下生效
# firewall-cmd --set-default-zone=internal
# firewall-cmd --reload
5.测试。将内网中的服务器或者客户机的默认网关设置为NAT服务器的内网卡的ip地址,若以下ping命令能ping通,表明SNAT服务搭建成功。
#ping -c 2 www.baidu.com
注意:通过实验发现SNAT在redhat9上无法使用firewalld正常进行
使用DNAT技术向互联网发布服务器
DNAT服务主要通过不同主机间的“端口转发(或者
端口映射)”来实现,其配置命令如下:
1、在内网的RHEL7-2主机(192.168.1.2/24)上搭建好要发布的Web服务器(8080端口)并准备好测试页面→开启http服务和8080端口,并使其立即生效和永久生效。
#firewalld-cmd --get-default-zone
public
#firewall-cmd --get-zone-of-interface=ens160
public
#firewall-cmd --permanent --zone-dmz --change-interface=ens160
interface=ens160
#firewall-cmd --reload
2、将流入NAT服务器外网卡ens33(10.1.80.61)的80端口的数据包转发给Web服务器(192.168.1.2)的8080端口。
# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.2
# firewall-cmd --reload
3、在NAT服务器上开启IP包转发功能。
# vim /usr/lib/sysctl.d/00-system.conf net.ipv4.ip_forward = 1
# sysctl -p /usr/lib/sysctl.d/00-system.conf
4、在外网的主机(10.1.80.1),添加一条经过外网卡(10.1.80.61)到内网段192.168.1.0/24的路由。
若是RHEL7主机,则执行以下命令添加路由:
# ip route add 192.168.1.0/24 via 10.1.80.61
若是Windows主机,则执行以下命令添加永久生效的路由记录:
route add –p 192.168.1.0 mask 255.255.255.0 10.1.80.61 metric 1
5、
测试。在外网(模拟外网)客户机的浏览器地址栏中输入内网Web服务器的地址
四、nftables入门
先关闭防火墙:
systemctl stop firewalld.service
使用nftables进行SNAT和DNAT的配置:
SNAT
方法一:
开nftables服务:systemctl start nftables.service
创建一个名为nat的表:nft add table nat
向表中添加prerouting和postrouting链:nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
方法二:
重启nftables服务:
创建一个名为nat的表:nft add table nat
向表中添加prerouting和postrouting链:nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat postrouting oifname "ens3" snat to 192.168.159.128
DNAT
①向表中添加prerouting和postrouting链: nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; };nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
② nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.168.157.10