vm虚拟机虚拟出网卡并ping通外网
在 Linux 和 Windows 系统中,即使不使用网络命名空间(namespace),也能实现虚拟网卡上网。以下是不同场景下的实现方法:
一、Linux 系统(不使用网络命名空间)
1. 直接创建虚拟网卡对(veth pair)
# 创建虚拟网卡对 veth0 和 veth1
sudo ip link add veth0 type veth peer name veth1
# 分配 IP 并启用
sudo ip addr add 192.168.100.1/24 dev veth0
sudo ip addr add 192.168.100.2/24 dev veth1
sudo ip link set veth0 up
sudo ip link set veth1 up
2. 配置 NAT 转发
# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
# 添加 NAT 规则(假设物理网卡为 ens33) 这个得是可以上网的网卡
sudo iptables -t nat -A POSTROUTING -s 192.168.100.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
3. 验证
# 在 veth1 上测试外网访问 下面的这个是不通的,
# 不出意外的话 这个是因为源ip是veth1 的ip 为什么不通?? 因为veth1 没有dns 触发了反向dns查询
ping -I veth1 223.5.5.5
# 这个是可以ping通的 把上面的网卡换成网卡的ip,
# 指定icmp的源ip 目的ip是223.5.5.5
ping -S 192.168.100.1 223.5.5.5
# curl 指定网卡,上面两个命令还有点问题。我还不懂
curl --interface veth0 baidu.com
优点:简单快捷,适合本地测试。
缺点:虚拟网卡与主机共享网络栈,缺乏隔离性。
二、验证虚拟网卡流量路径
1. 抓包验证(Linux)
# 监听虚拟网卡流量 能看到icmp的源ip和目的ip 可以分析为什么不通
sudo tcpdump -i veth0
五、常见问题解决
- 虚拟网卡无法访问外网:
- 检查
iptables
NAT 规则和sysctl net.ipv4.ip_forward
是否启用。 - 确认物理网卡名称(如
ens33
)是否正确。
- 检查
总结
- 无需命名空间:通过直接配置虚拟网卡 + NAT 规则即可实现上网,但缺乏隔离性。
- 验证方法:抓包、路由表、NAT 计数器是验证流量路径的核心工具。
这个文章还有点,问题。怪怪的。