firewalld防火墙

发布于:2024-07-03 ⋅ 阅读:(7) ⋅ 点赞:(0)

目录

直接规则

示例

(1)创建一个黑名单功能链

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

(3)每分钟记录一次日志

(4)设置该链的规则为DROP

(5)重载firewalld

清空直接规则

富语言

示例

(1)允许连接http,并使用审核每分钟记录一次

(2)测试

(3)将192.168.10.202地址加入白名单,允许该主机的ipv4连接

地址伪装

示例

(1)设置external区域地址伪装

关闭地址伪装、重载

设置external区域中只有192.168.1.0/24网段的数据包才有地址伪装效果

(2)端口转发

(3)将网关服务器的外网接口设置第二个ip地址,让外网主机能够通过两个IP访问Web服务

(4)使用富规则配置端口转发

(5)最后在外网测试机,使用curl命令测试两个ip能否访问Web服务


直接规则

将iptables的规则插入到firewalld防火墙的策略中

示例

将某个IP范围列入黑名单

防止DDOS攻击

(1)创建一个黑名单功能链

先使用firewall-cmd --direct --add-chain ipv4 raw blacklist命令在规则中添加一个名为 blacklist 的新的ipv4原始防火墙链

  1. --direct:这个选项告诉firewall-cmd命令直接在防火墙的底层规则中进行操作,而不是通过firewalld的标准配置接口。
  2. --add-chain ipv4 raw blacklist:在IPv4协议下的原始(raw)表中添加一个名为blacklist的新防火墙链。
    1. 原始表(raw table)是Linux防火墙的一部分,它允许更低层次的处理,通常用于某些特定的高级网络配置和包过滤。

由此命令也可以延伸出其他功能

firewall-cmd --direct --remove-chain ipv4 raw blacklist:删除一个名为blacklist的ipv4原始防火墙链

firewall-cmd --direct --add-chain ipv4 raw blacklist --permanent:在规则中永久添加一个名为 blacklist 的新的ipv4原始防火墙链

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

再在该链上加一条规则,用于将指定网段的数据包跳转到blacklist链中

[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.10.0/24 -j blacklist PREROUTING: 原始表中的PREROUTING链,该链用于处理进入主机的数据包。 0: 规则的编号。这里的0表示第1行规则,优先级最高,规则从0开始。 -s 192.168.10.0/24: 源IP地址为192.168.10.0/24,匹配从这个网段发起的数据包。 -j blacklist: 如果数据包符合上述条件,则将其跳转到名为 blacklist 的防火墙链进行进一步处理。

(3)每分钟记录一次日志

记录匹配特定条件的流量

[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklist" blacklist 0:将规则添加到blacklist链中,0是规则的编号 -m limit --limit 1/min:使用limit模块限制每分钟记录的日志消息数量为1条。 -j LOG --log-prefix "blacklist":指定匹配的数据包应该使用前缀“blacklist”进行日志记录。

(4)设置该链的规则为DROP

在该链中添加一条规则,编号为 1,该规则的动作是丢弃 (DROP) 匹配的数据包。

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

(5)重载firewalld

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

此时另一台虚拟机就ping不通了这台配置规则的主机了

使用另一台机器ping过以后,因为是规则指定范围内的IP,所以在/var/log/message日志文件中就可以看到相关日志,以及我们设置的前缀为blacklist

清空直接规则

cd到/etc/firewalld目录下,删除direct.xml文件,再重载防火墙就行了


富语言

 firewalld的富语言(rich language)提供了一种不需要了解 iptables 语法的通过高级语言配置复杂 IPv4和IPv6 防火墙规则的机制,为管理员提供了一种表达性语言,通过这种语言可以表达firewalld 的基本语法中未涵盖的自定义防火墙规则。

示例

需求:允许主机建立连接,并且每分钟审核一下

yum -y install httpd安装Apache软件包

(1)允许连接http,并使用审核每分钟记录一次

[root@localhost ~]# firewall-cmd --add-rich-rule='rule service name=http log prefix=httpAccess limit value=1/m audit accept' --add-rich-rule:用于添加富规则。

(2)测试

使用echo "Test Web" > /var/www/html/index.html命令修改http服务的首页

另一台主机curl测试

201主机cat /var/log/message

(3)将192.168.10.202地址加入白名单,允许该主机的ipv4连接

[root@localhost firewalld]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.10.202" accept' --add-rich-rule:用于添加富规则。 family="ipv4":规定规则适用于 IPv4 地址族。 source address="192.168.10.202":指定允许来自 IP 地址 192.168.10.202 的流量通过。 accept:如果规则匹配,接受(允许)这些数据包。 [root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="tftp" log prefix="MyTFTPLOG: " level="info" limit value="1/m" accept [root@localhost ~]# firewall-cmd --zone=dmz --add-rich-rule="rule family='ipv4' source address='192.168.10.0/24' port port='7000-8000' protocol='tcp' accept"

地址伪装

源地址转换:内网访问外网

目标地址转换:外网访问内部服务器

示例

实现外网主机访问内网Web服务器dmz区域的Web服务

需要在网关服务器做地址转换

(1)设置external区域地址伪装
[root@gateway-server ~]# firewall-cmd --list-all --zone=external 
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: 
  ports: 12345/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: echo-request
  rich rules: 
关闭地址伪装、重载
[root@gateway-server ~]# firewall-cmd --remove-masquerade --zone=external --permanent
[root@gateway-server ~]# firewall-cmd --reload

此时内网的主机和服务器就不能访问外网了(ping)

设置external区域中只有192.168.1.0/24网段的数据包才有地址伪装效果

只有192.168.1.0/24网段的包才有地址伪装效果(可以访问外网主机),而内网Web服务器(192.168.2.10)就不能访问外网主机

[root@gateway-server ~]# firewall-cmd --zone=external --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' masquerade" --permanent
success
[root@gateway-server ~]# firewall-cmd --reload
success
[root@gateway-server ~]# firewall-cmd --list-all --zone=external
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: 
  ports: 12345/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: echo-request
  rich rules: 
    rule family="ipv4" source address="192.168.1.0/24" masquerade
(2)端口转发

将所有进入防火墙外部区域(external)的80端口的TCP流量转发到内部网络的192.168.2.10主机上

[root@gateway-server ~]# firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:proto=tcp:toaddr=192.168.2.10 --permanent
收到来自外网的80端口且是tcp协议的包;转发到192.168.2.10的80端口,也是tcp协议的
[root@gateway-server ~]# firewall-cmd --reload # 重启服务
  • port=80:proto=tcp:proto=tcp:toaddr=192.168.2.10 这部分指定了具体的转发规则
    • port=80: 表示要转发的端口是80端口,即HTTP服务的标准端口。
    • proto=tcp: 指定协议为TCP,这是HTTP服务使用的协议。
    • toaddr=192.168.2.10: 指定转发的目标地址,即所有发往防火墙的80端口的TCP流量都将被转发到192.168.2.10这台主机。

此时就实现了内网测试机可以访问内网Web服务器的http服务,外网测试机也能访问内网Web服务器的http服务,但是外网测试机不能访问整个内网,内网测试机却可以访问外网测试机

(3)将网关服务器的外网接口设置第二个ip地址,让外网主机能够通过两个IP访问Web服务

假如内网的Web服务器新申请了一个公网ip 100.1.1.15,将新的公网ip设置网关服务器的外网网卡ens33,作为第二个ip地址

vim /etc/sysconfig/network-scripts/ifcfg-ens33

使用ip a命令的效果,可以看到ens33接口有两个ip

(4)使用富规则配置端口转发
[root@gateway-server network-scripts]# firewall-cmd --zone=external --add-rich-rule="rule family=ipv4 destination address=100.1.1.15/32 forward-port port=80 protocol=tcp to-addr=192.168.2.10" --permanent
[root@gateway-server network-scripts]# firewall-cmd --reload
(5)最后在外网测试机,使用curl命令测试两个ip能否访问Web服务