接上文 CentOS 7 使用 iptables 端口转发 之前配置端口转发是关闭 firewalld 程序的, 在后续更新服务器时使用上了 firewalld 这导致使用 iptables 配置的端口转发一直是失效状态
找了很多原因才想起试试配置 firewalld 转发, 意料之中 转发设置成功了~
控制端口 / 服务
可以通过两种方式控制端口的开放
- 指定端口号
- 指定服务名
虽然开放 HTTP 服务实际上就是开放了 80 端口, 但不能仅通过端口号来关闭服务。也就是说, 如果是通过服务名 (如 HTTP) 开放的端口, 则需要通过指定服务名来关闭;如果是通过端口号 (如 80) 开放的, 则需要通过端口号来关闭。
另外, 指定端口时一定要明确协议类型 (如 TCP 或 UDP)。掌握了这一点后, 你就不需要每次关闭防火墙再重新配置, 可以让防火墙真正的生效。
firewall-cmd --add-service=mysql # 开放 MySQL 服务端口
firewall-cmd --remove-service=http # 删除 HTTP 服务端口
firewall-cmd --list-services # 查看开放的服务
firewall-cmd --add-port=3306/tcp # 开放通过 TCP 协议访问 3306
firewall-cmd --add-port=233/udp # 开放通过 UDP 协议访问 233
firewall-cmd --remove-port=80/tcp # 删除通过 TCP 协议访问 3306
firewall-cmd --list-ports # 查看开放的端口
端口转发
在 CentOS 7 中, 如果你使用了 firewalld
来管理防火墙, 端口转发的配置需要通过 firewall-cmd
命令来实现
可以实现的功能
-
隐藏端口
如果你想将某个端口隐藏, 可以先通过防火墙阻止该端口, 然后配置另一个不常见的端口, 将流量转发至原端口 -
流量分发
通过端口转发, 可以将不同端口的流量转发至不同的机器或服务。这适用于在一个防火墙后管理多个不同的服务和主机 (堡垒机)
端口转发允许将指定端口的流量转发到其他 IP 或端口。转发的目的地址和端口可以根据需要指定。
将 80
端口的流量转发到 8080
端口
指定了目的端口却没指定目的 IP, 则默认为本机
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
将 80
端口的流量转发到指定 IP 地址
指定了目的 IP 却没指定端口, 则使用原端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 --permanent
将 80
端口的流量转发到指定 IP 地址和端口
例如转发至 192.168.0.1
的 8080
端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 --permanent
检查端口转发是否生效
如果配置好端口转发之后不能用, 可以检查下面两个问题
-
比如我将 80 端口转发至
192.168.0.1:8080
, 首先检查本地的 80 端口和目标的 8080 端口是否开放监听了 -
其次检查是否允许伪装 IP, 没允许的话要开启伪装 IP
实例
将 443
端口的流量转发到 192.168.1.100:8443
firewall-cmd --add-masquerade --permanent
firewall-cmd --add-forward-port=port=443:proto=tcp:toaddr=192.168.1.100:toport=8443 --permanent
firewall-cmd --add-port=443/tcp --permanent
伪装 IP (NAT 功能)
伪装 IP (或 NAT) 功能可以使得网络流量从一个IP地址通过防火墙转发到内部网络中的不同地址。启用此功能后, 可以进行端口转发
检查防火墙是否允许伪装 IP
firewall-cmd --query-masquerade
启用防火墙伪装 IP
firewall-cmd --add-masquerade --permanent
禁用防火墙伪装 IP
firewall-cmd --remove-masquerade --permanent
原文
CentOS 7下用firewall-cmd控制端口与端口转发详解
CentOS 7 使用 iptables 端口转发
CentOS 7 firewalld 配置教程