
簡而言之,我手上有一個叢集系統,為此我必須通過它的主控來路由流量。從節點到外部世界的路由流量正常,但從我們部門的子網路到節點的路由流量失敗。不幸的是,將節點添加到我們的子網路中是不可能的。
設定
叢集由一個主節點和一些節點以及一些外圍節點組成。這些節點位於內部網路上,對我們的內部網路或網路隱藏。主伺服器上已經設定了 NAT,因此節點可以存取內部和外部伺服器。這部分有效。
主站的外部介面與我們的工作站電腦位於同一子網路中,它們共用一個不受我們控制的網關。
編輯:叢集運行 CentOS 7,PC 運行基於 Ubuntu xenial 的發行版。
任務
我們的一些軟體包需要直接存取節點。為此,我們希望使用 iptables 在 master 上設定第二個 NAT,並在 PC 上新增 ip 路由以透過 master 將流量傳送至 10.10.1.0/24。
配置
主控:ip 路由
default via 123.45.67.254 dev eth0 proto static metric 100
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.0.1
123.45.67.0/23 dev eth0 proto kernel scope link src 123.45.67.204 metric 100
主控:iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 7356 packets, 880K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 4884 packets, 687K bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3445 packets, 225K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 3445 packets, 225K bytes)
pkts bytes target prot opt in out source destination
439 33324 MASQUERADE all -- * eth0 10.10.1.0/24 0.0.0.0/0
61828 3710K MASQUERADE all -- * eth1 123.45.67.0/23 10.10.1.0/24
使用 SNAT 代替 MASQUERADE 沒有區別。
節點:ip路由
default via 10.10.0.1 dev eth1
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.1.1
電腦:ip 路由
default via 123.45.67.254 dev eth0 proto static metric 100
10.10.0.0/16 via 123.45.67.204 dev eth0
123.45.67.0/23 dev eth0 proto kernel scope link src 123.45.67.191 metric 100
到目前為止的診斷
- 從 node01 到 internet/intranet/pcs 的 NAT 工作完美。
- TCP 握手期間從 pc1 到 node01 的 NAT 失敗:
- SYN透過master傳遞到node01,在tcpdump中標記為SYN_RECV
- SYN+ACK從node01發送到master
- SYN+ACK 出現在 master 上的 tcpdump 中,並傳遞給過濾器
- tcpdump 顯示通過過濾器的 SYN+ACK
- iptables 顯示透過篩選器 FORWARD、mangle FORWARD + POSTROUTING 的 SYN+ACK 包
- SYN+ACK 套件永遠不會通過 nat POSTROUTING(應該嗎?)
- SYN+ACK 封包永遠不會到達 pc1
- 當然,握手失敗
- pc1 陷入 SYN_SENT 狀態
- node01 陷入 SYN_RECV 狀態
- 最終,連線逾時
- 我無法在網關監控包
我最好的猜測是,途中的狀態路由器會丟棄 SYN+ACK 封包,因為它的來源位址在主裝置上被重寫,因此它與原始 SYN 封包的關係丟失了。
我們怎麼才能讓它發揮作用?
讓我知道是否需要額外的配置/日誌。