OpenVPN:从路由器网络获取 IP

OpenVPN:从路由器网络获取 IP

背景

我有这样的配置:

互联网 <--> 路由器 <--> 笔记本电脑

我的laptopopenvpn安装。正在监听端口 9999。router已将端口从 9999 转发到我的laptop

192.168.1.2我的笔记本电脑从路由器获取 IP 地址。静态 IP。

我创建了一个客户端证书进行测试。添加一台外部计算机,他就可以连接我的内部网络,使用 VPN 隧道。

我的外部 VPN 用户获取 IP 地址10.0.0.2

问题

我想创建一种情况,即外部客户端将从路由器的网络(例如:)192.168.1.3而不是从 openvpn 的网络(10.0.0.2)获取 IP 地址。因此,该用户看起来就像我的路由器内部网络上的任何其他用户一样。

这可能吗?

答案1

从技术上讲是可行的,但并不推荐——在大多数情况下,您应该只让子网间路由正常工作。

有两种方法,使用哪种方法取决于为什么您希望客户端看起来“像任何其他用户一样”,因为拥有 IP 地址只是使设备位于同一子网内的一部分 - 您是否需要发送/接收广播的能力? 您是否需要发送/接收非 IP 数据包的能力?

桥接

在这种方法中,VPN 客户端“直接”连接到同一个以太网广播域 - 它们可以通过 DHCP 获取地址,可以发送广播,甚至可以发送非 IP 数据包。VPN 服务器充当交换机的角色。

  1. 将OpenVPN服务切换到桥接模式:

    dev tap
    server-bridge
    

    所有客户dev tap也必须使用。

  2. 在操作系统级别创建实际桥接。在 Linux 上,可以使用ip linkbridge命令完成此操作,尽管讨论的旧教程brctl仍然有效。

    手动(临时)设置如下:

    ip link add br0 type bridge
    ip link set br0 up
    ip link set tap0 master br0
    ip link set eth0 master br0
    
    ip -4 addr flush dev eth0
    ip -4 addr add 192.168.1.2/24 dev br0
    ip -4 route add default via 192.168.1.1 dev br0
    

    注意两个都VPN‘tap’接口和物理以太网接口都放在桥接器中。

    是否“永久”执行此操作取决于您现有的网络如何配置 - 例如在 Debian 上您将添加网桥/etc/network/interfaces,在 Ubuntu 上您将使用 netplan 等。

使用 OpenVPN 进行桥接在其他地方有详细记录:

代理 ARP

在这种方法中,VPN 客户端只获取来自同一范围的地址,但它们在第 2 层仍然是分开的(VPN 服务器仍然充当两者之间的路由器)。

优点是它适用于 Android/iOS 客户端,由于操作系统限制,这些客户端无法使用以太网“tap”模式。(没有广播还可以节省电池寿命——局域网有时会发送大量垃圾数据包。)

  1. 将 VPN 服务配置为具有 LAN 范围内的较小前缀(例如 /27)。

    dev tun
    topology subnet
    server 192.168.1.192 255.255.255.224
    

    您应该在 VPN 服务器上得到类似这样的结果,其中地址范围有意重叠:

    eth0 = 192.168.1.2/24
    tun0 = 192.168.1.193/27
    
  2. 要么启用 Linux 内核内置的代理 ARP 功能,要么安装可自行执行相同操作的“parpd”守护进程。(我个人认为 parpd 更易于理解和配置。)

    例如,这将导致 Linux 回答全部通过 eth0 到达并请求属于其他接口的地址的 ARP 查询:

    sysctl net.ipv4.conf.eth0.proxy_arp=1
    

    同时,parpd 的配置如下:

    interface eth0
        proxy 192.168.1.192/27
    

现在,您的 LAN 上的其他设备会根据 VPN 客户端的地址认为它们位于同一子网中。当它们尝试进行 ARP 查询时,VPN 服务器将代表客户端进行应答。

相关内容