firewalld高级配置

一、1、关于iptables的知识

         IP数据包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是做数据包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的数据包过滤表中,而这些表集成在Linux内核中。在数据包过滤表中,规则被分组放在我们所谓的链中。

        虽然 netfilter/iptablesIP 数据包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。

        (1).netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。
        (2).iptables 组件是一种工具,也称为用户空间(userspace),"它使插入、修改和除去数据包过滤表中的规则变得容易。

        iptables 包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook(挂钩)点来区分的,表和链实际上是 netfilter 的两个维度。

2、firewalld中理解直接规则

将 iptables 的规则插入到 firewalld 的管理区域中,这种方式写的规则叫直接规则。

将某个IP 范围列入黑名单

在这个例子中首先自定义了一个叫 blacklist 的链,然后将所有来自 192.168.10.0/24 的数据包都指向了这个链,最后定义了这个链的规则:首先进行记录,然后drop,记录的方法是使用“blacklisted:"前缀并且限制 1分钟记录一次。

(1)创建一个黑名单,并为这个黑名单创建一个链,链名为blacklist

[root@localhost ~l# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist

(2)将来自 192.168.10.0/24 的数据包指向这个链

[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raW PREROUTING 0 -S192.168.10.0/24 -j blacklist

(3)每分钟记录一次日志(-m limit --limit 1/min 每分钟记录一次日志

[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit--limit 1/min -j LOG --log-prefix "blacklisted'

(4)设置这个链的规则为 DROP

[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP

(5)重启 firewalld(重启或重载后生效)

[root@localhost ~]# systemctl restart firewalld

(6)查看直接规则
root@localhost ~]# cat /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<chain table="raw" ipv="ipv4" chain="blacklist"/><rule priority="0" table="raw" ipv="ipv4" chai="PREROUTING">-S 192.168.10.0/24 -jblacklist</rule>
<rule priority="1" table="raw" ipv="ipv4" chain="blacklist">-j DROP</rule></direct>

注释:

  • lpv4:这个属性非常简单,表示ip的版本
  • table: chain 和 rule 节点中的 table 属性就是 iptables/ip6tables 中的 table
  • chain:chain 中的 chain 属性用于指定一个自定义链的名字,注意,不可与己有链重名;rule 中的 chain 属性既可以是内建的(也就是 iptables/ip6tables 中的五条链),也可以是在 direct 中自定义的 chain
  • priority:优先级,用于设置不同rule 的优先级,就像 iptables 中规则的前后顺序,数字越小优先级越高
  • args: rule 和 passthrough 中的 args 就是 iptables/ip6tables 中的一条具体的规则,不过他们可以使用我们自定义的 chain。

备注:用其他主机 ping它,然后査看 messages 日志文件,会看到相关的日志条目

备注:
清空直接规则
/etc/firewalld/direct.xml

3、使用富语言
1:什么是富语言
不需要使用 iptables 语法,而是使用高级语言配置防火墙规则的机制成为富语言。

规则排序
测试和调试

3:理解富规则命令
4:规则配置举例

(1)为认证报头协议 AH 使用新的 IPv4 和 IPv6 连接

[root@localhost ~]# firewall-cmd --add-rich-rule='rule protocol value=ah accept'

(2)允许新的IPv4 和IPv6 连接 http,并使用审核每分钟记录一次

[root@localhost ~l# firewall-cmd --add-rich-rule='rule service name=http log prefix=httpaccesslimit value=1/m audit accept'

注意:
开启日志记录后
[root@localhost ~]# cat /var/log/messages

Jan 14 11:27:29 192 kernel: 'httpaccess'lN=ens33 OUT=MAC=00:0c:29:85:a0:bd:00:0c:29:5e:d3:72:08:00 SRC=192.168.10.102 DST=192.168.10.101LEN=60 TOS=0X00 PREC=0XO0 TTL=64 ID=60222 DF PROTO=TCP SPT=53168 DPT=80WINDOW=29200 RES=0x00 SYN URGP=0

(3)允许来自 192.168.0.0/24地址的TFTP 协议的IPv4连接,并且使用系统日志每分钟记录一次

[root@localhost ~]# firewall-cmd --add-rich='rule family="ipv4" source address="192.168.0.0/24'service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept'

(4)为 RADIUS 协议拒绝所有来自 1:2:3:4:6::的新的IPv6 连接,日志前缀为“dns”,级别为info,并每分钟最多记录3次。接受来自其他发起段新的IPv6连接

[root@locahost ~l# firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:6..service name="raduis" log prefix="dns" level="info" limit value="3/m" reiect

(5)将源 192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接

[root@localhost    ~]#       firewall-cmd     --add-rich-ruli='rule'      family="ipv4"  source address="192.168.2.2"accept'

(6)拒绝(删除)来自 public 区域中IP 地址为 192.168.0.11 的所有流量

[root@localhost ~]#   firewall-cmd   --zone=public    --add-rich-rule='rule     family=ipv4 source      address=192.168.10.202/32 reject'


[root@localhost ~]# firewall-cmd   --zone=public   --remove-rich-rule='rule   family=ipv4   source  address=192.168.10.202/32reject'

 
(7)丢弃来自默认区域中任何位置的所有传入的ipsecesp 协议包

[root@localhost ~]# firewall-cmd --add-rich-rule='rule protocol value="esp" drop'


(8)在 192.168.1.0/24 子网的 dmz 区域中,接收端口 7900--1905 的所有 TCP 包

[root@localhost ~]# firewall-cmd    --zone=dmz    -add-rich-rule='rule     family=ipv4   sourc  eaddress=192.168.1.0/24 port port=7900-1905 protocol=tcp accept'

(9)接受从 work区域到 ssh 的新连接,以 notice 级别且每分钟最多三条信息的方式将新连接记录到 syslog

[root@localhost ~]# firewall-cmd --zone=work -add-rich-rule='rule service name=ssh log
prefix="ssh" level="notice" limit value="3/m" accept'


(10)在接下来的 5min 内,拒绝从默认区域中的子网 192.168.2.0/24 到 DNS 的新连接,并且拒绝的连接将记录到 audit 系统,且每小时最多一条消息

[root@localhost ~]# firewall-cmd --add-rich-rule='rule family=ipv4 sourceaddress=192.168.2.0/24 service name=dns audit limit value="1/h" reject' --timeout=300

二、配置firewall防火墙的地址伪装和端口转发

实验环境

实验描述

 实验需求

  • ens33 分配到 external 区域、ens37 分配到 trusted 区域、ens38 分配到 dmz 区域
  • 网站服务器和网关服务器通过 ssh 来远程管理,并修改端口号为 12345
  • 服务器开启 https,
  • web 服务器拒绝 ping,网关服务器拒绝来自互联网上的 ping
  • 公司内网用户需要通过网关服务器共享上网互联网用户需要访问 dmz 区域的 web 服务

实验过程

2.1:基本配置

1:基本环境配置
按照实验 TOP 设置各个服务器网卡的IP 地址

(1)在网关服务器上配置主机名
[root@localhost~]# hostname gateway-server                                                            [root@localhost ~]# vi /etc/hostname
gateway-server

(2)开启网关服务器的路由转发功能
[root@localhost ~]# vi /etc/sysctl.conf
net.ipv4.ip forward=1
[root@localhost~]#sysctl -p

(3)配置 web服务器的主机名
[root@localhost ~]# vi/etc/hostname
web

2:网站服务器环境的搭建
(1)验证 firewalld 在网站服务器上是否启动并且正常运行
[root@web~]#systemctlstatus firewalld

(2)安装 httpd和 mod_ssl 软件包
[root@web ~]# yum install -y httpd mod_ssl


(3)启用并启动 httpd 服务
[root@web ~]# systemctl start httpd
[root@web~]#systemctl enable httpd

(4)创建网站首页测试页 index.html
[root@web ~]# vi /var/www/html/index.html
test web

(5)更改 ssh 的监听端口,并重启服务,关闭 SELinux
[root@web~]#setenforce 0
[root@web ~]# vi /etc/ssh/sshd config
Port 12345
[root@web ~]# systemctl restart ssho

3:在网站服务器上配置 firewalld 防火墙
(1)设置默认区域为 dmz区域
[root@web~]#firewall-cmd --set-default-zone=dmz

(2)为 dmz 区域打开 https 服务并添加 TCP 的 12345 端口
[root@web ~]# firewall-cmd --zone=dmz --add-service=https --permanent                        [root@web ~]# firewall-cmd --zone=dmz --add-port=12345/tcp --permanent

(3)禁止 ping
[root@web ~]# firewall-cmd --add-icmp-block=echo-request --zone=dmz--permanent

(4)因为预定于的 ssh 服务已经更改了端口,所以要将预定于 ssh 服务移除

[root@web ~]#firewall-cmd --zone=dmz --remove-service=ssh --permanent

(5)重新加载 firewalld 配置。并査看之前的配置
[root@web ~]#firewall-cmd --reload
[root@web ~]#firewall-cmd --list-al
dmz(active)
        target: default
        icmp-block-inversion:no
        interfaces: ens33
        sources:
        services: https
        ports: 12345/tcp
        protocols:
        masquerade:no
        forward-ports:
        sourceports:
        icmp-blocks: echo-request
        rich rules:

4:在网关服务器上配置 firewalld 防火墙
(1)验证 firewalld 在网关服务器上是否启动并且正在运行                                                   [root@gateway-server ~]#systemctl status firewalld

(2)设置默认区域为 external 区域,并查看配置结果                                                              [root@gateway-server ~]# firewall-cmd --set-default-zone=external                                        [root@gateway-server ~]# firewall-cmd --list-all
external(active)                                                                                                                                          target: default
        icmp-block-inversion:no
        interfaces:ens33 ens37 ens38
        sources:                                                                                                                                            services: ssh                                                                                                                                ports:                                                                                                                  protocols:                                                                                                                                           masquerade:yes                                                                                                                                forwardports:                                                                                                                                      sourceports:                                                                                                                                         icmp-blocks:                                                                                                                                    rich rules:

(3)将ens37 网卡配置到 trusted 区域,将 ens38 配置到 dmz 区域                                  [root@gateway-server ~]# firewall-cmd --change-interface=ens37 --zone=trusted                             --permanent                                                                                                                      [root@gateway-server ~]# firewall-cmd --change-interface=ens38 --zone=dmz --permanent

(4)查看配置情况

[root@gateway-server~]#firewall-cmd--get-active-zone
dmz
        interfaces: ens38
external
        interfaces:ens33
trusted
        interfaces:ens37

(5)在企业内网测试计算机*问网站服务器                                                                  https:192.168.2.10

(6)关闭 SELinux,更改 ssh 的监听端口,并重启服务                                                        [root@gateway-server~]#setenforce 0
[root@gateway-server~]#vi/etc/ssh/sshd config
Port 12345
[root@gateway-server ~]#systemctl restart sshd

(7)配置 external 区域添加 TCP 的 12345 端口                                                                      [root@gateway-server ~]# firewall-cmd --zone=external --add-port=12345/tcp --permanent

(8)配置 external 区域移除 ssh 服务
[root@gateway-server ~]# firewall-cmd --zone=external --remove-service=ssh --permanent

(9)配置 external 区域禁止 ping
[root@gateway-server~]# firewall-cmd--zone=external--add-icmp-block=echo-request--permanent

(10)重新加载防火墙配置
[root@gateway-server ~]#firewall-cmd --reload

(11)在互联网测试机上通过 ssh 登录网关玩不接口地址的 12345 端口                    [root@localhost~]# ssh -p 12345 100.1.1.10

(12)在企业内网测试机上 ssh 登录 web 网站服务器的 12345 端口                              [root@localhost~]# ssh -p 12345 192.168.2.10

2.2:配置IP 伪装与端口转发

1:内网用户通过网关服务器共享上网

(1)外网测试机搭建网站服务,并添加测试网页
[root@localhost ~]# hostname internet
[root@localhost ~]# bash
[root@internet ~]# yum install -y httpd
[root@internet ~l# vi /var/www/html/index.htm!
internet web
[root@internet ~]# systemctl enable httpd
[root@internet ~]# systemctl start httpd
[root@192 ~]# firewall-cmd --add-service=http --permanentroot@192~#firewall-cmd --reload

(2)在企业内网测试机*问外网网站,结果是可以访问的                                            http://100.1.1.20

(3)在dmz的网站服务器上测试,同样可以访问                                                                     http://100.1.1.20

(4)查看网关服务器的external区域是否开启了地址伪装                                                      [root@internet ~]#firewall-cmd --list-all --zone=external
external
        target: default
        icmp-block-inversion:no
        interfaces:
        sources:
        services: ssh                                                                                                                                    ports:
        protocols:
        masquerade:yes
        forward-ports:
        sourceports:
        icmp-blocks:
        rich rules:

(5)源地址 192.168.1.0/24 网段的地址开启 IP 伪装                                                                         在网关服务器上关闭 external 的地址伪装,添加富规则,要求 external 区域内源地址为192.168.1.0/24 网段的地址开启地址 IP 伪装
[root@gateway-server ~]# firewall-cmd --remove-masquerade --zone=external --[permanent[root@gateway-server ~]# firewall-cmd --zone=external --add-rich-rule='rule family=ipy4 sourceaddress=192.168.1.0/24 masquerade'--permanent

[root@192 ~]# firewall-cmd --reload

(6)在dmz的网站服务器上测试访问外网,应该不能访问外网,但内网可以                      http://100.1.1.20
2:配置端口转发实现互联网用户访问内部 web 服务器                                                                    (1)在网关服务器上配置端口转发
[root@gateway-server~]#firewall-cmd --zone=external-add-forward-port=port=443:proto=tcp:toaddr=192.168.2.10 --permanent

(2)在互联网测试机*问内部web服务器,可以访问成功                                              https://100.1.1.10

(3)端口转发也可以使用富规则,这样就可以更大程度的控制端口转发规则,如给内网的web 服务器申请了一个新的公网 ip 地址 100.1.1.15,需要将新的公网地址 100.1.1.15 配置在网关服务器的外网接口 ens33 上,作为第二个 Ip 地址
[root@gateway-server ~]#vi /etc/sysconfig/network-scripts/ifcfg-ens33                          TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR1=100.1.1.15
PREFIX1=24
IPADDRO=100.1.1.10
PREFIX=24
[root@gateway-server~]#systemctl restart network
[root@gateway-server ~]# ip add
1: 1o: <LOOPBACK,UP,LOWER UP> mtu 65536 qdisc noqueue state UNKNOWN glen 1
        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 qlen 1000

        link/ether 00:0c:29:ae:7f:64 brd ff:ff:ff:ff:ff:ff                                                                                    inet 100.1.1.10/8 brd 100.255.255.255 scope global ens33                                                                  valid_lft forever preferred_lft forever                                                                                      inet 100.1.1.15/24 brd 100.1.1.255 scope global ens33                                                                             valid_lft forever preferred_lft forever

使用富规则配置端口转发
[root@gateway-server ~]# firewall-cmd --zone=external --add-rich-rule='rule family=ipv4destination address=100.1.1.15/32 forward-port port=443 protocol=tcp to-addr=192.168.2.10

在互联网测试机*问,可以访问成功        

https://100.1.1.15

上一篇:Perl 数据类型


下一篇:【遍历链表】个人练习-Leetcode-LCR 029. 循环有序列表的插入