AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1036838
Accepted
medemi68
medemi68
Asked: 2020-10-08 13:15:22 +0800 CST2020-10-08 13:15:22 +0800 CST 2020-10-08 13:15:22 +0800 CST

使用 OpenVPN 为公共 IP 建立隧道

  • 772

我在使用 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

vpn debian openvpn linux-networking static-ip
  • 1 1 个回答
  • 3470 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2020-10-13T12:42:16+08:002020-10-13T12:42:16+08:00

    根据这篇Heficed 的知识库文章:

    当您购买了具有主 IP 并分配了附加 IP 的服务器时,附加 IP 在您的主 IP 上静态路由,因此在您的 NIC 上配置 IP 时不需要网关或广播地址。

    server1 的主 IP 地址用于访问其他 IP 地址,因此可以想象 server1 的路由器(如果也是 Linux)可能有类似这样的设置:

    ip route add 192.0.2.160/27 via 203.0.113.43
    

    没有必要桥接eth0,桥接它会给目标带来额外的困难。最终必须使用不常见的路由(仍然使用不属于 IP LAN 的网关)所需的复杂性是不值得的。

    所以server1的网络配置可以简化为:

    auto eth0
    iface eth0 inet static
        address 203.0.113.43
        netmask 255.255.255.0
        gateway 203.0.113.1
    

    更改配置时请注意连接丢失,您应该有一个远程/虚拟控制台访问作为备份。

    以下是没有桥接主机主接口的解决方案,使用路由,使用 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>:

      net.ipv4.ip_forward=1
      

      并在配置更改后以 root 身份运行它:

      sysctl -w net.ipv4.ip_forward=1
      
    • 命令演变:

      openvpn --mktun --dev {tap,tun}0
      

      可以替换为以下之一:

      ip tuntap add dev tap0 mode tap
      ip tuntap add dev tun0 mode tun
      

      ip tuntap 2009 年“只”出现。


    轻敲

    简单的方法

    为了保持简单,不使用永久的 TAP 接口(随意更改此配置)。

    它将消耗池中的 192.0.2.160、192.0.2.161(分配给server1)和 192.0.2.191。

    • 服务器1:

      openvpn --dev tap --ifconfig 192.0.2.161 255.255.255.224
      
    • 服务器2:

      openvpn --remote 203.0.113.43 --dev tap --ifconfig 192.0.2.162 255.255.255.224 --route-gateway 192.0.2.161 --redirect-gateway def1
      

      您还可以将 192.0.2.163 和 192.0.2.190 之间剩余的 28 个 IP 地址中的任何一个添加到server2的任何接口上(例如:在tap0上分配它或在lo上分配它,这样它甚至不会在之前消失):

      ip address add 192.0.2.163/32 dev lo
      

    保持所有 32 个地址可用的方法

    • 服务器1:

      添加一个 TAP 接口/etc/network/interfaces以简化server1的 OpenVPN 配置:

      auto tap0
      iface tap0 inet static
          pre-up ip tuntap add dev tap0 mode tap || :
          address 10.10.10.10/32
          up ip route add 192.0.2.160/27 dev tap0
          down ip link delete dev tap0
      

      ifup tap0如果刚刚完成并运行,请运行:

      openvpn --dev tap0
      
    • 服务器2:

      有一个名为的可执行文件up-cmd-server2.sh(内部使用的变量将继承自 OpenVPN):

      #!/bin/sh
      
      ip address add "$ifconfig_local"/32 dev "$dev"
      ip link set dev "$dev" up
      ip route add "$route_vpn_gateway"/32 dev "$dev"
      

      并运行:

      openvpn --remote 203.0.113.43 --dev tap --ifconfig-noexec --ifconfig 192.0.2.160 255.255.255.255 --route-gateway 10.10.10.10 --redirect-gateway def1 --script-security 2 --up up-cmd-server2.sh
      

      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:

      openvpn --dev tun --topology subnet --ifconfig 192.0.2.161 255.255.255.224
      
    • 服务器2:

      openvpn --remote 203.0.113.43 --dev tun --topology subnet --ifconfig 192.0.2.162 255.255.255.224 --route-gateway 192.0.2.161 --redirect-gateway def1
      

    保持所有 32 个地址可用的方法

    • 服务器1:

      添加一个 TUN 接口/etc/network/interfaces以简化server1的 OpenVPN 配置:

      auto tun0
      iface tun0 inet static
          pre-up ip tuntap add dev tun0 mode tun || :
          address 10.10.10.10/32
          up ip route add 192.0.2.160/27 dev tun0
          down ip link delete dev tun0
      

      ifup tun0如果刚刚完成并运行,请运行:

      openvpn --dev tun0
      
    • 服务器2:

      up-cmd-server2.sh在 TAP 版本中使用与上面相同的内容并运行:

      openvpn --remote 203.0.113.43 --dev tun --topology subnet --ifconfig-noexec --ifconfig 192.0.2.160 255.255.255.255 --route-gateway 10.10.10.10 --redirect-gateway def1 --script-security 2 --up up-cmd-server2.sh
      
    • 0

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • 用 D-LINK DFL-CPG310 防火墙替换 Cisco Pix 防火墙

  • 最好的点对点 VPN?

  • WAN 上的 VLAN

  • 通过 VPN 连接什么是远程服务器 IP?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve