Linux 主机通过 Wi-Fi 上网,并将网络通过网口共享给交换机下游设备
适用场景
一台 Linux 主机:
- 通过 Wi-Fi 连接外网
- 通过 有线网口 连接交换机
- 希望让交换机后面的设备通过这台 Linux 主机共享上网
本指南采用 路由 + NAT 转发 的方式实现网络共享。
一、网络拓扑
text
互联网
|
Wi-Fi 热点 / 路由器
|
wlp4s0 (Linux 主机)
Linux 主机
enp5s0 (192.168.1.89/24)
|
交换机
|
下游设备(例如 192.168.1.100/24)
二、本文中的实际配置示例
根据你当前的环境:
- Wi-Fi 接口:
wlp4s0 - 有线接口:
enp5s0 - 有线连接名:
有线连接 1 - Wi-Fi 地址:
10.105.212.146/20 - 计划给有线侧配置:
192.168.1.89/24 - 下游设备地址示例:
192.168.1.100/24 - 下游设备网关:
192.168.1.89
三、实现思路
Linux 主机需要完成以下几件事:
- 让有线网口使用固定地址
192.168.1.89/24 - 开启 IPv4 转发
- 配置 NAT,让下游设备的数据通过 Wi-Fi 出口转发到外网
- 给下游设备配置 IP、网关和 DNS
四、步骤 1:确认接口名称
先查看当前网络设备:
bash
nmcli device status
正常会看到类似:
text
wlp4s0 wifi 已连接 Chery-guest
enp5s0 ethernet 已连接 有线连接 1
确认:
wlp4s0是 Wi-Fi 出口enp5s0是连接交换机的网口
五、步骤 2:确认 Wi-Fi 网段不冲突
查看 Wi-Fi 地址:
bash
ip -4 addr show wlp4s0
示例输出:
text
inet 10.105.212.146/20
说明 Wi-Fi 所在网段是 10.105.208.0/20 一类的网段,不是 192.168.1.0/24。
因此,可以安全地把有线口设为:
text
192.168.1.89/24
注意:
如果 Wi-Fi 侧本身也是
192.168.1.x/24,那就不能再把有线侧设成192.168.1.x/24,必须改成其他网段,比如192.168.50.1/24。
六、步骤 3:将有线网口设置为共享模式
使用 NetworkManager 配置 enp5s0:
bash
sudo nmcli connection modify "有线连接 1" \
ipv4.method shared \
ipv4.addresses 192.168.1.89/24 \
ipv6.method disabled
然后重启这个连接:
bash
sudo nmcli connection down "有线连接 1"
sudo nmcli connection up "有线连接 1"
七、步骤 4:确认有线网口地址生效
执行:
bash
ip -4 addr show enp5s0
应该看到类似:
text
inet 192.168.1.89/24
再检查连接配置:
bash
nmcli connection show "有线连接 1" | grep -E 'ipv4.method|ipv4.addresses'
预期输出:
text
ipv4.method: shared
ipv4.addresses: 192.168.1.89/24
八、步骤 5:开启 IPv4 转发
临时开启:
bash
sudo sysctl -w net.ipv4.ip_forward=1
检查是否生效:
bash
cat /proc/sys/net/ipv4/ip_forward
如果输出为:
text
1
说明已经开启。
九、步骤 6:配置 NAT 和 FORWARD 转发规则
执行以下命令:
bash
sudo iptables -t nat -F
sudo iptables -F FORWARD
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -o wlp4s0 -j MASQUERADE
sudo iptables -A FORWARD -i enp5s0 -o wlp4s0 -j ACCEPT
sudo iptables -A FORWARD -i wlp4s0 -o enp5s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
这些规则的作用是:
- 把从
enp5s0进入、从wlp4s0出去的流量放行 - 对发往 Wi-Fi 的流量进行地址伪装(NAT)
- 允许已建立连接的返回流量回来
十、步骤 7:查看 NAT 和转发规则是否生效
查看 NAT 规则:
bash
sudo iptables -t nat -vnL
查看 FORWARD 规则:
bash
sudo iptables -vnL FORWARD
应当能看到类似规则:
text
MASQUERADE ... out wlp4s0
ACCEPT ... in enp5s0 out wlp4s0
ACCEPT ... in wlp4s0 out enp5s0 ctstate RELATED,ESTABLISHED
十一、步骤 8:配置下游设备网络参数
下游设备接入交换机后,配置静态地址:
方案示例
- IP 地址:
192.168.1.100 - 子网掩码:
255.255.255.0 - 默认网关:
192.168.1.89 - DNS:
223.5.5.5或8.8.8.8
临时命令方式(适合测试)
在下游设备执行:
bash
sudo ip addr add 192.168.1.100/24 dev <下游设备网卡名>
sudo ip route replace default via 192.168.1.89
echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf
将
<下游设备网卡名>替换成实际网卡名,例如eth0、enp1s0等。
如果下游设备也使用 NetworkManager
先查看连接名:
bash
nmcli connection show
然后修改对应连接,例如:
bash
sudo nmcli connection modify "有线连接 1" \
ipv4.method manual \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.89 \
ipv4.dns "223.5.5.5 8.8.8.8"
sudo nmcli connection down "有线连接 1"
sudo nmcli connection up "有线连接 1"
十二、步骤 9:验证网络是否连通
1. 先测试下游到网关
在下游设备上执行:
bash
ping -c 3 192.168.1.89
如果通,说明下游到 Linux 主机的有线链路正常。
2. 测试下游是否能访问外网 IP
bash
ping -c 3 223.5.5.5
如果通,说明 NAT 和转发已经正常工作。
3. 测试 DNS 是否正常
bash
ping -c 3 baidu.com
如果能解析并 ping 通域名,说明共享网络已经完全成功。
十三、故障排查方法
问题 1:下游只能 ping 通 192.168.1.89,不能 ping 通公网
先检查下游设备是否有默认网关:
bash
ip route
应该看到:
text
default via 192.168.1.89
如果没有,补上:
bash
sudo ip route replace default via 192.168.1.89
问题 2:下游能 ping 公网 IP,但不能 ping 域名
说明是 DNS 问题。设置 DNS:
bash
echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf
然后再测:
bash
ping -c 3 baidu.com
问题 3:主机自己都不能上网
先在主机上执行:
bash
ping -c 3 223.5.5.5
ping -c 3 baidu.com
如果主机自己都不能上网,就先修复主机的 Wi-Fi 网络,不要继续排查共享。
问题 4:iptables 规则存在,但下游还是不能上网
检查:
bash
cat /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -vnL
sudo iptables -vnL FORWARD
重点确认:
ip_forward = 1- 有
MASQUERADE - 有
FORWARD放行规则
十四、配置永久生效
1. 永久开启 IPv4 转发
执行:
bash
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ipforward.conf
sudo sysctl --system
2. 保存 iptables 规则
在 Ubuntu / Debian 上:
bash
sudo apt update
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
安装时如果询问是否保存当前规则,选择:
text
Yes
十五、回滚方法(恢复普通有线连接)
如果以后不想共享了,可以恢复 enp5s0 为普通联网口。
1. 恢复 NetworkManager 配置
bash
sudo nmcli connection modify "有线连接 1" \
ipv4.method auto \
ipv4.addresses "" \
ipv6.method auto
sudo nmcli connection down "有线连接 1"
sudo nmcli connection up "有线连接 1"
2. 清空转发和 NAT 规则
bash
sudo iptables -t nat -F
sudo iptables -F FORWARD
3. 如需关闭 IPv4 转发
临时关闭:
bash
sudo sysctl -w net.ipv4.ip_forward=0
永久关闭则删除或修改:
bash
/etc/sysctl.d/99-ipforward.conf
十六、最终配置结果示例
主机 nvidia-MS-7D25
- Wi-Fi:
wlp4s0 - Wi-Fi 地址:
10.105.212.146/20 - 有线口:
enp5s0 - 有线地址:
192.168.1.89/24 - 已开启:
ip_forward - 已配置:
iptables NAT + FORWARD
下游设备 fangzai-a
- IP:
192.168.1.100/24 - 网关:
192.168.1.89 - DNS:
223.5.5.5 - 已成功访问公网和域名
十七、完整命令速查
主机端
bash
nmcli device status
ip -4 addr show wlp4s0
ip -4 addr show enp5s0
sudo nmcli connection modify "有线连接 1" \
ipv4.method shared \
ipv4.addresses 192.168.1.89/24 \
ipv6.method disabled
sudo nmcli connection down "有线连接 1"
sudo nmcli connection up "有线连接 1"
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -F
sudo iptables -F FORWARD
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -o wlp4s0 -j MASQUERADE
sudo iptables -A FORWARD -i enp5s0 -o wlp4s0 -j ACCEPT
sudo iptables -A FORWARD -i wlp4s0 -o enp5s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -vnL
sudo iptables -vnL FORWARD
下游设备端
bash
ip route
sudo ip route replace default via 192.168.1.89
echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf
ping -c 3 192.168.1.89
ping -c 3 223.5.5.5
ping -c 3 baidu.com