需求说明

将本机 (IP: 192.168.174.193) 发往 192.168.174.165:443 的流量转发到 另一节点 192.168.174.149:20037(nginx 4层代理到192.168.174.165:443)

启用 IP 转发

# 节点IP: 192.168.174.193
sysctl -w net.ipv4.ip_forward=1

代理节点配置

# 节点IP:192.168.174.149
server {
    listen 20037;

    proxy_pass 192.168.174.165:443;

}

配置防火墙规则

# 节点IP: 192.168.174.193

DNAT 规则

sudo firewall-cmd --permanent --direct --add-rule ipv4 nat OUTPUT 0 -p tcp -s 192.168.174.193 -d 192.168.174.165 --dport 443 -j DNAT --to-destination 192.168.174.149:20037
详细说明:
-t nat:指定操作 nat表,用于网络地址转换

-A OUTPUT:将规则添加到 OUTPUT链,处理本机发出的数据包

-p tcp:匹配 TCP 协议的数据包

-s 192.168.174.193:匹配源 IP 地址为本机 IP 10.246.204.193

-d 192.168.174.165:匹配目标 IP 地址为 192.168.174.165

--dport 443:匹配目标端口为 443 (HTTPS)

-j DNAT:执行目标网络地址转换

--to-destination 192.168.174.149:20037:将目标地址重写为 192.168.174.149:20037
工作原理:
当本机应用程序尝试连接到 192.168.174.165:443时,这条规则会:

识别匹配的流量(源 IP 为本机,目标为指定 IP 和端口)

修改数据包的目标地址为 192.168.174.149:20037

数据包继续进入路由决策过程

FORWARD 规则

sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 destination address=192.168.174.149 port port=20037 protocol=tcp accept'
详细说明:
-A FORWARD:添加到 FORWARD链,处理需要转发的数据包

-p tcp:匹配 TCP 协议

-d 192.168.174.149:匹配目标 IP 为 192.168.174.149

--dport 20037:匹配目标端口为 20037

-j ACCEPT:允许匹配的数据包通过
工作原理:
当数据包被 DNAT 修改后,它成为转发流量

这条规则明确允许转发到目标地址和端口的流量

如果防火墙默认策略是 DROP,这条规则是必需的

重新加载规则

sudo firewall-cmd --reload

验证配置

# 查看富规则
sudo firewall-cmd --list-rich-rules

# 查看直接规则
sudo firewall-cmd --direct --get-all-rules

# 查看所有规则
sudo firewall-cmd --list-all

完整数据流路径

+---------------------+          +---------------------+          +---------------------+
|    本机应用程序       |         | 192.168.174.193     |          |     目标服务器       |
| (192.168.174.193)    |          | (firewalld 防火墙)  |          | (192.168.174.149)    |
+----------+----------+          +----------+----------+          +----------+----------+
           |                                |                                |
           | 1. 请求:                      |                                |
           | SRC:192.168.174.193:54321      |                                |
           | DST:192.168.174.165:443       |                                |
           +------------------------------>|                                |
           |                                |                                |
           |                                | 2. OUTPUT链 DNAT:             |
           |                                | (firewalld 直接规则)          |
           |                                | DST改为192.168.174.149:20037   |
           |                                |--+                             |
           |                                |  |                             |
           |                                |  | 3. 路由决策: 需要转发       |
           |                                |  |                             |
           |                                |  | 4. FORWARD链: 允许         |
           |                                |  | (firewalld 富规则)          |
           |                                |  |                             |
           |                                |  | 5. POSTROUTING链 SNAT:     |
           |                                |  | (firewalld 直接规则)        |
           |                                |                                |
           |                                |                                | 6. 请求:
           |                                |                                | SRC:192.168.174.193:54321
           |                                |                                | DST:192.168.174.149:20037
           |                                +------------------------------->|
           |                                |                                |
           |                                |                                | 7. 响应:
           |                                |                                | SRC:192.168.174.149:20037
           |                                |                                | DST:192.168.174.193:54321
           |                                |<-------------------------------+
           |                                |                                |
           |                                | 8. 连接跟踪反向NAT:            |
           |                                | SRC还原为192.168.174.165:443    |
           |<------------------------------+                                |
           | 9. 响应:                       |                                |
           | SRC:192.168.174.165:443        |                                |
           | DST:192.168.174.193:54321       |                                |
           |                                |                                |
+----------+----------+          +----------+----------+          +----------+----------+

关键机制说明

连接跟踪 (conntrack)

# 内核自动维护连接状态

原始请求: 192.168.174.193:54321 -> 192.168.174.165:443
修改后请求: 192.168.174.193:54321 -> 192.168.174.149:20037
响应: 192.168.174.149:20037 -> 192.168.174.193:54321
还原后响应: 192.168.174.165:443 -> 192.168.174.193:54321

监控连接

# 查看连接跟踪
conntrack -L

# 实时监控
conntrack -E