背景
我有这样的配置:
互联网 <--> 路由器 <--> 笔记本电脑
我的laptop
已openvpn
安装。正在监听端口 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 服务器充当交换机的角色。
将OpenVPN服务切换到桥接模式:
dev tap server-bridge
所有客户
dev tap
也必须使用。在操作系统级别创建实际桥接。在 Linux 上,可以使用
ip link
和bridge
命令完成此操作,尽管讨论的旧教程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”模式。(没有广播还可以节省电池寿命——局域网有时会发送大量垃圾数据包。)
将 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
要么启用 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 服务器将代表客户端进行应答。