需求說明
將本機 (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