目录
(2)将来自192.168.10.0/24的数据包指向这个链
(3)将192.168.10.202地址加入白名单,允许该主机的ipv4连接
设置external区域中只有192.168.1.0/24网段的数据包才有地址伪装效果
(3)将网关服务器的外网接口设置第二个ip地址,让外网主机能够通过两个IP访问Web服务
(5)最后在外网测试机,使用curl命令测试两个ip能否访问Web服务
直接规则
将iptables的规则插入到firewalld防火墙的策略中
示例
将某个IP范围列入黑名单
防止DDOS攻击
(1)创建一个黑名单功能链
先使用firewall-cmd --direct --add-chain ipv4 raw blacklist命令在规则中添加一个名为 blacklist 的新的ipv4原始防火墙链
- --direct:这个选项告诉firewall-cmd命令直接在防火墙的底层规则中进行操作,而不是通过firewalld的标准配置接口。
- --add-chain ipv4 raw blacklist:在IPv4协议下的原始(raw)表中添加一个名为blacklist的新防火墙链。
- 原始表(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:如果规则匹配,接受(允许)这些数据包。
其他富语言示例
允许了来自 192.168.10.0/24
网段的主机访问 TFTP 服务,并记录相关日志
[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'
允许了来自相同网段的主机访问 TCP 端口范围在 7000 到 8000 的服务
[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"
地址伪装
源地址转换:内网访问外网
目标地址转换:外网访问内部服务器
示例
该示例是基于本人的上一章firewalld防火墙的博客中的示例为基础,在该基础之上实现地址伪装的功能
实现外网主机访问内网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