我的最终目标:我想在我的树莓派上运行一些使用 VPN 连接的应用程序。所有其他应用程序应直接连接到互联网,无需 VPN。我希望能够灵活地与不同的 VPN 提供商合作。
在将它应用到我的 Raspberry Pi 之前,我正在运行 Ubuntu 20.04 LTS 的虚拟机上进行测试。
我的做法:
- 创建网络命名空间。
- 命名空间中虚拟适配器的 IP 地址应该是动态的(来自路由器的 dhcp)。在研究 dhcp 细节之前,我将开始使用静态 IP 进行测试。
- 1. 和 2. 运行并连接网络命名空间中的 vpn 客户端。
- 在网络命名空间中运行应用程序。
我已阅读虚拟网络的 Linux 接口简介,并相信 MACVLAN 是正确的方法。我创建了以下脚本来设置命名空间和虚拟网络:
#!/bin/bash
# Bring eth0 down
ip link set eth0 down
# Enable forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Load Bridge module
modprobe br_netfilter
# Bring eth0 up
ip link set eth0 up
# Create namespace
ip netns add nsvpn
# Bring up loopback
ip netns exec nsvpn ip link set lo up
# Add Mac VLan Interface in bridge mode
ip link add macvlanvpn link eth0 type macvlan mode bridge
# Link Mac VLan Interface to namespace
ip link set macvlanvpn netns nsvpn
# Bring up Mac VLan Interface
ip netns exec nsvpn ip link set macvlanvpn up
# Set IP Address on Mac VLan Interface
ip netns exec nsvpn ip addr add 10.11.12.200/24 dev macvlanvpn
# Add gateway route
ip netns exec nsvpn ip route add default via 10.11.12.1
运行脚本后,创建了命名空间,我可以 ping 10.11.12.200
(虚拟接口的 IP 地址)。当我尝试 ping 网关10.11.12.1
时,我得到Destination Host Unreachable
.
我是这么想的,eth0
现在macvlanvpn
应该桥接。我错过了什么?
eth0
有 IP 地址10.11.12.101
,由 dhcp 分配。网关和 dhcp 服务器是10.11.12.1
.
我也试过了mode passthru
。当我尝试时,我可以访问网关和互联网。这个解决方案有一些缺点。它在硬件和虚拟接口上使用相同的 MAC 地址。当我使用ip
命令更改MAC地址时,另一个的MAC地址也被更改。因此我不能使用 dhcp 来分配 IP 地址。