Linux 台式机共享 Wi-Fi 给路由器:从一次真实组网理解网络基础
本文记录一次真实的局域网组网与排障过程。目标是让一台 Linux 台式机通过 Wi-Fi 访问上级网络,再将网络从有线网卡共享给家用路由器,最终供笔记本和工控机稳定联网。
为方便公开发布,本文把上级 Wi-Fi 统一称为"校园 Wi-Fi"。文中的地址均为私有地址,不是公网地址。
一、需求与最终拓扑
设备包括:
- 一台 Linux 台式机:无线连接校园 Wi-Fi,同时带有有线网卡;
- 一台 TP-LINK XDR1520 路由器;
- 一台工控机:使用网线连接路由器;
- 一台笔记本:使用 Wi-Fi 连接路由器。
最终拓扑如下:
text
互联网
│
校园网络网关:192.168.110.1
│
Linux 台式机无线网卡:192.168.110.140
Linux 台式机有线网卡:10.42.0.1
│
XDR1520 WAN:10.42.0.126
XDR1520 LAN:192.168.50.1
├── 工控机:192.168.50.100
└── 笔记本:192.168.50.101
Linux 台式机在这里不仅是一台普通电脑,还临时承担了一台"小路由器"的角色:
- 从无线网卡接收互联网连接;
- 从有线网卡向下级路由器提供网络;
- 转发下级设备的数据;
- 对这些数据进行 NAT 地址转换。
二、WAN 与 LAN 是什么
对路由器而言,可以把网络分为外侧与内侧:
text
上一级网络 ← WAN | 路由器 | LAN → 自己管理的设备
- WAN:路由器连接上一级网络的一侧;
- LAN:路由器连接并管理内部设备的一侧。
在本案例中:
text
XDR1520 WAN 地址:10.42.0.126
XDR1520 LAN 地址:192.168.50.1
同一台路由器同时拥有两个 IP 很正常,因为它连接着两个不同的网络。
需要注意:WAN 不等于 Wi-Fi,LAN 也不等于网线。笔记本虽然通过 Wi-Fi 连接 XDR1520,但它仍属于 LAN;台式机虽然通过网线连接 XDR1520,但连接的是路由器的 WAN 一侧。
三、为什么会有三组不同的 IP
本次组网包含三个局域网:
1. 校园网络
text
校园网关:192.168.110.1
台式机无线网卡:192.168.110.140
2. 台式机与 XDR1520 之间的网络
text
台式机有线网卡:10.42.0.1
XDR1520 WAN:10.42.0.126
3. XDR1520 管理的内部网络
text
XDR1520 LAN:192.168.50.1
工控机:192.168.50.100
笔记本:192.168.50.101
每块网卡面对一个网络,就需要在那个网络中拥有一个 IP 地址。
四、DHCP:局域网里的"自动发地址服务"
设备刚接入网络时,通常不知道应该使用哪个 IP。DHCP 服务器会自动告诉它:
- IP 地址;
- 子网掩码;
- 默认网关;
- DNS 服务器;
- 地址租期。
本案例有三层 DHCP 分配关系:
text
校园网络的 DHCP
└── 给台式机无线网卡分配 192.168.110.140
Linux 台式机的 DHCP
└── 给 XDR1520 WAN 分配 10.42.0.126
XDR1520 的 DHCP
├── 给笔记本分配 192.168.50.101
└── 给工控机保留 192.168.50.100
XDR1520 在两个方向扮演不同角色:
- 面对台式机时,它是 DHCP 客户端,向台式机申请地址;
- 面对笔记本和工控机时,它是 DHCP 服务器,给内部设备分配地址。
为了让 SSH 地址长期稳定,可在 XDR1520 中根据工控机网卡的 MAC 地址,将 192.168.50.100 保留给工控机。工控机仍可使用"自动获取 IP",同时每次都得到同一个地址。
五、子网掩码与 /24
常见的:
text
255.255.255.0
不是 DNS,而是子网掩码。它用来判断目标 IP 是否和自己处于同一局域网。
例如:
text
笔记本 IP:192.168.50.101
子网掩码:255.255.255.0
可以先简单理解为前三段 192.168.50 代表网络,最后一段代表设备。因此下面的地址在同一网段:
text
192.168.50.1
192.168.50.100
192.168.50.101
192.168.50.220
而下面的地址不在同一网段:
text
10.42.0.1
192.168.110.1
223.5.5.5
255.255.255.0 也可以写成 /24,所以:
text
192.168.50.0/24
表示 192.168.50.x 这一整个网络。通常:
text
192.168.50.0 网络地址,不能分给普通设备
192.168.50.1~254 可分配给设备
192.168.50.255 广播地址
六、默认网关:离开当前局域网的大门
一台设备访问同网段目标时,可以直接通信;访问其他网络时,则需要把数据交给默认网关。
以笔记本 192.168.50.101 为例:
text
访问工控机 192.168.50.100
→ 同一网段,直接通信
访问公共 DNS 223.5.5.5
→ 不同网段,交给默认网关 192.168.50.1
笔记本访问互联网时,各设备只需知道自己的下一站:
text
笔记本 192.168.50.101
↓ 默认网关
XDR1520 LAN 192.168.50.1
↓ XDR1520 的默认网关
Linux 台式机有线口 10.42.0.1
↓ 台式机的默认网关
校园网关 192.168.110.1
↓
互联网
每台设备不必知道完整路径,只需要知道下一站。
七、路由表:设备内部的导航规则
Linux 台式机的 IPv4 路由表中有类似内容:
text
10.42.0.0/24 dev eno2
192.168.110.0/24 dev wlp0s20f3
default via 192.168.110.1 dev wlp0s20f3
含义是:
text
去 10.42.0.x → 走有线网卡 eno2
去 192.168.110.x → 走无线网卡 wlp0s20f3
去其他所有地址 → 从无线网卡交给 192.168.110.1
系统会优先使用更具体的规则。只有没有具体规则匹配时,才使用 default 默认路线。
查看 Linux 路由表:
bash
ip -4 route
八、ARP、IP 和 MAC 各自做什么
- IP 地址:标识设备所在的网络以及网络中的位置;
- MAC 地址:在当前局域网内标识具体网卡;
- ARP:查询某个 IPv4 地址对应的 MAC 地址。
笔记本访问同网段的工控机时,会在局域网中询问:
text
谁拥有 192.168.50.100?请告诉我你的 MAC 地址。
工控机回应后,笔记本会暂时缓存:
text
192.168.50.100 → 工控机网卡的 MAC 地址
Windows 可以查看 ARP 缓存:
powershell
arp -a
笔记本访问外网 223.5.5.5 时,不会查询公网服务器的 MAC,因为对方不在本地局域网。它会查询默认网关 192.168.50.1 的 MAC,并先把数据交给路由器。
第一段数据可以这样理解:
text
IP 层:
来源 IP:192.168.50.101
目标 IP:223.5.5.5
当前局域网的 MAC 层:
来源 MAC:笔记本的 MAC
目标 MAC:XDR1520 LAN 侧的 MAC
目标 IP 仍然是最终目的地;目标 MAC 则是当前这一段的下一站。
九、交换与路由的区别
- 交换:主要依据 MAC 地址,在同一个局域网内部转发;
- 路由:主要依据 IP 地址,在不同网络之间转发。
XDR1520 同时承担两类工作:
text
笔记本 ↔ 工控机
→ 同一网段,主要做交换/AP转发,不经过 WAN,不需要 NAT
笔记本 → 互联网
→ 跨越不同网段,需要路由和 NAT
十、NAT:为什么私有地址也能访问互联网
下面三类地址都是私有 IP:
text
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
私有 IP 可以在不同局域网中重复使用,但不能直接在公网中路由。本案例中的:
text
192.168.50.101
10.42.0.126
192.168.110.140
全都是私有地址。
笔记本访问互联网时,来源 IP 会被逐层改写:
text
笔记本发出:192.168.50.101
↓ XDR1520 第一次 NAT
变成:10.42.0.126
↓ Linux 台式机第二次 NAT
变成:192.168.110.140
↓ 校园网络出口可能再次 NAT
变成:校园网络的公网出口 IP
↓
互联网
返回数据则根据各层设备保存的 NAT 连接记录逐层送回:
text
互联网回复
↓
台式机无线网卡 192.168.110.140
↓ 台式机反向 NAT
XDR1520 WAN 10.42.0.126
↓ XDR1520 反向 NAT
笔记本 192.168.50.101
NAT 记录不仅包含 IP,还会结合协议和端口号,因此多台设备同时上网时,回复也不会被送错。
十一、端口号:找到设备上的具体服务
IP 地址负责找到设备,端口号负责找到设备中监听网络的具体服务。
可以类比为:
text
IP 地址 = 一栋楼的地址
端口号 = 楼里的房间号
例如:
text
192.168.50.100:22 → 工控机上的 SSH 服务
192.168.50.100:80 → 工控机上的 HTTP 服务
笔记本连接工控机 SSH 时,双方都有端口:
text
笔记本:192.168.50.101:53001
↓
工控机:192.168.50.100:22
22是 SSH 服务通常使用的固定监听端口;53001是笔记本为本次连接临时选择的来源端口;- 连接结束后,临时端口会被释放,下一次不一定相同。
十二、TCP、UDP 与 SSH
可以先用一个简单类比:
text
TCP ≈ 打电话:先建立连接,再可靠、按顺序地交流
UDP ≈ 寄明信片:直接发送,通常不逐份确认
SSH 需要命令和文件可靠传输,所以使用 TCP。SSH 登录的大致顺序是:
text
1. TCP 三次握手
2. SSH 协议和加密算法协商
3. 用户身份验证
4. 传输命令和终端输出
因此,不同 SSH 报错代表不同故障位置:
text
连接超时 → 路径、防火墙或返回链路可能有问题
连接被拒绝 → 通常已经到达目标,但端口没有服务接收,或被明确拒绝
密码错误 → TCP和SSH服务基本正常,身份验证失败
成功登录 → 整个流程正常
Windows 可测试 SSH 的 TCP 22 端口:
powershell
Test-NetConnection 192.168.50.100 -Port 22
结果中的:
text
TcpTestSucceeded : True
表示 TCP 22 端口可以建立连接。
在 Linux 工控机上可以检查 SSH:
bash
sudo systemctl status ssh
sudo ss -lntp | grep ':22'
监听地址的含义:
text
0.0.0.0:22 接收所有本机 IPv4 网卡的连接
127.0.0.1:22 只允许本机通过回环地址连接
192.168.50.100:22 只在这个具体 IPv4 地址上监听
客户端不能连接 0.0.0.0,而应连接工控机的实际地址:
bash
ssh 用户名@192.168.50.100
十三、DNS:把域名翻译成 IP
DNS 可以理解为互联网的"电话簿":
text
www.baidu.com → 180.101.49.44(示例结果之一)
DNS 负责回答"域名对应哪个 IP",默认网关则负责"如何把数据送到那个 IP"。两者职责不同。
223.5.5.5 是阿里云提供的公共 DNS 地址之一,不是百度地址,也不是校园网内部地址。测试它的意义在于:直接使用 IP,不依赖域名解析。
bash
ping 223.5.5.5
若它能通,说明基本外网路径大概率正常。
bash
ping www.baidu.com
则同时涉及 DNS 解析和网络连通性。
常见判断:
text
能访问具体 IP,但域名打不开
→ 优先检查 DNS
十四、Linux 共享模式做了什么
先查看连接名称:
bash
nmcli connection show
将有线连接设置成共享模式:
bash
sudo nmcli connection modify "Wired connection 1" ipv4.method shared
sudo nmcli connection down "Wired connection 1"
sudo nmcli connection up "Wired connection 1"
NetworkManager 的 shared 模式通常会自动完成:
- 给有线网卡设置
10.42.0.1; - 在有线侧启动 DHCP/DNS 转发服务;
- 开启 IPv4 转发;
- 建立必要的防火墙与 NAT 规则。
本案例中的状态为:
text
eno2:10.42.0.1/24
wlp0s20f3:192.168.110.140/24
net.ipv4.ip_forward = 1
检查命令:
bash
nmcli device status
nmcli connection show --active
nmcli -g ipv4.method connection show "Wired connection 1"
ip -4 route
sysctl net.ipv4.ip_forward
十五、为什么台式机能上网,而下级设备不能
Linux 防火墙会把流量大致分为三类:
text
INPUT 目标是台式机自己的数据
OUTPUT 台式机自己产生的数据
FORWARD 只是经过台式机、需要转交给别人的数据
台式机自己访问互联网属于 OUTPUT;笔记本经过台式机访问互联网属于 FORWARD。
当时的现象是:
text
台式机能访问互联网
笔记本能访问 XDR1520 和台式机有线口
笔记本不能访问公网 IP
这说明基础连接、DHCP、网关和台式机自身外网都正常,故障集中在 Linux 的转发/防火墙环节。系统中同时运行 Docker 等软件,它们也会管理防火墙规则;本次没有逐条证明是哪一个软件造成冲突,因此更严谨的结论是:转发链上的防火墙/NAT规则不完整或被其他规则影响。
临时补充了三条规则:
bash
sudo iptables -I FORWARD 1 \
-i eno2 -o wlp0s20f3 \
-s 10.42.0.0/24 -j ACCEPT
sudo iptables -I FORWARD 1 \
-i wlp0s20f3 -o eno2 \
-d 10.42.0.0/24 \
-m conntrack --ctstate ESTABLISHED,RELATED \
-j ACCEPT
sudo iptables -t nat -I POSTROUTING 1 \
-s 10.42.0.0/24 \
-o wlp0s20f3 -j MASQUERADE
它们分别表示:
规则一:允许内部流量向外发送
text
从 eno2 进入
从 wlp0s20f3 离开
来源属于 10.42.0.0/24
→ 允许转发
规则二:允许已建立连接的回复返回
text
从 wlp0s20f3 进入
从 eno2 离开
目标属于 10.42.0.0/24
并且属于已经建立或相关的连接
→ 允许转发
ESTABLISHED,RELATED 不等于允许外部随意主动连接,它主要放行由内部设备主动发起连接后产生的返回流量。
规则三:进行 NAT 地址转换
text
来源属于 10.42.0.0/24
即将从无线网卡离开
→ 将来源地址伪装成无线网卡当前的地址
MASQUERADE 很适合无线网卡这种通过 DHCP 获取、地址可能变化的接口。它会自动使用无线网卡当时的地址。
三个条件缺一不可:
text
ip_forward = 1 → Linux允许充当路由器
FORWARD ACCEPT → 防火墙允许这些中转流量
MASQUERADE → 对来源地址执行 NAT
十六、让规则在网络重连后自动恢复
直接执行的 iptables 规则通常只保存在内存中,重启后可能消失。因此创建 NetworkManager dispatcher 脚本:
text
/etc/NetworkManager/dispatcher.d/90-share-xdr1520
脚本内容:
bash
#!/bin/sh
[ "$1" = "eno2" ] || exit 0
LAN_IF="eno2"
WAN_IF="wlp0s20f3"
SUBNET="10.42.0.0/24"
case "$2" in
up|dhcp4-change)
iptables -C FORWARD -i "$LAN_IF" -o "$WAN_IF" -s "$SUBNET" -j ACCEPT 2>/dev/null ||
iptables -I FORWARD 1 -i "$LAN_IF" -o "$WAN_IF" -s "$SUBNET" -j ACCEPT
iptables -C FORWARD -i "$WAN_IF" -o "$LAN_IF" -d "$SUBNET" \
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null ||
iptables -I FORWARD 1 -i "$WAN_IF" -o "$LAN_IF" -d "$SUBNET" \
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -C POSTROUTING -s "$SUBNET" -o "$WAN_IF" \
-j MASQUERADE 2>/dev/null ||
iptables -t nat -I POSTROUTING 1 -s "$SUBNET" -o "$WAN_IF" \
-j MASQUERADE
;;
esac
赋予执行权限并检查语法:
bash
sudo chmod 755 /etc/NetworkManager/dispatcher.d/90-share-xdr1520
sudo sh -n /etc/NetworkManager/dispatcher.d/90-share-xdr1520
sh -n 没有输出通常表示没有发现 shell 语法错误。
该脚本不是常驻后台程序。NetworkManager 在网络状态变化时调用它;它只处理 eno2,执行完立即退出。脚本先用 iptables -C 检查规则是否存在,不存在时才用 iptables -I 添加,避免重复插入。
注意:脚本中的网卡名和网段必须与实际环境一致。不同电脑可能不是
eno2和wlp0s20f3,应使用nmcli device status或ip link核对。
十七、不再共享网络时如何恢复
如果以后台式机直接通过网线上网,不再承担共享功能,需要把有线连接从 shared 改回 auto:
bash
sudo nmcli connection modify "Wired connection 1" ipv4.method auto
sudo nmcli connection down "Wired connection 1"
sudo nmcli connection up "Wired connection 1"
并停用自动补规则的脚本:
bash
sudo chmod -x /etc/NetworkManager/dispatcher.d/90-share-xdr1520
随后重启一次,当前内存中的临时规则通常会被清除,台式机就恢复为普通的 DHCP 客户端:
text
shared → 台式机向网口后面的设备提供网络
auto → 台式机从网口前面的网络获取地址和网络
auto 能成功上网的前提是网线连接的上级网络提供 DHCP;若网络要求固定 IP、PPPoE 或认证,则需按上级网络要求配置。
十八、分层排障方法
遇到"下级设备不能上网"时,不要一次修改所有设置,可以逐层测试。
1. 先确认台式机自己能上网
bash
ping -c 4 223.5.5.5
ping -c 4 www.baidu.com
2. 查看 Linux 共享状态
bash
nmcli device status
nmcli connection show --active
nmcli -g ipv4.method connection show "Wired connection 1"
ip -4 route
sysctl net.ipv4.ip_forward
3. 检查路由器 WAN
本案例正常参数为:
text
WAN IP:10.42.0.126
子网掩码:255.255.255.0
默认网关:10.42.0.1
DNS:10.42.0.1
4. 在笔记本逐层测试
powershell
ping 192.168.50.1
ping 10.42.0.1
ping 223.5.5.5
nslookup www.baidu.com
判断方式:
text
192.168.50.1 不通
→ 笔记本与 XDR1520 LAN 之间有问题
192.168.50.1 通,10.42.0.1 不通
→ XDR1520 WAN、路由或隔离设置有问题
10.42.0.1 通,223.5.5.5 不通
→ Linux 转发、防火墙或 NAT 有问题
223.5.5.5 通,域名解析失败
→ DNS 有问题
全部测试成功但浏览器打不开
→ 检查系统代理、浏览器代理、Clash 等应用层设置
从 Linux 台式机直接 ping 192.168.50.1 失败不一定异常。台式机位于 XDR1520 的 WAN 一侧,家用路由器通常不允许从 WAN 侧访问 LAN 管理地址。
十九、最终理解
本次组网最核心的知识可以浓缩为:
- DHCP 自动分配 IP、网关、DNS 等参数;
- 子网掩码 判断目标是否处于同一局域网;
- 默认网关 是离开当前局域网的下一站;
- ARP 在本地 IPv4 局域网中查询目标或网关的 MAC;
- 交换 负责同网段通信,路由负责跨网段通信;
- NAT 将内部私有地址转换成外侧地址;
- IP 找设备,端口找设备上的服务;
- FORWARD 控制经过 Linux 中转的数据;
ip_forward、防火墙放行和 NAT 规则共同实现 Linux 网络共享;- 排障时应逐跳测试,先判断故障属于链路、路由、转发、DNS,还是具体应用。
通过这次实践,Linux 台式机完成了:
text
无线网络入口
+ DHCP 服务
+ IPv4 路由转发
+ 防火墙放行
+ NAT 地址转换
= 一台临时的软件路由器