Ber*_*ITS 13 linux routing openvpn
我想连接位于远程建筑物上的多个 LAN。
“中央”站点有一台运行 OpenVPN 的 Linux 计算机。每个远程站点也运行 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 发送一个数据包
操作 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 内为每个站点设置一个(未加密的)隧道。这将为每个提供一个界面。简单的隧道不是跨平台的(据我所知)。例如 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选项,您必须使用ifconfig或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"
Run Code Online (Sandbox Code Playgroud)
如果您想在路由器之间直接通信(通过 VPN 从远程站点),则需要和和route线路。否则你可以丢弃它们。 push routeclient-natping 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"
Run Code Online (Sandbox Code Playgroud)
。
。
您现在必须指示客户端使用 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
Run Code Online (Sandbox Code Playgroud)
第一行设置远程路由器地址。请注意需要特殊地址的 Windows 驱动程序。
第二行和最后一行允许远程路由器通过其 10.99.99.x 接口进行通信。
第三行和第四行执行源和目标 1:1 NAT
第五行告诉 OpenVPN 如何处理相应的数据包。
此方法允许连接具有相同(或不同)LAN 地址的站点,而无需任何影子主机。