將所有流量從虛擬 IP 轉發到區域網路內的 vm
我正在嘗試設置一個特定的 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
無論如何,它現在可以按我的意願工作