firewalld介绍、rich规则、伪装和端口转发

本文详细介绍Firewalld防火墙的高级配置方法,包括区域(zone)管理、预定义服务、富规则(Rich Rules)的使用及端口转发、伪装等功能。Firewalld是CentOS 7.0中用于管理netfilter的工具,支持iptables、ip6tables和ebtables功能。

firewalld介绍

firewalld是CentOS 7.0新推出的管理netfilter的工具
firewalld是配置和监控防火墙规则的系统守护进程。可以实现iptables,ip6tables,ebtables的功能
firewalld服务由firewalld包提供

firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
归入zone顺序:
  先根据数据包中源地址,将其纳为某个zone
  纳为网络接口所属zone
  纳入默认zone,默认为public zone,管理员可以改为其它zone

网卡默认属于public zone,lo网络接口属于trusted zone

预设zone的作用:
trusted:允许所有流量

home:拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量

internal:和home相同

work:拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量

public:拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于public zone

external:拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。

dmz:拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量

block:拒绝除和传出流量相关的所有传入流量

drop:拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应)

firewalld配置

firewall-cmd --get-services 查看预定义服务列表
/usr/lib/firewalld/services/*.xml预定义服务的配置

三种配置方法
firewall-config (firewall-config包)图形工具
firewall-cmd (firewalld包)命令行工具
/etc/firewalld 配置文件,一般不建议

firewall-cmd 命令选项

–get-zones 列出所有可用区域

–get-default-zone 查询默认区域

–set-default-zone=设置默认区域

–get-active-zones 列出当前正使用的区域

–add-source=[–zone=]添加源地址的流量到指定区域,如果无–zone= 选项,使用默认区域

–remove-source= [–zone=] 从指定区域中删除源地址的流量,如无–zone= 选项,使用默认区域

–add-interface=[–zone=] 添加

–change-interface=[–zone=] 改变指定接口至新的区域,如果无–zone= 选项,使用默认区域

–add-service= [–zone=] 允许服务的流量通过,如果无–zone= 选项,使用默认区域

–add-port=<PORT/PROTOCOL>[–zone=] 允许指定端口和协议的流量,如果无–zone= 选项,使用默认区域

–remove-service= [–zone=] 从区域中删除指定服务,禁止该服务流量,如果无–zone= 选项,使用默认区域

–remove-port=<PORT/PROTOCOL>[–zone=] 从区域中删除指定端口和协议,禁止该端口的流量,如果无–zone= 选项,使用默认区域

–reload 删除当前运行时配置,应用加载永久配置

–list-services 查看开放的服务

–list-ports 查看开放的端口

–list-all [–zone=] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无–zone= 选项,使用默认区域

查看默认zone
firewall-cmd --get-default-zone

默认zone设为dmz
firewall-cmd --set-default-zone=dmz

添加开放80TCP端口
firewall-cmd --add-port=80/tcp

在internal zone中增加源地址192.168.0.0/24的永久规则
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24

在internal zone中增加协议mysql的永久规则
firewall-cmd --permanent –zone=internal --add-service=mysql

加载新规则以生效
firewall-cmd --reload

firewall跟其他防火墙功能的服务有冲突,如有其他服务建议锁住不让启动
systemctl mask iptables
systemctl mask ip6tables

当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
rich-rules 富规则,功能强,表达性语言
Direct configuration rules 直接规则,灵活性差
帮助:man 5 firewalld.direct

rich规则

rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率

rich语法:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]

参考:
man 5 firewalld.richlanguage

rich规则实施顺序:
当前区域的端口转发,伪装规则
当前区域的日志规则
当前区域的允许规则
当前区域的拒绝规则
每个匹配的规则生效,所有规则都不匹配,当前区域默认规则生效

示例:
拒绝从192.168.1.10的所有流量,当address 选项使用source 或 destination时,必须用family= ipv4 |ipv6
firewall-cmd --permanent --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.1.10/32 reject‘

限制每分钟只有两个连接到ftp服务
firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/maccept’

抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包
firewall-cmd --permanent --add-rich-rule=‘rule protocol value=esp drop’

接受所有192.168.1.0/24子网端口1000-1500范围的TCP流量
firewall-cmd --permanent --zone=vnc --add-rich-rule=‘rule family=ipv4source address=192.168.1.0/24 port port=1000-1500 protocol=tcp accept’

rich日志规则
log [prefix=" " [level= ] [limit
value=" <RATE/DURATION> “]
可以是emerg,alert, crit, error, warning, notice, info, debug.
s:秒, m:分钟, h:小时, d:天
audit [limit value=” <RATE/DURATION>

示例:
接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
firewall-cmd --permanent --zone=work --add-rich-rule='rule servicename=“ssh” log prefix="ssh " level=“notice” limit value=“3/m” accept

从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息
firewall-cmd --add-rich-rule=‘rule family=ipv6 sourceaddress=“2001:db8::/64” service name=“dns” audit limit value="1/h"reject’ --timeout=300

伪装和端口转发

firewalld支持伪装和端口转发两种NAT方式
firewall-cmd --permanent --zone= --add-masquerade
firewall-cmd --query-masquerade 检查是否允许伪装
firewall-cmd --add-masquerade 允许防火墙伪装IP
firewall-cmd --remove-masquerade 禁止防火墙伪装IP

示例:
firewall-cmd --add-rich-rule=‘rule family=ipv4 source address=192.168.0.0/24 masquerade’

端口转发

端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪装才能实现

firewall-cmd --permanent --zone= --add-forward-port=port= :proto= [:toport= ][:toaddr= ]
说明:toport= 和toaddr= 至少要指定一个

示例:
转发传入的连接8080/TCP,到防火墙的80/TCP到public zone 的192.168.1.10
firewall-cmd --add-masquerade 启用伪装
firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.10

rich规则语法:
forward-port port= protocol= tcp|udp [to-port= <PORTNUM> ] [to-addr= <ADDRESS> ]

示例:
转发从192.168.1.0/24来的,发往8080/TCP的流量到防火墙的端口80/TCP
firewall-cmd --zone=work --add-rich-rule=‘rule family=ipv4 sourceaddress=192.168.1.0/24 forward-port port=8080 protocol=tcp to-port=80’

<think>好的,我现在需要帮助用户解决如何使用firewalld配置本地端口转发到另一台服务器的SSH端口22的问题。首先,我得回顾一下用户提供的引用内容,看看有没有相关的配置方法。 用户提到了几个引用,其中引用[3]提到端口转发可以将流量从指定IP端口转发到不同计算机的端口,这正是用户需要的。引用[5]提到了使用rich rule配置DNAT,将50022端口转发到目标IP的22端口,这应该就是关键步骤了。另外,引用[4]提到需要开启IP伪装端口转发,所以需要先检查这些设置是否已配置。 首先,我需要确保IP转发已经开启。根据引用[4],需要修改sysctl.conf并启用ip_forward,然后使用firewall-cmd开启masquerade。用户可能已经做过这一步,但最好在步骤中包括这些,避免遗漏。 接下来,配置端口转发的具体命令。根据引用[5],使用rich rule的forward-port参数,指定本机端口、协议目标地址及端口。例如,用户想将本地的50022转发到192.168.2.10的22端口,命令应该是添加一条富规则端口为50022,协议tcp,目标地址192.168.2.10,目标端口22。同时需要永久生效并重新加载防火墙。 另外,引用[1][2]提到了不同的方法,比如使用--zone=external--direct规则,但根据用户的问题,使用富规则可能更直接容易管理,如引用[5]所示。 还需要提醒用户检查SELinux是否允许端口转发,以及防火墙是否开放了转发端口。例如,如果本机50022端口被防火墙阻止,即使转发规则正确,连接也会失败。所以可能需要添加对应的端口开放规则,或者确保所在区域允许该端口。 总结步骤应该是:1. 开启IP转发IP伪装;2. 添加富规则进行端口转发;3. 重新加载防火墙;4. 验证配置测试连接。同时,给出示例命令,并解释每个参数的作用,比如--permanent表示永久生效,--reload使配置立即应用。 可能还需要注意用户的实际环境,比如目标服务器的IP是否正确,本机是否有其他防火墙规则冲突,以及测试时的SSH命令是否正确使用转发后的端口。 最后,生成相关问题,比如如何测试端口转发是否成功,或者如何移除规则,以及处理可能出现的常见错误,如连接被拒绝或超时等。</think>### 使用 firewalld 配置本地端口转发到其他服务器的 SSH 端口 #### **步骤说明** 1. **开启 IP 转发伪装** firewalld 需启用 IP 伪装(masquerade)并确保系统内核允许 IP 转发: ```bash # 启用内核IP转发 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p # 启用firewalld的IP伪装 firewall-cmd --add-masquerade --permanent firewall-cmd --reload ``` [^4] 2. **添加端口转发规则** 使用富规则rich rule)配置 DNAT 转发,例如将本机 `50022` 端口转发至目标服务器 `192.168.2.10` 的 `22` 端口: ```bash firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" forward-port port="50022" protocol="tcp" to-port="22" to-addr="192.168.2.10" ' firewall-cmd --reload ``` [^5] 3. **验证规则** ```bash firewall-cmd --list-all --zone=public # 查看是否包含forward-port规则 ``` 4. **测试连接** ```bash ssh -p 50022 user@本机IP # 实际连接到目标服务器的22端口 ``` --- #### **关键参数解释** - `forward-port`: 指定转发端口(`port="50022"`)。 - `protocol="tcp"`: 仅转发 TCP 流量(SSH 使用 TCP)。 - `to-addr` `to-port`: 目标服务器的 IP 端口。 - `--permanent`: 永久生效,否则重启后规则丢失。 --- #### **注意事项** 1. **SELinux 配置** 若系统启用 SELinux,需确保允许端口转发: ```bash semanage port -a -t ssh_port_t -p tcp 50022 ``` 2. **防火墙区域选择** 规则需添加到接收流量的区域(如 `public` 或 `external`),需根据实际网络环境调整[^3]。 3. **端口开放** 若本机防火墙限制 `50022` 端口,需额外开放: ```bash firewall-cmd --permanent --add-port=50022/tcp firewall-cmd --reload ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值