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


13

我想连接位于远程建筑物上的多个LAN。
“中心”站点有一台运行OpenVPN的Linux计算机。每个远程站点还运行OpenVPN。

  1. 中央站点的局域网编号为192.168.0.0/24
  2. 几个远程站点也编号为192.168.0.0/24
  3. 我不能/不想/不想/无论如何修改局域网编号
  4. 我无法控制大多数远程OpenVPN

然后,我需要:
1.定义虚拟LAN
2.为每个站点配置1:1 NAT
3.必须在中央路由器上配置1:1 NAT

局域网图
因此,每个站点都具有一个10.10.x.0 / 24 LAN。
当计算机要在站点12上访问192.168.0.44时,只需将一个paquet发送到10.10.12.44

操作VPN对我来说不是问题。我目前连接60多个站点。但是我找不到实现此1:1 NAT的简单方法。

这是从中央站点发送到远程站点的数据包及其响应数据包的示例:

在此处输入图片说明

我使用iptables NETMAP进行了一些测试,但由于无法找到路由决策后无法修改源+目标的方法,因此无法使其正常工作。
我宁愿避免使用新的--client-natOpenVPN功能。
也许我必须强制路由ip route?还是用两次循环进入网络堆栈veth

注意:我不想化妆舞会。仅1/1 NAT。

编辑:
使用常规的openVPN设置是不可能的。因为来自远程站点的数据包与来自另一个站点的数据包是无法区分的:两者具有相似的源地址和目标地址,并且都来自相同的Tun(或Tap)接口。因此,不可能对其进行源NAT。

解决方案1:在远程站点上进行NAT。就我而言,这是不可能的。我只需要在中央站点上执行此操作即可。

解决方案2:为每个远程站点设置一个VPN。因此,我每个人要吃一次。我认为可以。不是很有效的内存,但是还可以。

解决方案3:在VPN内为每个站点设置一个(未加密的)隧道。这将为每个接口提供一个接口。简单的隧道不是跨平台的(据我所知)。例如,对于Linux,GRE,ipip或sit都可以,但是某些远程站点仅运行一台Windows计算机,因此在其上安装了openVPN。因此不可能建立一个简单的隧道。另一个选择是使用更复杂的隧道(“?”),但是系统和sysadmin的开销可能比拥有多个VPN更大。

解决方案4:编译最新的openVPN,因为它包含1:1 NAT功能。我这周测试。


1
对于解决方案4,您无需编译。大多数主要的Linux发行版都在openVPN官方网站上编译了软件包。但这对您不起作用,因为--client-nat功能是可推送的选项。因此,您的客户还必须使用最新的RC版本(并且您说您无法控制远程站点)。
格雷戈里·穆萨特

1
好吧,我错了:--client-nat功能在OpenVPN内是100%(我认为它使用的是ipfilter)。我刚刚测试过:它也可以在Windows上运行。请参阅下面的我的解决方案。
格雷戈里·穆萨特

我想知道您是否曾经做过这项工作以及您做了什么。
Michael Grant

Answers:


2

一个非常基本的解决方案是:
1.为服务器+客户端使用OpenVPN 2.3或更高版本(当前最新版本为2.3-alpha)
2.使用下面的OpenVPN配置选项
3.不要使用其他任何东西(没有ipfilter,没有技巧)

在服务器端,您需要手动分配VPN地址(因此,没有server选择,您必须使用ifconfigifconfig-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"

routepush routeclient-nat,如果你想直接路由器之间的通信线路需要(ping 10.99.99.1从遥远的网站throught的VPN)。否则您可以丢弃它们。

现在,您必须选择一个虚拟网络地址。我保持与您的示例相同: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地址的站点,而没有任何影子主机。


1
简单,辉煌。
Bertrand SCHITS

我试过了,但无法正常工作。我在两面都使用Linux。某些事情很奇怪,或者我不太了解某些事情。您在client_11文件中的ifconfig-push(第一行),是否应该作为第二个参数的网络掩码而不是10.99.99.1?第二,为什么要使用第三个网络10.10.111.0/24?看来您正在尝试使用111网络在站点之间进行通信,不能直接使用10.10网络吗?最后,无论我尝试什么,我都看不到(在tcpdump中)影响客户机上数据包的snat和dnat。
Michael Grant

不是很简单,但仍然很出色。
神经递质

4

我已经对真实接口做了类似的事情,但是我不明白为什么它不能与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

上面,我们使用mark的前4位,以允许以这种方式路由多达7个网络。


1
感谢您的回答。我测试了它,但是没有用。我仅用一个LAN进行了测试,没有更多结果。我使用tcpdump监视数据包,当我从远程站点向中心站点发送数据包时,我什至看不到任何东西(?!怎么可能?)。根据您的指示,我尝试逐步构建答案。不知道我会成功。
Bertrand SCHITS

2
我的回答仅涵盖在中心站点上的操作。我假设您在其他站点上正确配置了路由。例如,您可能需要通过远程站点上的VPN隧道将路由添加到10.10.0.0/16。您可能还需要告诉openvpn让这些数据包通过。无论如何,使用tcpdump查看哪些数据包到达何处以及如何正确使用。iptables LOG目标也是您的朋友。
斯特凡Chazelas

2
如果看不到数据包,则必须查看openvpn日志。您可能会发现丢弃的数据包。如果是这样的情况下,使用“iroute 192.168.0.0 255.255.255.0”为每一个客户到您的客户端配置,目录
格雷戈里MOUSSAT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.