侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Firewalld 配置端口与端口转发和NAT地址伪装与direct指令

Z同学
2021-12-06 / 0 评论 / 1 点赞 / 473 阅读 / 4,121 字
温馨提示:
本文最后更新于 2021-12-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

在CentOS Firwalld 基础配置中,介绍了防火墙的几种状态查询和开启,以及保存并执行配置。

但是Firewalld在实际使用之中,还有各种端口控制和端口转发等等相关指令。

这篇主要就是针对这种指令深一步了解和学习。

基础篇

下面主要是两个相关配置的基础篇。

CentOS Firewalld 防火墙基础配置 (zinyan.com)

Firewalld zones区域和icmptypes详细介绍 (zinyan.com)

1.控制端口和服务

在Firwalld之中,可以通过两种方式控制端口的开放:

  1. 指定端口号的开启与关闭
  2. 指定服务名的开启与关闭

例如,我们要启动https服务,那么就会自动帮我们开启443端口。我们要启动http服务就会自动帮我们开启80端口。这种我们可以直接通过服务名进行启动。如果我们知道端口也可以直接通过端口启动。

但是要注意:通过服务名启动的需要通过服务名进行关闭。通过端口号启动的,就需要通过端口号关闭

Firewalld不支持所有的端口号都通过服务名进行启动与关闭,具体支持哪些。

我们可以通过指令:firewall-cmd --get-services 进行查询,列出来的服务我们就能够进行开启和关闭。不用我们记忆相关对应的端口。

示例 service:

#示例,开放mysql服务
firewall-cmd --add-service=mysql 
#阻止mysql服务
firewall-cmd --remove-service=mysql 
#查看开放了哪些服务
firewall-cmd --list-services 
    
# firewall-cmd 默认支持的服务
firewall-cmd --get-services  

示例 port:

#开放通过3306端口的tcp访问
firewall-cmd --add-port=3306/tcp
#阻止通过3306端口的tcp访问 
firewall-cmd --remove-port=80/tcp 
#开放通过233端口的udp访问
firewall-cmd --add-port=233/udp
#阻止通过233端口的udp访问
firewall-cmd --remove-port=233/udp
#查看已经开放的所有端口
firewall-cmd --list-ports 

上面的开放关闭在重启之后会被重置。我们如果需要重启后仍然生效。就需要在上面添加 :--permanent 字段。

例如:永久开放1723端口的tcp访问。

firewall-cmd --permanent --add-port=1723/tcp

2.IP伪装

防火墙可以实现伪装ip的功能。端口转发就是利用了ip伪装。

例如各种代理服务的ip伪装。

实例:

# 检查是否允许伪装IP
firewall-cmd --query-masquerade 
# 允许防火墙伪装IP
firewall-cmd --add-masquerade 
# 禁止防火墙伪装IP
firewall-cmd --remove-masquerade

注意: 你如果设置允许ip伪装时,添加了--permanent。那么你禁止的是也要加上--permanent

3.端口转发

端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。

转发的目的如果不指定ip的话就默认为本机。如果指定了ip却没指定端口,则默认使用来源端口。

示例:

port 是入口端口,转发到toport端口

# 将80端口的流量转发至8080端口,后面没有指定ip就是是本机ip。如果指定ip 就会转发给指定服务
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 将80端口的流量请求,直接转发给指定的ip地址。会默认访问这个ip地址的80端口。
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1
# 将80端口的流量请求,直接转发给指定的ip地址的指定端口号8080。
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080

端口转发的使用场景:

  • 我们想隐藏端口时,就可以通过端口转发。将实际端口隐藏起来,访问一个自定义端口,提高安全性。避免端口攻击
  • 端口转发还能实现流量分发。可以通过ip地址,把访问的流量发送给不同的服务器处理。

我们在执行端口转发的时候,如果是服务器内端口转发,例如上面的例子中80端口转8080端口。

我们直接配置即可。

但是如果是服务器之间的端口转发。例如上面的例子中,指定了转发ip的情况、我们就需要开启ip伪装功能。才能正常转发,否则服务器键端口转发就不能成功发送。

4.NAT 地址伪装

NAT(NetworkAddressTranslation,网络地址转换),其作用是将私网的设备IP转换为公网设备IP,使得私网的设备可以访问公网以获取相应的服务。

更详细的NAT概念。那就复杂了。如果有感兴趣的小伙伴可以自行去了解。

下面主要是介绍如何在Firewalld中配置NAT伪装,以及相关配置而已。

在Firewalld中,通过规则和策略也就是rules 和passthroughs来实现的。下面也主要介绍这两个参数

direct 相关函数

说明:其中的花括号是选项,就是后面的参数在这三个中选择。后面的 table 或者chain就是具体的函数值了。

chains 链

查询所有的Chains 链:firewall-cmd --direct --get-all-chains

获取指定表中的Chains:firewall-cmd --direct --get-chains {ipv4|ipv6|eb} <table>

移除指定表中的Chains: firewall-cmd --direct --remove-chain {ipv4|ipv6|eb} <table> <chain>

查询Chains是否被添加到表中:firewall-cmd --direct --query-chain {ipv4|ipv6|eb} <table> <chain>

rules 策略规则

获取所有的策略规则:firewall-cmd --direct --get-all-rules

获取指定表中的指定链chain中的规则:firewall-cmd --direct --get-rules {ipv4|ipv6|eb} <table> <chain>

在指定表和指定链中添加rules策略:firewall-cmd --direct --add-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg>...

从指定表指定链中删除rules:firewall-cmd --direct --remove-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg>...

从表中删除规则rules:firewall-cmd --direct --remove-rules {ipv4|ipv6|eb} <table> <chain>

查询指定rules是否添加:firewall-cmd --direct --query-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg>...

passthroughs 直通规则

这个其实就是将Firewall配置的拦截逻辑直接下发到iptables的命令。

因为Firewalld底部也使用了iptables。

通过这个指令下发的防火墙指令优先级要高于其他指令。

获取所有直通传递的规则:firewall-cmd --direct --get-all-passthroughs

移除直通规则:firewall-cmd --direct--remove-passthrough {ipv4|ipv6|eb}

获取指定arg的规则:firewall-cmd --direct --get-passthroughs {ipv4|ipv6|eb} <arg>...

添加一个直通规则:firewall-cmd --direct --add-passthrough {ipv4|ipv6|eb} <arg>...

移除一个指定的直通规则:firewall-cmd --direct --add-passthrough{ipv4|ipv6|eb} <arg>...

查询直通规则是否添加成功:firewall-cmd --direct --query-passthrough {ipv4|ipv6|eb} <arg>...

我们在设置NAT地址转发的时候,大部分情况下,就是用的passthrough来实现的。

示例:
实现内网共享上网的配置效果

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth1 -j MASQUERADE -s 172.25.0.0/24

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth1 -j SNAT -s 172.25.0.0/24 --to-source <外网IP>

firewall-cmd --direct --get-all-passthroughs

而关于passthrough后面的参数介绍,你可以通过iptables了解和学习。

防火墙如果想更深入。需要学习的地方还很多。我这里只是一个简单分享一下

1

评论区