我在使用 OpenVPN 将公共 IP 隧道连接到远程 VPS 时遇到了一些困难。我有一台 Linux 服务器,其中包含 32 个 Public IP Addresses 块192.0.2.160/27
,名为Server 1eth0
,以及绑定到同一台服务器上的另一个 Public IP Address : 203.0.113.43
。
我在其他地方的 NAT 后面有另一台 Linux 机器Server 2 。我希望能够在Server 1上设置 OpenVPN 服务器,以便客户端Server 2可以使用192.0.2.160/27
子网中的 IP 地址。
我已按照以下有关 ServerFault 的指南进行操作,并且正在尝试使用 TAP 将以太网桥接与 OpenVPN 一起使用。
在服务器 1 上,网络配置如下所示(出于文档目的,我已替换 IP - 请参阅 RFC5737):
服务器 1 /etc/network/interfaces
auto eth0
auto br0
iface br0 inet static
address 203.0.113.43
netmask 255.255.255.0
gateway 203.0.113.1
pre-up openvpn --mktun --dev tap0
bridge_ports eth0 tap0
bridge_fd 3
然后我在服务器 1上运行 openvpn ,当我在服务器 2openvpn --dev tap0
上输入以下内容时:
openvpn --remote 203.0.113.43 --dev tap0 --route-gateway 203.0.113.1 \
--redirect-gateway def1 --ifconfig 192.0.2.160 255.255.255.224
建立了连接,但我无法在除Server 2192.0.2.160
以外的任何其他机器上ping 通(甚至无法在Server 1上执行此操作)。
我绝对相信我错过了一些东西,但我似乎无法弄清楚。
我还要补充一点,我已经/etc/sysctl.conf
在Server 1上启用了 IPv4 数据包转发。
如果有人可以完成此配置或建议实现此配置的替代方法,那将不胜感激。
[编辑 1 - 谢谢 AB]
托管服务提供商是 Heficed,他们在这里解释了如何添加额外的公共 IP(无论如何在 CentOS 上):https ://kb.heficed.com/en/articles/2854555-adding-ip-to-your-network-interface
根据这篇Heficed 的知识库文章:
server1 的主 IP 地址用于访问其他 IP 地址,因此可以想象 server1 的路由器(如果也是 Linux)可能有类似这样的设置:
没有必要桥接eth0,桥接它会给目标带来额外的困难。最终必须使用不常见的路由(仍然使用不属于 IP LAN 的网关)所需的复杂性是不值得的。
所以server1的网络配置可以简化为:
更改配置时请注意连接丢失,您应该有一个远程/虚拟控制台访问作为备份。
以下是没有桥接主机主接口的解决方案,使用路由,使用 TAP(可能允许例如server1为server2的一侧运行 DHCP 服务器)或使用 TUN。
为了保持 32 个 IP 地址可用,使用了一些不寻常的路由设置,OpenVPN 有一些问题。因此使用脚本来覆盖该
--ifconfig
选项。如果选择从 /32 池中牺牲 3 个 IP 地址:一个分配给server1以及 192.0.2.160 和 192.0.2.191 用作网络和广播网络地址,那么一切都变得简单,不需要额外的脚本。笔记:
要将server1
/etc/sysctl.conf
配置为 IPv4 路由器,这是下面描述的任何方法所必需的,例如,可以在或中取消注释/添加此条目/etc/sysctl.d/<somefile>
:并在配置更改后以 root 身份运行它:
命令演变:
可以替换为以下之一:
ip tuntap
2009 年“只”出现。轻敲
简单的方法
为了保持简单,不使用永久的 TAP 接口(随意更改此配置)。
它将消耗池中的 192.0.2.160、192.0.2.161(分配给server1)和 192.0.2.191。
服务器1:
服务器2:
您还可以将 192.0.2.163 和 192.0.2.190 之间剩余的 28 个 IP 地址中的任何一个添加到server2的任何接口上(例如:在tap0上分配它或在lo上分配它,这样它甚至不会在之前消失):
保持所有 32 个地址可用的方法
服务器1:
添加一个 TAP 接口
/etc/network/interfaces
以简化server1的 OpenVPN 配置:ifup tap0
如果刚刚完成并运行,请运行:服务器2:
有一个名为的可执行文件
up-cmd-server2.sh
(内部使用的变量将继承自 OpenVPN):并运行:
IP 地址 10.10.10.10 永远不会在 VPN 之外看到,即使在内部也只会在出现错误的情况下看到,例如在traceroute命令的结果中,或者当然,如果它用于从 VPN 访问server1而不是从互联网。从外部运行的traceroute将显示来自 203.0.113.43 的错误。
在server1上有容器或虚拟机怎么样?
如果一些流量应该通过 VPN 路由并且一些流量是本地的,那么上面的tap0可以再次被奴役到网桥。此网桥仍将用于路由 LAN:它不会桥接eth0并且应为其分配 10.10.10.10/32 而不是tap0。除此之外,上述设置和解释仍然适用。容器可以使用veth链接和虚拟机额外的 TAP 链接,所有这些都受制于网桥。
屯
如果需要与在隧道上使用以太网相关的属性,例如让server1为server2运行 DHCP 服务器或实际通过 VPN 共享 LAN 流量, TAP 很有用(TUN 也可以用于混合使用,还有一些路由调整和代理 ARP,但它可能不值得配置复杂性)。Else TUN 可以使用较少的开销(例如:IP 数据包小于以太网帧并且没有 ARP)。由于这两种情况都是路由,所以设置几乎和上面一样。
简单的方法
服务器1:
服务器2:
保持所有 32 个地址可用的方法
服务器1:
添加一个 TUN 接口
/etc/network/interfaces
以简化server1的 OpenVPN 配置:ifup tun0
如果刚刚完成并运行,请运行:服务器2:
up-cmd-server2.sh
在 TAP 版本中使用与上面相同的内容并运行: