Networking

更改發往源主機的第二個網路別名的傳出流量的源地址

  • May 18, 2017

我有以下設置:

ip addr:

2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
   link/ether 01:12:23:34:45:5f brd ff:ff:ff:ff:ff:ff
   inet xxx.xxx.xxx.xxx/24 brd xxx.xxx.xxx.xxx scope global ens4
      valid_lft forever preferred_lft forever
   inet 192.168.0.2/24 scope global ens4:1
      valid_lft forever preferred_lft forever
   inet 192.168.0.3/24 scope global secondary ens4:2
      valid_lft forever preferred_lft forever

我希望所有流量從192.168.0.2注定要192.168.0.3顯示為好像來源是192.168.0.3.

原因是我在 postgres 上有無法更改的特定配置。此 postgres 僅在 source 為 時接受連接192.168.0.3,因此如果 source 變為192.168.0.2則連接將被拒絕。

以上問題是此處收到的答案的結果:How to add ip route to route traffic through interface when destination is also that interface(當在同一網路中配置兩個別名時,無法使用靜態路由更改源 IP 地址)

以下問題的答案似乎與我的問題有關,儘管它不會導致添加規則:https ://unix.stackexchange.com/questions/243451/iptables-change-local-source-address-if-destination-地址匹配

我已經嘗試過遵循 nat 規則:

iptables -t nat -A POSTROUTING -o ens4 -j MASQUERADE
iptables -A FORWARD -i ens4 --source 192.168.0.2/32 -o 192.168.0.3 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens4 --source 192.168.0.2/32 -o 192.168.0.3 -j ACCEPT

以上來源於這裡:http ://www.revsys.com/writings/quicktips/nat.html

我已經檢查了您在問題中提到的答案,並嘗試iptables像那裡提到的那樣進行配置。nginx在我的帶有 CentOS 的虛擬機上進行了測試,它可以工作。

嘗試使用此規則:

iptables -t nat -A POSTROUTING --destination 192.168.0.3/32 -j SNAT --to-source 192.168.0.3

在我的情況下,即使禁用 IP 轉發,此規則也適用,所以試試吧。

更新:

對於所有傳出流量,您應該使用規則:

iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.0.3

鍵入ip route get 192.168.0.3以查看實際採用的路線。

在我的盒子(debian)上,我可以通過鍵入以下內容來做你想做的事:

sudo ip route change local 192.168.0.3 dev lo src 192.168.0.3

此外,不知道您使用哪些工具連接到 192.168.0.3,但大多數工具都可以讓您指定要使用的 IP 源。

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