以下是分步指南,帮助您创建虚拟网卡并通过它访问互联网:
使用网络命名空间隔离,使得各自有自己的ip rule ip route 等
步骤 1:创建虚拟网卡对
# 创建一对虚拟网卡(veth0 和 veth1)
sudo ip link add veth0 type veth peer name veth1
# 启用网卡
sudo ip link set veth0 up
sudo ip link set veth1 up
# 分配 IP 地址
sudo ip addr add 192.168.200.1/24 dev veth0 # 主机端
sudo ip addr add 192.168.200.2/24 dev veth1 # 虚拟端
步骤 2:创建网络命名空间(隔离环境)
# 创建命名空间
sudo ip netns add test-ns
# 将 veth1 移入命名空间
sudo ip link set veth1 netns test-ns
# 在命名空间中启用网卡并配置
sudo ip netns exec test-ns ip link set lo up
sudo ip netns exec test-ns ip link set veth1 up
sudo ip netns exec test-ns ip addr add 192.168.200.2/24 dev veth1
步骤 3:配置 NAT 转发(让虚拟网卡访问外网)
# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
# 添加 iptables 规则
sudo iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o ens33 -j MASQUERADE
sudo iptables -A FORWARD -i veth0 -o ens33 -j ACCEPT
sudo iptables -A FORWARD -i ens33 -o veth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
插入:手动指定 DNS 服务器
# 在命名空间中直接指定 DNS 服务器(如 Google DNS)
sudo mkdir -p /etc/netns/test-ns
echo "nameserver 8.8.8.8" | sudo tee /etc/netns/test-ns/resolv.conf
# 重新测试 DNS 解析
sudo ip netns exec test-ns nslookup bing.com
步骤 4:在命名空间中测试联网
# 设置默认网关(指向主机端的 veth0)
sudo ip netns exec test-ns ip route add default via 192.168.200.1
# 测试 DNS 解析(确保能解析域名)
sudo ip netns exec test-ns ping -c 4 8.8.8.8 # 测试 IP 连通性
sudo ip netns exec test-ns nslookup bing.com # 测试 DNS
# 通过虚拟网卡 ping 外网
sudo ip netns exec test-ns ping -c 4 bing.com
验证配置
# 查看虚拟网卡状态
ip addr show veth0 # 主机端
sudo ip netns exec test-ns ip addr show veth1 # 命名空间端
# 检查路由表
sudo ip netns exec test-ns ip route list
# 检查 iptables 规则
sudo iptables -t nat -L -nv
可能遇到的问题及解决
-
无法 ping 通外网:
- 检查 NAT 规则:
sudo iptables -t nat -L -nv
- 确认 IP 转发已启用:
sysctl net.ipv4.ip_forward
- 验证物理网卡名称是否为
ens33
(根据您的ip a
输出)
- 检查 NAT 规则:
-
DNS 解析失败:
# 手动指定 DNS 服务器 echo "nameserver 8.8.8.8" | sudo tee /etc/netns/test-ns/resolv.conf
-
网络命名空间权限问题:
- 使用
sudo
执行所有命令 - 确认内核版本支持网络命名空间(Linux 4.x+ 均支持)
- 使用
最终效果
- 虚拟网卡
veth1
在test-ns
命名空间中 - 通过
192.168.200.2
IP 访问外网 - 所有流量通过主机物理网卡
ens33
进行 NAT 转发
通过这种方式,您可以完全隔离虚拟网卡的网络环境,同时保持外网访问能力。
进入网络命名空间
使用 ip netns exec 命令进入已创建的命名空间(如 test-ns):
# 进入命名空间的交互式 shell
sudo ip netns exec test-ns bash
# 验证已进入命名空间(查看网卡)
ip addr show
# 预期输出:仅显示 veth1 和 lo 网卡
如何确认虚拟网卡是否实际处理流量(以 veth0/veth1 为例)
方法 1:使用 tcpdump 抓包(直接验证数据流)
在 主机端 抓取虚拟网卡的流量:
# 抓取 veth0 的 ICMP 流量(主机端)
sudo tcpdump -i veth0 icmp
# 抓取 veth1 的流量(需进入命名空间)
sudo ip netns exec test-ns tcpdump -i veth1 icmp
预期结果:
当在命名空间中执行 ping bing.com 时,若抓包显示 ICMP echo request 和 reply,则虚拟网卡工作正常。