具有多個相同 LAN 的 1:1 NAT
我想連接位於遠端建築物上的多個 LAN。
“中央”站點有一台執行 OpenVPN 的 Linux 電腦。每個遠端站點也執行 OpenVPN。
- 中心站點有一個編號為 192.168.0.0/24 的 LAN
- 幾個遠端站點也編號為 192.168.0.0/24
- 我不能/不會/不想/無論如何修改 LAN 編號
- 我無法控制大多數遠端 OpenVPN
然後我需要:
定義虛擬 LAN
為每個站點配置 1:1 NAT
必須在中央路由器上配置 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 功能。我這週測試這個。
一個非常基本的解決方案是:
為伺服器 + 客戶端使用 OpenVPN 2.3 或更高版本(目前最新的是 2.3-alpha)
使用下面的 OpenVPN 配置選項
不要使用其他任何東西(沒有 ipfilter,沒有技巧)
在伺服器端,您需要手動分配 VPN 地址(所以沒有
server
選項,您必須使用ifconfig
orifconfig-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) ,則需要
route
andpush 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 個網路以這種方式路由。