Networking

iptables PREROUTING 無效

  • June 7, 2021

我們在 AWS 中執行 ubuntu 20.04。我們正在嘗試設置一個 iptables 規則,以便任何具有虛擬 IP 地址的 MySQL 流量都將轉發到同一 VPC 中位於 172.31.6.173 的 MySql 數據庫。讓我解釋:

此任務中的 IP 地址:

Ubuntu 伺服器(來源):172.31.0.151

MySql 伺服器(目標):172.31.6.173

MySql 虛擬 IP:6.6.6.6

從 172.31.0.151(源)我們將連接到虛擬 IP(6.6.6.6)的 mysql,它將被 NAT 到目標(172.31.6.173)。

我們使用的規則:

sudo iptables -t nat -A PREROUTING -s 172.31.0.151 -d 6.6.6.6 -j DNAT --to-destination 172.31.6.173
sudo iptables -A FORWARD -p tcp -d 172.31.6.173 -j ACCEPT

第一行指定來自 172.31.0.151 的任何流量,目的地為 6.6.6.6,將被轉發到 172.31.6.173

第二行接受所有 tcp 轉發到 172.31.6.173。

這些是 iptables 中唯一的規則,如果我執行sudo iptables -t nat -L,結果是:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  172.31.0.151         6.6.6.6              to:172.31.6.173

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

但是,當我嘗試以虛擬 IP 登錄 MySql 時,從源(172.31.0.151)伺服器有了這兩個規則:

mysql -h 6.6.6.6 -u username -p

tcpdump 輸出:(MySql 伺服器是一個 RDS 實例,這意味著我無法登錄執行 tcpdump,所以我只能從源伺服器獲取 tcpdump):

13:41:41.768171 IP 172.31.0.151.50374 > 6.6.6.6.mysql:標誌

$$ S $$, seq 3441229166, 贏得 62727, 選項$$ mss 8961,sackOK,TS val 2723434614 ecr 0,nop,wscale 7 $$, 長度 0 13:41:45.992114 IP 172.31.0.151.50374 > 6.6.6.6.mysql:標誌

$$ S $$, seq 3441229166, 贏得 62727, 選項$$ mss 8961,sackOK,TS val 2723438838 ecr 0,nop,wscale 7 $$, 長度 0 13:41:54.184186 IP 172.31.0.151.50374 > 6.6.6.6.mysql:標誌

$$ S $$, seq 3441229166, 贏得 62727, 選項$$ mss 8961,sackOK,TS val 2723447030 ecr 0,nop,wscale 7 $$, 長度 0

PREROUTING 規則未生效,登錄嘗試仍在尋找位於 6.6.6.6 的伺服器,而不是 NAT 到實際 IP 地址 172.31.6.173。

任何建議將被認真考慮。謝謝你。

我假設 OP 的規則已添加到 IP 地址為 172.31.0.151 的 Ubuntu 系統中,該系統隨後將啟動 mysql 連接到一個虛擬地址。

從這個Netfilter 和通用網路示意圖 中可以看出:Netfilter 和通用網路中的數據包流

  • 由本地程序發起的流中的第一個數據包不會遍歷 nat/PREROUTING,
  • 但它確實遍歷了 nat/OUTPUT,
  • 只有連接的第一個數據包(狀態 NEW)會遍歷nat表(因此,像回复這樣的其他數據包在這裡無論如何都無關緊要)。

所以 nat/PREROUTING 對重定向本地發起的連接沒有影響。這應該在 nat/OUTPUT 中完成。因為這甚至可能改變要使用的介面(可能不是在 OP 的情況下),這會觸發稍後的重新路由檢查以處理這種情況。

最後,您的規則應添加:

sudo iptables -t nat -A OUTPUT -s 172.31.0.151 -d 6.6.6.6 -j DNAT --to-destination 172.31.6.173

如果系統只有一個 IP 地址:172.31.0.151,-s 172.31.0.151就變得多餘了:

sudo iptables -t nat -A OUTPUT -d 6.6.6.6 -j DNAT --to-destination 172.31.6.173

引用自:https://serverfault.com/questions/1065983