Bootstrap

firewalld高级配置,富语言、以及防火墙应用

一、IP伪装与端口转发

(1)IP伪装概述

  • 首先要知道,NAT技术一般配置在企业边界路由器或防火墙,而Firewalld支持两种类型的网络地址转换,所以就引出了IP伪装。
  • IP地址伪装(masquerade):
    (1)可以实现局域网多个地址共享单一公网地址上网 (类似于PAT端口多路复用)
    (2)IP地址伪装只支持IPv4,不支持IPv6

(2)端口转发概述

  • 通常端口转发也被称为 目的地址转换 或者 端口映射
  • 通过端口转发,指定的IP地址以及端口的流量将被转发到相同计算机上的不同端口或者转发到不同计算机上的端口

(3)IP伪装和端口转发的使用场景

示例:
利用端口转发和IP伪装,可以将内网服务器的私网地址转换成公网地址,从而将内网服务器发布到公网,以便互联网访问,当客户端访问内网的服务器时,会先访问公网地址,网关服务器接受到数据包后判断目的地址和目的端口,一旦匹配规则,就会转发到真正的内网地址上从而建立有效连接

二、firewall-cmd高级配置

(1)直接规则(direct interface)

(1) 也被称为直接接口,它适用于应用程序,而不是用户
(2)firewalld保持对所增加项目的追踪,所以它还能质询firewalld和发现由使用直接端口模式的程序造成的更改
(3)允许管理员手动编写的iptables、ip6tables和ebtables规则插入到Firewalld管理的区域中
(4)通过firewall-cmd命令中的 --direct 选项实现
(5)除了显示插入方式之外,优先匹配直接规则
(6)直接规则模式适用于服务或者程序,以便在运行时间内增加特定的防火墙规则。但是这些规则不是永久性的,它们需要在每次通过D-BUS 从firewalld再到启动、重新启动和重新加载信息后运用
——————————————————华丽分割线——————————————————
D-BUS解释: D-Bus是针对桌面环境优化的IPC(interprocess communication )机制,用于进程间的通信或进程与内核的通信。最基本的D-Bus协议是一对一的通信协议
扩展:
红帽6以前的防火墙4表5链
table表:raw、mangle、nat、filter

chain链:input、output、forward、prerouting、 postrouting
——————————————————————————————————————————

- 直接规则示例:

******要求:把192.168.0.0/24 的IP地址段列入黑名单
1)添加规则链blacklist
[root@Firewalld ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
success
2)让来自192.168.0.0/24网段的数据包路由前选择匹配blacklist
[root@Firewalld ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
success
3)将 “blacklisted” 内容的日志每分钟记录一次
[root@Firewalld ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted"
success
4)匹配blacklist规则的数据丢弃
[root@Firewalld ~]# firewall-cmd --direct --permanent --add-rule ipv4  raw blacklist 1 -j DROP
success
5)最后查看直接规则
[root@Firewalld ~]# systemctl restart firewalld    (因为都加了--permanent选项都是永久配置所有需要重启防火墙)
[root@Firewalld ~]# firewall-cmd --direct --get-rules ipv4 raw blacklist
0 -m limit --limit 1/min -j LOG --log-prefix blacklisted
1 -j DROP

(2)富规则(rich language)

(1)表达性配置语言,无需了解iptables语法
(2)用于表达基本的运行/拒绝规则、配置记录(面向syslog和auditd)、端口转发、伪装和速率限制
(3)所有命令必须都以root用户身份执行
(4)规则的每一个单一元素都可以option选项=value值的形式来采用附件参数
(5)区域内规则排序相同,依次进行匹配,匹配成功就结束,当任何规则都不匹配时默认拒绝
注意:信任(trusted)区域允许不匹配的包

  • 如果匹配的是记录规则,将继续处理
  • 直接规则例外,首先解析直接规则

(6)超时选项(测试和调试)

  • 超时:包含超时选项的规则添加到防火墙后,计时器会自动倒计时,归零时该规则删除
  • 配置远程防火墙时,超时选项以及有用,防止该规则影响管理员无法远程进入系统
  • 测试成功后再取消超时选项
  • 配置选项: --timeout=超时时间

- 对富规则的处理命令

******对富规则的处理命令
1)--add-rich-rule='RULE'     向指定区域中添加RULE,如果没有指定区域,则为默认区域
2)--remove-rich-rule='RULE'  从指定区域中删除RULE,如果没有指定区域,则为默认区域
3)--query-rich-rule='RULE'   查询RULE是否已添加到指定区域,如果没有指定区域,则为默认区域,规则存在,返回为0,否则返回为1
4)--list-rich-rules          输出指定区域的所有富规则,如果未指定区域,则为默认区域
******firewall-cmd处理富语言规则的常用选项(根据需求添加选项)
rule [family="<富规则名称>"]
    [ source address="<源ip地址或地址段>" [invert="True"] ]
    [ destination address="<目标IP地址或地址段>" [invert="True"] ]
    [ <element> ]
    [ log [prefix="<前缀文本>"] [level="<日志级别>"] [limit value="次数/时间"] ]
    [ audit ]
    [ accept|reject|drop ]
******故语言规则具体语法(注释)
1)family="<rule family>" 定义富规则名称
2)source (destination) :源(目标)IP地址或地址段
3)element:要素  (该选项只能是一下几种类型的其中一种)
            1.service:firewalld提供的某种服务(firewall-cmd --get-services 获取)。如果服务提供的默认目标地址和规则中的目标地址冲突,会导致一个错误。
	        语法:service name=服务名称
	        2.port:tcp或udp端口或端口范围(例:1234-1236
	        语法:port port=端口或范围 protocol=协议名称	
	        3.protocol:协议id号或协议名称(可查询/etc/protocols获取)
	        语法:protocol value=协议名或协议id	
	        4.icmp-block:阻断一或多个icmp类型(firewall-cmd --get-icmptypes查看类型)
	        语法:icmp-block name=icmp类型名称	
	        5.masquerade:IP伪装--只使用源地址来伪装	
	        6.forward-port:转发到其他端口
	        port或to-port:端口或端口范围
		          to-addr:目标地址为简单的ip地址
4)log:注册有内核日志的连接请求到规则中(例:系统日志)。可定义一个前缀文本把日志信息作为前缀加入。
	        1.日志级别:emerg、alert、crit、error、warning、notice、info、debug
	        2.语法:log [ prefix=前缀文本] [level=日志级别] limit value=频率(次数/时间)
	        3.时间:s-秒;m--分钟;h---小时;d---天
	        4.最大限定值:value=1/d 每天最多一条日志	
5)audit 审核:审核类型为accept、reject、drop,但不能在audit命令后指定。审核类型会自动在规则动作中收集。审核的使用可选择。
6)控制类型:accept|reject|drop
	语法:accept|reject [ type=拒绝类型] | drop 
	accept:所有新的连接请求被允许
	reject:拒绝,发起端将接到一个拒绝信息
	drop:丢弃,同时不向发起端发送信息	

- 富规则示例:

1)首先为认证报头协议AH使用新的ipv4和ipv6连接
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule protocol value=ah accept'
success
2)允许连接ftp,使用审核,每分钟记录一次
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule service name=ftp log limit value=1/m audit accept'
success
3)允许来自192.168.0.0/24的地址的tftp协议的ipv4连接,并且使用系统日志每分钟记录1次info级别信息
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept'
success
4)为radius拒绝所有来自此地址的ipv6连接,同时记录日志前缀为dns,级别为info,每分钟最多纪录3
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject'
success
5)接受来自其他发起端的新的ipv6连接
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule family="ipv6" service name="radius" accept'
success
6)允许192.168.2.2的所有连接
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
success
7)拒绝来自public区域的192.168.0.11的所有链接
[root@Firewalld ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address=192.168.0.11/32 reject'
success
------------------------------------华丽分割线-----------------------------------------
IPsec封装安全负载(IPsec ESP)时IPsec体系结构中的一种主要协议,即点对点连接,其主要设计来自IPv4和IPv6中提供安全服务的混合应用
IPsec ESP通过加密需要保护和数据以及在IPsec ESP的数据部分防止这些加密的数据来提供机密性和完整性
---------------------------------------------------------------------------------------
8)丢弃来自默认区域的所有进入的ipsec应用的esp协议包
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule protocol value="esp" drop'
success
9)在dmz区域中,接受来自192.168.1.0网段的tcp端口,范围为7900-7905的数据包
[root@Firewalld ~]# firewall-cmd --zone=dmz --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
success
10)接受从work区域到ssh服务的新连接,以notice级别且每分钟最多3次记录信息到syslog
[root@Firewalld ~]# firewall-cmd --zone=work --add-rich-rule='rule service name=ssh log prefix="ssh" level="notice" limit value="3/m" accept'
success
11)超时时间为5分钟(即五分钟后该规则自动删除),拒绝从默认区域到dns的新连接,且每小时记录一次到audit审核系统
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.2.0/24 service name=dns audit limit value="1/h" reject' --timeout=300
success
[root@Firewalld ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address=192.168.1.10/32 icmp-block name="echo-request"' --timeout=30
success
12)查看所有区域规则
[root@Firewalld ~]# firewall-cmd --list-all-zones
。。。。。。
13)查看富规则
[root@Firewalld ~]# firewall-cmd --list-rich-rules
rule protocol value="ah" accept
rule service name="ftp" log limit value="1/m" audit accept
rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept
rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject
rule family="ipv6" service name="radius" accept
rule family="ipv4" source address="192.168.2.2" accept
rule family="ipv4" source address="192.168.0.11/32" reject
rule protocol value="esp" drop
rule family="ipv4" source address="192.168.2.0/24" service name="dns" audit limit value="1/h" reject

三、防火墙应用

(1)配置firewalld实现指定要求

- 实验环境:

  • linux-001 网关服务器
网卡名称虚拟网卡网卡通信ip地址
ens33VM1互联网200.0.0.1
ens37VM2企业内网192.168.10.1
ens38VM3网站服务器区192.168.20.1
  • linux-002 内网网站服务器
网卡名称虚拟网卡IP地址网关
ens33VM3192.168.20.10192.168.20.1
  • linux-003 企业内网测试机
网卡名称虚拟网卡IP地址网关
ens33VM2192.168.10.10192.168.10.1
  • linux-004 外网网站服务器
网卡名称虚拟网卡IP地址
ens33VM1200.0.0.2

——为了呈现更加真实的环境,这里外网机器就不指网关了,直接把网卡设置成和linux-001的外网地址相同就行,当内网访问外网时,通过网关服务器即可与外网通信,要记得开启网关服务器的路由功能

- 要求:

(1)网关服务器:

  • 连接互联网网卡ens33地址为200.0.0.1,为公网IP地址,分配到firewall的外部区域(external)
  • 连接内网网卡ens36地址为192.168.10.1,为内网IP地址,分配到firewall的信任区域(trusted)
  • 连接服务器网卡ens37地址为192.168.20.1,为内网IP地址,分配到firewall的非军事区域(dmz)

(2)内网网站服务器和网关服务器:
两个服务器均通过SSH来远程管理,为了安全,将SSH默认端口更改

  • 网关服务器更改为:54321
  • 内网网站服务器更改为:12345

(3)网站服务器:

  • 开启https,过滤未加密的http流量(实验环境中继续使用http)
  • 网站服务器拒绝ping,网关服务器拒绝来自互联网上的ping

(4)公司内网用户需要通过网关服务器共享上网
(5)互联网用户需要访问网站服务器

- 步骤

- 在相应主机上修改网卡、主机名、搭建网站服务器
内网网站服务器、内网测试机的网关要记得指向网关服务器,并且配置完地址后,要ping一下网关服务器看能不能通
外网网站服务器也是同理,只不过不用配置网关
******1)内网网站服务器(linux-002
[root@linux-002 ~]# mount /dev/cdrom /meida/cdrom  (挂载镜像文件)
[root@linux-002 ~]# yum -y install httpd  (使用yum安装网站服务)
[root@linux-002 ~]# echo "aaaaaaaaaaaaaaa" > /var/www/html/index.html  (编写网页)
[root@linux-002 ~]# systemctl start httpd    (启动网站服务)
[root@linux-002 ~]# curl 127.0.0.1           (访问回环地址,测试网站服务器是否正常运行)
aaaaaaaaaaaaaaa  (发现可以正常运行)
******2)外网网站服务器(linxu-004)(和linxu-002配置相同,网页内容不一样就行)
[root@linux-004 ~]# mount /dev/cdrom /meida/cdrom  
[root@linux-004 ~]# yum -y install httpd  
[root@linux-004 ~]# echo "bbbbbbbbbbbb" > /var/www/html/index.html
[root@linux-004 ~]# systemctl start httpd
[root@linux-004 ~]# curl 127.0.0.1
bbbbbbbbbbbb
******3)网关服务器(linux-001
配置网卡的时候,要先使用  ip  a  查看一下新添加的网卡的名称,我这里是ens37和ens38
[root@linux-001 ~]# cd /etc/sysconfig/network-scripts/  (进到网卡根目录)
[root@linux-001 network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@linux-001 network-scripts]# cp ifcfg-ens33 ifcfg-ens38
[root@linux-001 network-scripts]# vim ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37  (修改NAME和DEVICE的名称为相应的网卡名称)
DEVICE=ens37  (中间的UUID号要删除)
ONBOOT=yes
IPADDR=192.168.10.1
PREFIX=24
IPV6_PRIVACY=no
配置完成后ping一下另外三台机器,看能不能正常访问
- 在网关服务器上做防火墙配置
******1)修改主机名、网卡地址等前置操作
[root@linux-001 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:44:ad:db brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.1/24 brd 200.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7762:f351:dbfc:cb0e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:44:ad:e5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.1/24 brd 192.168.10.255 scope global noprefixroute ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::18f:b43e:375e:defb/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:44:ad:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.1/24 brd 192.168.20.255 scope global noprefixroute ens38
       valid_lft forever preferred_lft forever
    inet6 fe80::7d28:ef07:59c:1f82/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
******2)开启网关路由器的路由转发功能
[root@linux-001 ~]# echo "net.ipv4.ip_forward = 1 " >> /etc/sysctl.conf 
[root@linux-001 ~]# sysctl -p
net.ipv4.ip_forward = 1
******3)配置防火墙
[root@linux-001 ~]# systemctl start firewalld   (开启防火墙)
[root@linux-001 ~]# firewall-cmd --state        (查看防火墙状态)
running    (已经启用)
[root@linux-001 ~]# firewall-cmd --set-default-zone=external  (更改防火墙默认区域为external)
success
[root@linux-001 ~]# firewall-cmd --list-all    (查看默认区域的所有规则)
external (active)  (发现直接查找的就是external区域,说明默认区域更改成功)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens37 ens38
  sources: 
  services: ssh
  ports: 
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	
[root@linux-001 ~]# firewall-cmd --change-interface=ens33 --zone=external  (把ens33网卡分配到external区域中)
success
[root@linux-001 ~]# firewall-cmd --change-interface=ens37 --zone=trusted   (把ens37网卡分配到trusted区域中)
success
[root@linux-001 ~]# firewall-cmd --change-interface=ens38 --zone=dmz       (把ens38网卡分配到dmz区域中)
success
******查看配置情况
[root@linux-001 ~]# firewall-cmd --get-active-zones  (查看活跃区域的接口配置情况)
dmz
  interfaces: ens38
external
  interfaces: ens33
trusted
  interfaces: ens37
-----------------------------------华丽分割线---------------------------------------
这个时候配置完,使用内网客户机(linux-003)访问一下内网网站服务器(linux-002
[root@linux-003 ~]# curl 192.168.20.10  (发现可以成功访问)
aaaaaaaaaaaaaaa
-----------------------------------------------------------------------------------
******4)更改ssh的侦听端口为54321(实验环境添加端口,不然连接的xshell会断)
[root@linux-003 ~]# vim /etc/ssh/sshd_config  (进入ssh的主配置文件)
。。。。。。
 16 #
 17 Port 22  (把前面的#号去掉,并且再加一个Prot)
 18 Port 54321
 19 #AddressFamily any
。。。。。。
保存退出
[root@linux-001 ~]# systemctl restart sshd (重启ssh服务)
******5)在external区域添加tcp端口54321,实现互联网远程登录ssh,并且禁止ping网关服务器
[root@linux-001 ~]# firewall-cmd --zone=external --add-port=54321/tcp --permanent
success
[root@linux-001 ~]# firewall-cmd --zone=external --add-icmp-block=echo-request --permanent
success
[root@linux-001 ~]# firewall-cmd --reload  (重新加载防火墙,因为做的是永久配置)
success
----------------------------------验证--------------------------------------
1)互联网测试机(linux-004)ping网关服务器,和ssh远程连接服务器
[root@linux-004 ~]# ping 200.0.0.1   (发现拒绝访问)
PING 200.0.0.1 (200.0.0.1) 56(84) bytes of data.
From 200.0.0.1 icmp_seq=1 Destination Host Prohibited
From 200.0.0.1 icmp_seq=2 Destination Host Prohibited
^C
--- 200.0.0.1 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1000ms

[root@linux-004 ~]# ssh -p 54321 root@200.0.0.1 ip a  (指定端口54321,ip a 是指连接成功后输出在指定远程机器上执行的结果)
The authenticity of host '[200.0.0.1]:54321 ([200.0.0.1]:54321)' can't be established.
ECDSA key fingerprint is SHA256:weaks0wagWSeyPZfM99IlV/pbISthvV5FMnczNdtcj4.
ECDSA key fingerprint is MD5:af:d9:66:c2:45:b3:c6:8e:0b:53:07:99:d7:8f:a0:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[200.0.0.1]:54321' (ECDSA) to the list of known hosts.
root@200.0.0.1's password:   (输入密码)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:44:ad:db brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.1/24 brd 200.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7762:f351:dbfc:cb0e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:44:ad:e5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.1/24 brd 192.168.10.255 scope global noprefixroute ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::18f:b43e:375e:defb/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:44:ad:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.1/24 brd 192.168.20.255 scope global noprefixroute ens38
       valid_lft forever preferred_lft forever
    inet6 fe80::7d28:ef07:59c:1f82/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
————发现直接显示出了linux-001网关服务器的网卡信息,说明可以正常ssh远程      
2)内网测试机(linux-003)ping网关服务器
[root@linux-003 ~]# ping 192.168.10.1   (发现可以正常访问)
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.339 ms
^C
--- 192.168.10.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.339/0.339/0.339/0.000 ms
--------------------------------------------------------------------------
- 在内网网站服务器上的配置(linux-002)
******1)更改ssh的侦听端口为12345
[root@linux-002 ~]# vim /etc/ssh/sshd_config (修改主配置文件)
。。。。。。
 16 #
 17 Port 22
 18 Port 12345
 19 #AddressFamily any
。。。。。。
保存退出
[root@linux-002 ~]# systemctl restart sshd (重启ssh服务)
******2)启动防火墙并且进行配置
[root@linux-002 ~]# systemctl start firewalld  (启动防火墙)
[root@linux-002 ~]# firewall-cmd --state       (查看防火墙状态)
running
[root@linux-002 ~]# firewall-cmd --set-default-zone=dmz  (修改默认区域为dmz)
success
[root@linux-002 ~]# firewall-cmd --list-all   (查看默认区域的所有规则)
dmz (active)  (这里直接显示dmz说明默认区域已经成功修改)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	
[root@linux-002 ~]# firewall-cmd --zone=dmz --add-service=https --permanent  (添加https服务在dmz区域)
success
[root@linux-002 ~]# firewall-cmd --zone=dmz --add-service=http --permanent   (添加http服务在dmz区域)
success
[root@linux-002 ~]# firewall-cmd --zone=dmz --add-port=12345/tcp --permanent (添加tcp端口的12345到dmz区域)
success
[root@linux-002 ~]# firewall-cmd --zone=dmz --add-icmp-block=echo-request --permanent (拒绝ping的请求)
success
[root@linux-002 ~]# firewall-cmd --reload  (重新加载防火墙,因为做的都是永久配置)
success
[root@linux-002 ~]# firewall-cmd --list-all  (查看默认区域的所有规则)
dmz (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: http https ssh
  ports: 12345/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: echo-request
  rich rules: 
------------------------------------------验证-------------------------------------------------	
1)外网测试机(linux-004)访问内网网站服务器(linux-002
[root@linux-004 ~]# curl http://192.168.20.10
curl: (7) Failed to connect to 192.168.20.10: 网络不可达
[root@linux-004 ~]# ssh -p 12345 root@192.168.20.10 ip a
ssh: connect to host 192.168.20.10 port 12345: Network is unreachable
报错分析:外网测试机没有指定网关,所有目前无法和内网服务器连接
2)内网测试机(linux-003)访问内网网站服务器(linux-002
[root@linux-003 ~]# curl http://192.168.20.10   (可以成功访问网站)
aaaaaaaaaaaaaaa
[root@linux-003 ~]# ssh -p 12345 root@192.168.20.10 ip a  (可以进行ssh远程)
The authenticity of host '[192.168.20.10]:12345 ([192.168.20.10]:12345)' can't be established.
ECDSA key fingerprint is SHA256:bpDrPDFtWkIXPoWoj0H7CNoWJ/kmgmDJZXwK5GMo8Yo.
ECDSA key fingerprint is MD5:c2:63:7a:55:de:1e:51:81:9f:8a:39:40:c7:36:89:cb.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.20.10]:12345' (ECDSA) to the list of known hosts.
root@192.168.20.10's password: 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ab:11:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.10/24 brd 192.168.20.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::32ab:5b77:3fc:bf01/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@linux-003 ~]# ping -c 3 192.168.20.10  (无法ping通内网网站服务器)
PING 192.168.20.10 (192.168.20.10) 56(84) bytes of data.
From 192.168.20.10 icmp_seq=1 Destination Host Prohibited
From 192.168.20.10 icmp_seq=2 Destination Host Prohibited
From 192.168.20.10 icmp_seq=3 Destination Host Prohibited

--- 192.168.20.10 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2001ms
内网测试机(linux-003)验证结果符合内网网站服务器配置的规则

(2)配置ip地址伪装——实现内部局域网共享上网

原因:基于上面的实验环境,由于网关服务器的external区域默认开启了地址伪装,无论内网测试机(trusted区域)还是内网网站服务器(dmz区域)都可以访问外网网站,所以如果想要只有指定的机器可以访问外网网站,这个时候就需要配置ip地址伪装

- 网关服务器

[root@linux-001 ~]# firewall-cmd --list-all --zone=external
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: ssh
  ports: 54321/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: echo-request
  rich rules: 

- 内网测试机(linux-003)、内网网站服务器(linux-002)

******发现都可以进行访问
[root@linux-002 ~]# curl 200.0.0.2
bbbbbbbbbbbb
[root@linux-003 ~]# curl 200.0.0.2
bbbbbbbbbbbb

- 只为内部局域网的内网测试机开启地址伪装

- 网关服务器配置
******关闭external地址伪装,添加富规则,要求external区域内,源地址为192.168.10.0/24的网段开启地址伪装
[root@linux-001 ~]# firewall-cmd --remove-masquerade --zone=external --permanent 
(想要之只开启一个,所以要先把默认的伪装删除,不删除的话所有客户机都可以访问)
success
[root@linux-001 ~]# firewall-cmd --reload  (重新加载防火墙)
success
[root@linux-001 ~]# firewall-cmd --zone=external --add-rich-rule='rule family=ipv4 source address=192.168.10.0/24 masquerade'
(添加富规则,使192.168.10.0/24网段的流量开启ip伪装)
success
[root@linux-001 ~]# firewall-cmd --list-all --zone=external  (查看external区域的所有规则)
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: ssh
  ports: 54321/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: echo-request
  rich rules: 
	rule family="ipv4" source address="192.168.10.0/24" masquerade
--------------------------------------验证---------------------------------------
1)内网测试机(linux-003)、内网网站服务器(linux-002)分别访问外网站点
[root@linux-002 ~]# curl http://200.0.0.2  (内网网站服务器无法访问)
curl: (7) Failed connect to 200.0.0.2:80; 没有到主机的路由
[root@linux-003 ~]# curl http://200.0.0.2  (内网测试机可以访问)
bbbbbbbbbbbb
--------------------------------------------------------------------------------

(3)配置端口转发——实现互联网用户访问web服务器

原因:因为外网网站服务器(linux-004)没有配置网关所以无法访问内网网站服务器(linux-002),这个时候就可以配置端口转发,把网关服务器(Linux-001)上指定区域的指定流量转到另一个区域,从而实现外网也能访问内网

- 网关服务器配置

******配置端口转发,从external区域
[root@linux-001 ~]# firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=192.168.20.10
success
--------------------------------验证------------------------------
******使用外网服务器(linux-004)访问网关服务器(linux-001)的外部接口
[root@linux-004 ~]# curl http://200.0.0.1  (发现直接显示出了内网网站服务器的页面内容)
aaaaaaaaaaaaaaa
******查看内网网站服务器(linux-002)的网站日志
[root@linux-002 ~]# tail -f /var/log/httpd/access_log   (发现有外网服务器访问的记录)
127.0.0.1 - - [09/Jan/2021:18:49:50 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0"
192.168.10.10 - - [09/Jan/2021:19:04:59 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0"
192.168.10.10 - - [09/Jan/2021:19:30:43 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0"
200.0.0.2 - - [09/Jan/2021:19:53:56 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0"
至此端口转发配置完成
;