Networking

將所有流量從虛擬 IP 轉發到區域網路內的 vm

  • April 9, 2018

我正在嘗試設置一個特定的 NAT,但我有點卡在這裡。

我的設置如下:

  • 3 個專用,每個 NIC,執行幾個 VM,在子網 10.100.0.0/16 中與 tinc 互連
  • 1 個帶有 2 個網卡的 VPS,1 個帶有一個公共 IP 的網卡,第二個帶有很多公共 IP(至少 25 個)的 VPS,此 VPS 還通過同一子網 10.100.0.0/16 中的 Tinc 與專用連接

VM 完全能夠訪問專用伺服器和 vps,專用和 vps 對 VM 的訪問也是如此。

專用 1:10.100.0.10 專用 1:10.100.0.20 專用 1:10.100.0.30 VM 1:10.100.2.3 VM 2:10.100.2.4 VM 3:10.100.2.5 VPS:10.100.0.101

所有虛擬機都使用 VPS IP 作為網關,如下所示:

root@test-ubuntu:~# ip a l dev ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether fa:16:3e:c1:fa:f5 brd ff:ff:ff:ff:ff:ff
   inet 10.100.2.3/16 brd 10.100.255.255 scope global ens3
      valid_lft forever preferred_lft forever
   inet6 fe80::f816:3eff:fec1:faf5/64 scope link 
      valid_lft forever preferred_lft forever

root@test-ubuntu:~# ip r s dev ens3
default via 10.100.0.101 
10.100.0.0/16  proto kernel  scope link  src 10.100.2.3 
169.254.169.254 via 10.100.2.1 

問題是我想使用我在這個 VPS 上的所有公共 IP 直接訪問 VM。我知道我必須做一些 nat 但經過幾個小時測試不同的方法並閱讀文件後,我承認我完全卡住了。

root@network1:~# ip a l dev ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether fa:16:3e:86:e6:a1 brd ff:ff:ff:ff:ff:ff
   inet 145.YYY.XXX.60/32 brd 145.YYY.XXX.60 scope global ens3
      valid_lft forever preferred_lft forever

root@network1:~# ip a l dev ens6
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether fa:16:3e:78:93:e1 brd ff:ff:ff:ff:ff:ff
   inet 147.AAA.BBB.97/27 brd 147.AAA.BBB.127 scope global ens6
      valid_lft forever preferred_lft forever
   inet 147.AAA.BBB.98/27 brd 147.AAA.BBB.127 scope global secondary ens6:1
      valid_lft forever preferred_lft forever
   inet 147.AAA.BBB.99/27 brd 147.AAA.BBB.127 scope global secondary ens6:2
      valid_lft forever preferred_lft forever
                          [....]
   inet 147.AAA.BBB.124/27 brd 147.AAA.BBB.127 scope global secondary ens6:27
      valid_lft forever preferred_lft forever
   inet 147.AAA.BBB.125/27 brd 147.AAA.BBB.127 scope global secondary ens6:28
      valid_lft forever preferred_lft forever

現在,我的規則是空的(我只顯示 nat 表,但它與通用表相同):

root@haproxy-1:~# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 96 packets, 3096 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 96 packets, 3096 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

由於我的目標是將來自一個 IP(比如說 147.AAA.BBB.98)的所有流量重定向到具有 IP 10.100.2.3 的 VM,我想出了這個:

虛擬機外部:

iptables -t nat -A PREROUTING -d 147.AAA.BBB.98 -j DNAT --to-destination 10.100.2.3

虛擬機到外部:

iptables -t nat -I POSTROUTING -s 10.100.2.3 -j SNAT --to-source 147.AAA.BBB.98

Ipforward當然是在VPS上啟用的

但它不起作用:/

如果我在 VPS 上創建一些 Tcpdump,我會看到來自外部的數據包,但沒有任何東西進入 VM。如果我嘗試從 VM ping 外部,我會看到數據包進入 VPS,數據包已發送但沒有收到任何內容。

但是,如果我使用 VPS 的主 IP(ens3 上的那個)進行操作,一切都會按預期工作

我想知道 tinc VPN 是否在介面 ens3 上執行,因此數據包應該從一個介面轉發到另一個介面

你知道我能做些什麼來解決這個問題嗎?

編輯:第二個介面上的 IP 與主介面上的 IP 不在同一個子網上,所以我不得不使用另一個路由表,這是我的路由的樣子:

root@haproxy-1:~# ip r s
default via 145.XXX.YYY.1 dev ens3 
10.100.0.0/16 dev prov  proto kernel  scope link  src 10.100.0.101 
145.XXX.YYY.1 dev ens3  scope link 
147.AAA.BBB.96/27 dev ens6  proto kernel  scope link  src 147.AAA.BBB.97 

root@haproxy-1:~# ip r s table 101
default via 147.AAA.BBB.126 dev ens6 

謝謝

我回答自己是因為我找到了解決方案(不確定它是否是最好的想法)。

由於兩個介面都使用不同的 GW,我確實使用路由表來讓它們都工作,這些都沒有問題。

規則設置正確:

root@haproxy-1:~# ip rule show
0:      from all lookup local 
32765:  from 147.AAA.BBB.96/27 lookup 101 
32766:  from all lookup main 
32767:  from all lookup default 

但我不知道的是,我還需要一個規則來告訴來自 10.100.0.0/16 的流量需要使用表 101

所以我確實添加了這條規則:

ip rule add from 10.100.2.0/16 lookup 101

我的桌子現在看起來是這樣的:

root@haproxy-1:~# ip rule show
0:      from all lookup local 
32764:  from 10.100.2.0/16 lookup 101 
32765:  from 147.AAA.BBB.96/27 lookup 101 
32766:  from all lookup main 
32767:  from all lookup default 

並且流量完美地路由到 VM 並從 VM 路由到外部。如果我對轉發到 VM (147.AAA.BBB.98) 的 IP 進行 nmap,我只會看到 VM 的開放埠,而不是 VPS 之一。

請注意,我確實使用這個解釋來解決我的問題: http ://www.rjsystems.nl/en/2100-adv-routing.php

無論如何,它現在可以按我的意願工作

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