Linux

具有多個相同 LAN 的 1:1 NAT

  • December 9, 2012

我想連接位於遠端建築物上的多個 LAN。

“中央”站點有一台執行 OpenVPN 的 Linux 電腦。每個遠端站點也執行 OpenVPN。

  1. 中心站點有一個編號為 192.168.0.0/24 的 LAN
  2. 幾個遠端站點也編號為 192.168.0.0/24
  3. 我不能/不會/不想/無論如何修改 LAN 編號
  4. 我無法控制大多數遠端 OpenVPN

然後我需要:

  1. 定義虛擬 LAN

  2. 為每個站點配置 1:1 NAT

  3. 必須在中央路由器上配置 1:1 NAT

區域網路地圖 .

因此可以看到每個站點都有一個 10.10.x.0/24 LAN。

當一台電腦想要到達站點 12 上的 192.168.0.44 時,它只需向 10.10.12.44 發送一個 paquet

操作 VPN 對我來說不是問題。我目前連接了 60 多個站點。但我沒有找到一種簡單的方法來完成這個 1:1 NAT。

這是從中心站點發送到遠端站點的數據包及其響應數據包的範例:

在此處輸入圖像描述

我用 iptables NETMAP 做了一些測試,但我無法讓它工作,因為在路由決定後我找不到修改源+目標的方法。

我寧願避免使用新--client-nat的 OpenVPN 功能。

也許我必須強制路由ip route?或者循環兩次進入網路堆棧veth

注意:我不想使用偽裝。只有 1/1 NAT。

編輯:

正常的 openVPN 設置是不可能的。因為來自遠端站點的數據包與來自另一個站點的數據包無法區分:兩者俱有相似的源地址和目標地址,並且都來自相同的 tun(或 tap)介面。所以不可能對它進行源NAT。

解決方案 1:在遠端站點上進行 NAT。在我的情況下不可能。我必須只在中心站點上執行此操作。

解決方案 2:為每個遠端站點設置一個 VPN。所以我會為每個人準備一個。我認為這可以。記憶體效率不是很高,但還可以。

解決方案 3:在 VPN 內為每個站點設置一個(未加密的)隧道。這將為每個提供一個介面。簡單的隧道不是跨平台的(據我所知)。例如 GRE 或 ipip 或 sat 對於 Linux 是可以的,但一些遠端站點只執行一台 Windows 電腦,因此在其上安裝了 openVPN。所以不可能建立一個簡單的隧道。其他選擇是使用更複雜的隧道(至尊?),但係統和系統管理員的成本可能比擁有多個 VPN 更大

解決方案 4:編譯最新的 openVPN,因為它包含 1:1 NAT 功能。我這週測試這個。

一個非常基本的解決方案是:

  1. 為伺服器 + 客戶端使用 OpenVPN 2.3 或更高版本(目前最新的是 2.3-alpha)

  2. 使用下面的 OpenVPN 配置選項

  3. 不要使用其他任何東西(沒有 ipfilter,沒有技巧)

在伺服器端,您需要手動分配 VPN 地址(所以沒有server選項,您必須使用ifconfigor ifconfig-push):

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

如果您想在路由器之間直接通信(從遠端站點通過 VPN) ,則需要routeandpush route和線。否則,您可以丟棄它們。 client-nat``ping 10.99.99.1

.

.

現在您必須選擇一個虛擬網路地址。我保留了您在範例中使用的相同:10.10.0.0/16

您允許為此路由:

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

.

.

您現在必須指示客戶端使用 1:1 NAT:

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

第一行設置遠端路由器地址。注意需要特殊地址的 Windows 驅動程序。

第二行和最後一行允許遠端路由器從其 10.99.99.x 介面進行通信。

第三和第四行進行源和目標 1:1 NAT

第五行告訴 OpenVPN 如何處理相應的數據包。

此方法允許連接具有相同(或不同)LAN 地址的站點,而無需任何影子主機。

我用真實的介面做了類似的事情,但我不明白為什麼它不適用於 VPN 介面。

這個想法是,由於您在該路由器的不同介面上擁有相同的子網,因此會使路由複雜化。基本上,當 10.10.13.123 的數據包進入路由器時,它會在路由到 192.168.0.123 之前進行 DNATed,因此您必須能夠告訴路由它是針對介面 VPN13 上的 192.168.0.123 的。

這可以通過使用防火牆標記和使用這些標記的路由規則來完成。SNAT 和 DNAT 將與 NETMAP 防火牆目標一起完成。對於 SNAT,也是同樣的問題,在 POSTROUTING 中,你失去了數據包來自這個或那個介面的資訊,它們的源地址都是 192.168.0.x。因此,您還需要一個標記來將該資訊從 mangle-PREROUTING 傳送到 nat-POSTROUTING。您可以使用相同的標記,但這意味著這些數據包將使用該備用路由表,因此您需要全部複製全域路由表。

對於每個網路,您將執行以下操作:

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
 table=$site
 net=10.10.$site.0/24
 n=$(($n + 1))
 eval "interface=\$if$site"
 inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

 iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
 iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
 iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
 ip rule add fwmark "$outmark"/0xf table "$table"
 ip route add "$lnet" dev "$interface" table "$table"
done

上面,我們使用了前 4 位的mark,以允許最多 7 個網路以這種方式路由。

引用自:https://unix.stackexchange.com/questions/57375