好的,这是一个非常典型的场景,我们将把你的 Ubuntu 台式机配置成一个路由器,让你的 Windows 电脑通过它的 Wi-Fi 连接来访问互联网。
整个过程分为三大部分:
- 配置 Ubuntu 网络:设置有线和无线网卡的 IP 地址。
- 开启 IP 转发:让 Ubuntu 系统具备路由数据包的能力。
- 配置 iptables 防火墙:实现网络地址转换(NAT),让来自 Windows 的数据包能伪装成从 Ubuntu 发出。
第一步:配置 Ubuntu 台式机的网络
我们需要为你的有线网卡 enp5s0
设置一个静态 IP 地址,它将作为 Windows 电脑的网关。Wi-Fi 网卡 wlo1
则保持正常连接互联网的状态(通常是通过 DHCP 自动获取 IP)。
方法一:使用 Netplan (推荐,适用于 Ubuntu 18.04 及以上版本)
-
找到你的 Netplan 配置文件 。它通常在
/etc/netplan/
目录下,文件名可能是01-network-manager-all.yaml
或50-cloud-init.yaml
。bashsudo nano /etc/netplan/01-network-manager-all.yaml
-
修改配置文件 。将
enp5s0
的配置改为静态 IP,并确保wlo1
使用 DHCP。yaml# Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager ethernets: enp5s0: # 你的有线网卡 dhcp4: no # 关闭 DHCP addresses: [192.168.100.1/24] # 为有线网卡设置一个静态IP和子网掩码 nameservers: addresses: [8.8.8.8, 1.1.1.1] # 可选:设置DNS服务器 wifis: wlo1: # 你的无线网卡 dhcp4: yes # 开启 DHCP,自动获取上网IP access-points: "你的WiFi名称": # 替换成你的WiFi名称 password: "你的WiFi密码" # 替换成你的WiFi密码
说明:
addresses: [192.168.100.1/24]
:我们给有线网卡分配了192.168.100.1
这个 IP 地址。/24
表示子网掩码是255.255.255.0
,这意味着内网网段是192.168.100.0/24
。你可以根据喜好修改这个网段。wlo1
的配置保持自动获取 IP 即可,它负责连接你的主路由器上网。
-
应用配置。
bashsudo netplan apply
-
验证 。执行
ip addr
命令,检查enp5s0
的 IP 是否已变为192.168.100.1
,并且wlo1
已经成功连接 Wi-Fi 并获取了 IP。
方法二:使用图形界面 (更简单)
- 点击屏幕右上角的网络图标,选择 "有线网络设置"。
- 在打开的窗口中,找到你的有线连接(可能叫 "有线" 或 "Wired connection 1"),点击旁边的齿轮 ⚙️ 图标。
- 切换到 "IPv4" 标签页。
- 将 IPv4 方法从 "自动 (DHCP) " 改为 "手动"。
- 在地址部分,填写:
- 地址 :
192.168.100.1
- 子网掩码 :
255.255.255.0
- 网关 : (留空)
- 地址 :
- 在 "DNS " 服务器部分,你可以填写公共 DNS,如
8.8.8.8, 1.1.1.1
。 - 点击 "应用"。
对于 Wi-Fi,确保它已经正常连接到你的家用路由器,可以上网。
第二步:开启 IP 转发功能
这一步是让 Ubuntu 系统从一个网络接口(enp5s0)接收数据包,并转发到另一个网络接口(wlo1)。
-
临时开启 (重启后失效)。这可以让你立即测试配置是否成功。
bashsudo sysctl -w net.ipv4.ip_forward=1
-
永久开启 (推荐) 。编辑
sysctl.conf
文件。bashsudo nano /etc/sysctl.conf
找到并取消注释(删除开头的
#
)下面这一行:net.ipv4.ip_forward=1
如果找不到这一行,就在文件末尾添加它。
-
让永久配置立即生效。
bashsudo sysctl -p
第三步:配置 iptables 防火墙和 NAT
这是最关键的一步,它将来自 Windows 的流量(源地址是 192.168.100.0/24
网段)伪装成从 Ubuntu 自己的 Wi-Fi 接口发出,从而实现上网。
-
清空并设置默认策略 (可选,但推荐)。
bashsudo iptables -F sudo iptables -X sudo iptables -t nat -F sudo iptables -t nat -X sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT
-
添加 NAT 规则。
bashsudo iptables -t nat -A POSTROUTING -o wlo1 -j MASQUERADE
命令解释:
-t nat
: 操作 NAT 表。-A POSTROUTING
: 在数据包即将离开系统时(POSTROUTING 链)添加一条规则。-o wlo1
: 指定数据包要从wlo1
(Wi-Fi) 接口出去。-j MASQUERADE
: 执行 "伪装" 动作。这会自动获取wlo1
接口的 IP 地址,并将数据包的源 IP 地址替换成它。这对于 IP 地址是动态获取的情况(如 Wi-Fi)特别有用。
-
允许转发。默认情况下,Ubuntu 的防火墙可能阻止转发。我们需要明确允许从有线网卡到无线网卡的流量。
bashsudo iptables -A FORWARD -i enp5s0 -o wlo1 -j ACCEPT sudo iptables -A FORWARD -i wlo1 -o enp5s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
命令解释:
- 第一条:允许从
enp5s0
(有线) 进入,从wlo1
(Wi-Fi) 出去的流量。 - 第二条:允许从
wlo1
(Wi-Fi) 进入,从enp5s0
(有线) 出去的、并且是 "相关的" 或 "已建立的" 连接的返回流量。这是为了让响应数据包能回到 Windows 电脑。
- 第一条:允许从
-
保存 iptables 规则 。默认情况下,
iptables
规则在重启后会丢失。你需要保存它们。bash# 安装持久化工具 sudo apt update sudo apt install iptables-persistent
在安装过程中,系统会提示你保存当前的 IPv4 和 IPv6 规则,选择 Yes。
以后如果你修改了规则,可以用以下命令手动保存:
bashsudo netfilter-persistent save sudo netfilter-persistent reload
第四步:配置 Windows 电脑
现在,Ubuntu 这边已经配置好了。最后一步是设置 Windows 电脑。
-
用网线将 Windows 电脑和 Ubuntu 台式机连接起来。
-
进入 Windows 的网络设置:
- 打开 "设置" -> "网络和 Internet"。
- 点击你当前的有线网络连接(可能叫 "以太网" 或 "以太网 2")。
- 点击 "更改适配器选项"。
- 右键点击你的有线网卡,选择 "属性"。
- 双击 "Internet 协议版本 4 (TCP/IPv4)"。
-
选择 "使用下面的 IP 地址",并填写:
- IP 地址 :
192.168.100.2
(这个地址只要和 Ubuntu 的有线网卡在同一网段即可,且不能冲突) - 子网掩码 :
255.255.255.0
- 默认网关 :
192.168.100.1
(必须是 Ubuntu 有线网卡的 IP 地址)
- IP 地址 :
-
在下方的 DNS 服务器部分,选择 "使用下面的 DNS 服务器地址",并填写:
- 首选 DNS 服务器 :
8.8.8.8
(Google DNS) 或1.1.1.1
(Cloudflare DNS) - 备用 DNS 服务器 :
1.1.1.1
或8.8.4.4
- 首选 DNS 服务器 :
-
点击 "确定" 保存。
测试
-
在 Windows 上测试:
- 打开命令提示符 (cmd) 或 PowerShell。
- Ping Ubuntu 的有线网卡 :
ping 192.168.100.1
。如果能通,说明两台电脑的内网连接成功。 - Ping 外网地址 :
ping baidu.com
或ping 8.8.8.8
。如果能通,说明路由转发和 NAT 都已成功配置!你现在应该可以用 Windows 电脑上网了。
-
在 Ubuntu 上测试:
- 打开终端。
- Ping Windows 的 IP :
ping 192.168.100.2
。如果能通,说明双向连接正常。
如果 ping
不通,请检查:
- 网线是否插好。
- Ubuntu 和 Windows 的 IP 地址、子网掩码、网关是否填写正确。
- Ubuntu 的
iptables
规则是否正确且已保存。 - Ubuntu 的
ip_forward
是否开启 (cat /proc/sys/net/ipv4/ip_forward
应该输出1
)。 - Ubuntu 的防火墙(如
ufw
)是否有其他策略阻止了连接。