menu E4b9a6's blog
rss_feed
E4b9a6's blog
有善始者实繁,能克终者盖寡。

Firewalld转发端口

作者:E4b9a6, 创建:2021-06-15, 字数:1745, 已阅:96, 最后更新:2024-03-10

这篇文章更新于 226 天前,文中部分信息可能失效,请自行甄别无效内容。

给服务器做备份时候遇到一个比较复杂的Firewalld防火墙转发问题,先描述一下问题背景

A机器是准备用来备份数据库的机器,网卡IP假设是

  • 224.24.24.24

B机器是应用服务器,有两张网卡它们IP假设分别是

  • 223.23.23.23(外网)
  • 192.168.1.20(内网)

C机器是数据库服务器,只有有一张网卡且IP假设是

  • 192.168.1.24

数据库位于C机器且只监听 192.168.1.24这张网卡,应用部署于A服务器,直接通过内网网卡与B机器数据库交互

现在希望用A服务器来备份C服务器的数据库,那么思路是分为2步

  1. B机器某个端口进行转发,转发到C机器上的数据库端口
  2. B机器允许A机器的访问第1步里设置的转发端口,且也只允许来源为A机器的IP进行访问

按照这个思路动手,首先是Firewalld要转发端口要用到的IP伪装功能,查询IP伪装开启状态

Bash
sudo firewall-cmd --query-masquerade # 输出如果是NO说明没开启

firewall-cmd --add-masquerade --permanent # 开启IP伪装

然后将端口进行转发,假设C服务器的数据库端口是3306,我们要把B机器的33306转发到C机器的3306

在B机器上执行2个步骤如下

Bash
# 1. 将A机器访问的端口进行转发,转发到C机器上
sudo firewall-cmd --add-forward-port=port=33306:proto=tcp:toaddr=192.168.1.24:toport=3306 --permanent
# 2. 允许A机器的访问自己的转发端口且只允许来源为A机器的IP
sudo firewall-cmd --add-rich-rule="rule family="ipv4" source address="224.24.24.24" port protocol="tcp" port="33306" accept" --permanent

# 重新载入配置
sudo firewall-cmd --reload

思路觉得是没问题的,执行之后使用 sudo firewall-cmd --list-all 可以查看规则效果

但测试之后发现即使来源IP不是A机器也能访问B机器的33306端口,显然第2步的设置无效

对于防火墙的原理了解不多,猜测是直接开启端口流量转发之后是RICH规则不再对端口进行限制了

那么思路应该还是没问题的,在设置上考虑了下,也许转发可以直接在 rich rules写明才有效?于是取消掉了前面设置的端口转发

Bash
# 1. 取消 允许A机器的访问自己的某个端口且只允许来源为A机器的IP
sudo firewall-cmd --remove-rich-rule="rule family="ipv4" source address="224.24.24.24" port protocol="tcp" port="33306" accept" --permanent
# 2. 取消 将A机器访问的端口进行转发,转发到C机器上
sudo firewall-cmd --remove-forward-port=port=33306:proto=tcp:toaddr=192.168.1.24:toport=3306 --permanent

那么尝试改成

Bash
sudo firewall-cmd --add-rich-rule = "rule family="ipv4" source address="224.24.24.24" forward-port port="33306" protocol="tcp" to-port="3306" to-addr="192.168.1.24""

再测试下,发现现在只有IP为 224.24.24.24才能访问 B机器的33306端口,其他机器访问会直接显示faild


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]