☰
Ubuntu 热点共享全攻略:从 IP 转发到 NAT 的完整配置指南
2026/10/23 13:58:36 网站建设 项目流程

1. 为什么要在 Ubuntu 上折腾热点共享

很多人第一次听到"用 Ubuntu 搭热点"会觉得多此一举——家里不是有路由器吗?手机不是能开热点吗?但真到了某些场景,这件事的价值就凸显出来了。比如你手头只有一根网线或者一个 USB 网卡能上网,但周围有好几台设备(手机、平板、另一台笔记本)需要联网;又比如你在做嵌入式开发,手上一块 ARM 开发板通过网口连到了 Ubuntu 主机,你希望这块板子也能访问外网去拉依赖包;再比如临时办公、出差住酒店,房间里只有一个网口,几个人要同时上网。这些场景下,把 Ubuntu 主机变成一个"软路由 + 热点"就是最省事的方案。

这个需求的核心其实就两件事:第一,让 Ubuntu 主机自己先能上网(不管是通过有线、还是通过另一张无线网卡连到上游);第二,让 Ubuntu 主机把这份网络"转发"出去,并以热点的形式广播给其他设备。第一件事通常已经满足了,真正有技术含量的是第二件——它涉及网卡的工作模式切换、IP 转发内核参数、NAT 地址转换、DHCP 地址分配这一整套链路。只要其中任何一环没配对,表现就是"热点能连上但上不了网"或者"热点根本搜不到"。

我写这篇的出发点,是因为网上大量教程要么只给命令不讲原理,要么默认你是 x86 桌面环境、用 NetworkManager 图形界面点两下就完事,一旦换到 ARM 开发板、或者换到没有图形界面的服务器版 Ubuntu,那些教程就全失效了。而实际上,这套方案在 x86 和 ARM 上是完全一致的,因为真正干活的是 Linux 内核的网络子系统和几个用户态工具,跟 CPU 架构没关系。所以下面我会从原理讲到实操,把每一步"为什么这么做"都讲清楚,让你不管在什么平台上都能自己排查。

先明确一下本文适合谁:你需要对 Linux 命令行有基本熟悉度(会sudo、会看ip addr),知道什么是网卡名(比如eth0、wlan0、enp3s0这种)。如果你完全是新手,也没关系,我会把每个命令拆开解释。整篇内容围绕"共享网络 + 开热点"这一条主线,覆盖有线共享给无线、无线共享给无线两种主流拓扑。

2. 动手前必须搞清楚的几个底层概念

在敲任何命令之前,我强烈建议你先把下面这几个概念理顺。我见过太多人照着教程复制粘贴,结果一报错就完全不知道从哪查起,根源就是没理解这些组件各自负责什么。

2.1 网卡的两种身份:Station 和 AP

一块无线网卡在 Linux 下可以工作在不同模式,最常见的是Station 模式(也叫 Managed 模式),也就是我们平时连别人家 WiFi 时用的模式——网卡作为"客户端"去连接一个已有的热点。另一种是AP 模式(Access Point 模式),此时网卡自己变成"热点",等着别人来连。

关键点在于:不是所有无线网卡都支持 AP 模式。这取决于网卡芯片和驱动。有些廉价 USB 无线网卡只支持 Station,你无论怎么配置都开不出热点。判断方法后面会给命令。另外,一块网卡在同一时刻通常只能处于一种模式,所以如果你想"用无线连上游、再用无线开热点",那需要两张无线网卡;如果只有一张无线网卡,那它一般只能用来开热点,上游网络得走有线。

2.2 IP 转发:内核里的那个"开关"

Linux 内核默认是不转发数据包的。也就是说,从wlan0进来的包,内核看到目标地址不是自己,默认会直接丢掉,而不是转给eth0发出去。要让主机变成路由器,必须打开内核的 IP 转发开关,对应参数是net.ipv4.ip_forward。把它设成 1,内核才愿意帮别人转发包。这是整个方案的第一道门槛,忘了开,后面全白搭。

2.3 NAT:让内网设备"借用"主机的公网身份

光转发还不够。你内网设备(连你热点的手机)的 IP 是私有地址,比如192.168.12.100,这个地址在公网上是不可路由的。数据包转发出去到了上游,上游路由器根本不知道怎么把回包送回来。所以需要NAT(网络地址转换),具体说是MASQUERADE(源地址伪装):主机在把包发出去之前,把源地址改成自己出口网卡的地址,这样回包就能回到主机,主机再根据连接跟踪表把包还原给内网设备。这一步靠iptables(或nftables)的规则实现。

2.4 DHCP:让连上来的设备自动拿到 IP

设备连上你的热点后,它需要一个 IP 地址、一个网关地址、一个 DNS 地址才能正常上网。这些信息得有人发给它,这个角色就是DHCP 服务器。我们会在主机上跑一个轻量 DHCP 服务(常用dnsmasq),让它给连上来的客户端分配地址,并告诉它们"网关就是我,DNS 也走我"。

把这四件事串起来,整个数据流就是:客户端连上热点 → DHCP 给它分配 IP 和网关 → 客户端发数据包给网关(主机)→ 内核 IP 转发打开 → iptables 做 NAT → 包从上游网卡出去 → 回包原路返回。任何一环断了,现象都是"连得上但没网"。理解了这条链路,排查就有方向了。

3. 环境确认:先看看你的网卡支不支持

正式配置前,先做几项体检。这一步能帮你提前排除掉"硬件根本不支持"这种最让人崩溃的情况。

3.1 列出所有网络接口

ip link show

或者更直观地看无线网卡:

iw dev

iw dev会列出所有无线设备,输出里Interface wlan0这样的就是无线网卡名。记住这个名字,后面所有配置都要用。注意,不同机器上网卡名可能完全不同,x86 台式机常见wlan0、wlp3s0,ARM 开发板上可能是wlan0也可能是wlan1,千万不要照抄教程里的名字,一定以你自己机器实际输出为准。

3.2 检查网卡是否支持 AP 模式

这是最关键的一步。用下面命令查看网卡支持的模式:

iw list

在输出里找Supported interface modes这一段,看里面有没有AP。如果有,恭喜,可以继续;如果没有,那这块网卡开不了热点,只能换网卡。我实测下来,市面上一些采用特定芯片的方案(比如常见的 RTL8188 系列部分型号)在 AP 模式上支持得并不好,而另一些芯片方案则开箱即用。ARM 开发板板载的 WiFi 模块差异更大,有的板子板载模块压根不支持 AP,需要外接一个 USB 无线网卡。

提示:如果iw list输出里AP那一项存在,但实际开热点时各种报错,很可能是驱动或固件版本问题,可以尝试更新内核和固件包。

3.3 确认上游网络已经通了

在配置共享之前,先确保主机自己能上网。用:

ping -c 3 223.5.5.5

能通说明基础网络没问题。这里用 IP 而不是域名,是为了排除 DNS 干扰——如果 IP 能通但域名不通,那是 DNS 问题,跟热点共享无关。记下你当前用来上网的那张网卡名,它就是"上游出口网卡",后面 NAT 规则里要用到。假设它是eth0(有线)或者wlan0(无线连的上游)。

4. 方案选型:create_ap 还是纯手工配置

实现热点共享有两条路,我分别说说适用场景,你可以按需选。

4.1 用 create_ap 一键脚本:快,但要知道它做了什么

create_ap是一个封装好的脚本,一条命令就能把热点、DHCP、NAT 全搞定,非常适合快速验证。典型用法:

sudo create_ap wlan0 eth0 MyHotspot MyPassword

意思是:用wlan0开热点,名字叫MyHotspot,密码MyPassword,网络从eth0共享出去。它内部其实就是帮我们做了 hostapd 配置、dnsmasq 配置、iptables 规则这一整套。

它的优点是省事,缺点是黑盒——一旦出问题,你不知道是哪一层挂了,而且它对不同发行版、不同网卡驱动的兼容性偶尔会翻车。所以我更推荐你至少完整走一遍手工配置,理解每一层,之后再用脚本提效。

4.2 手工配置:hostapd + dnsmasq + iptables

手工方案由三个组件构成,各司其职:

组件职责对应前面讲的概念
hostapd把网卡切到 AP 模式并广播热点、处理认证2.1 网卡 AP 模式
dnsmasq给客户端分配 IP、提供 DNS 转发2.4 DHCP
iptables做 NAT 地址转换2.3 NAT
内核参数打开 IP 转发2.2 IP 转发

这套组合的好处是每一层都透明可控,出问题能精确定位。下面我就按这个方案完整走一遍。先装依赖:

sudo apt update sudo apt install hostapd dnsmasq iptables -y

装完后有个很重要的坑:dnsmasq装好后可能会自动启动并占用 53 端口,而系统里可能已经有别的服务(比如 systemd-resolved)也在用 53 端口,导致冲突。所以装完先把它停掉,等我们配置好再手动起:

sudo systemctl stop dnsmasq sudo systemctl stop hostapd

同时建议把这两个服务设为开机不自动启动,避免它们用默认配置乱跑:

sudo systemctl disable dnsmasq sudo systemctl disable hostapd

5. 一步步配置:从网卡模式到 NAT 全链路

这一节是核心实操,我会把每一步的命令、含义、以及可能踩的坑都写清楚。假设你的无线网卡是wlan0,上游出口网卡是eth0,热点网段用192.168.12.0/24。请根据自己实际情况替换这些名字和网段。

5.1 给无线网卡配一个静态 IP

热点本身需要一个 IP,作为客户端的网关。先给wlan0配静态地址:

sudo ip addr add 192.168.12.1/24 dev wlan0 sudo ip link set wlan0 up

这里192.168.12.1就是将来客户端的网关地址。选192.168.12.0/24这个网段是有讲究的:要避开你上游网络已经在用的网段。比如你家路由器是192.168.1.0/24,那热点就别再用192.168.1.x,否则路由会混乱。我习惯用192.168.12.x或10.0.0.x这类不常冲突的段。

注意:用ip addr add配的地址是临时的,重启就没了。要持久化,得写进 netplan 配置(Ubuntu 18.04 之后默认用 netplan)或者/etc/network/interfaces。持久化配置我放在后面单独讲。

5.2 写 hostapd 配置文件

新建/etc/hostapd/hostapd.conf,内容如下:

interface=wlan0 driver=nl80211 ssid=MyHotspot hw_mode=g channel=7 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=MyPassword123 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP

逐项解释几个关键参数,这些是新手最容易配错的地方:

  • driver=nl80211:这是现代 Linux 无线驱动的标准接口,绝大多数网卡都用它。极老的网卡可能要用别的,但基本可以忽略。
  • hw_mode=g:表示用 2.4GHz 频段的 802.11g 模式。如果想用 5GHz,改成hw_mode=a,但要注意你的网卡和客户端都得支持 5GHz。
  • channel=7:信道。2.4GHz 建议选 1、6、11 这三个互不重叠的信道之一,避免和周围 WiFi 打架。我选 7 只是示例,实际建议用 6 或 11。
  • wpa=2配合wpa_key_mgmt=WPA-PSK:表示用 WPA2 个人版加密,这是目前兼容性最好的选择。
  • wpa_passphrase:热点密码,至少 8 位,少于 8 位 hostapd 会拒绝启动,这是很多人第一次配就失败的原因。

配好后,告诉 hostapd 去哪里读配置。编辑/etc/default/hostapd,找到#DAEMON_CONF=""这一行,改成:

DAEMON_CONF="/etc/hostapd/hostapd.conf"

5.3 写 dnsmasq 配置

新建/etc/dnsmasq.conf的补充配置,或者直接编辑主配置。我习惯单独放一个文件/etc/dnsmasq.d/hotspot.conf:

interface=wlan0 dhcp-range=192.168.12.10,192.168.12.100,12h dhcp-option=3,192.168.12.1 dhcp-option=6,192.168.12.1 server=223.5.5.5

解释一下:

  • interface=wlan0:只在这个接口上提供 DHCP 服务,避免干扰其他网络。
  • dhcp-range:分配地址的范围,从.10到.100,租期 12 小时。范围别和网关.1重叠。
  • dhcp-option=3:告诉客户端网关是192.168.12.1(option 3 就是网关)。
  • dhcp-option=6:告诉客户端 DNS 是192.168.12.1(option 6 就是 DNS),也就是让 dnsmasq 自己代理 DNS。
  • server=223.5.5.5:dnsmasq 自己向上游查询时用的 DNS。

5.4 打开内核 IP 转发

这一步千万别漏:

sudo sysctl -w net.ipv4.ip_forward=1

要永久生效,编辑/etc/sysctl.conf,加上或取消注释这一行:

net.ipv4.ip_forward=1

然后sudo sysctl -p生效。我踩过的坑就是:临时开了转发,重启后忘了持久化,结果第二天热点连上又没网,查了半天才发现是转发开关复位了。

5.5 配置 iptables NAT 规则

先确认默认策略和清空可能存在的旧规则(谨慎操作,如果你机器上有其他 iptables 规则,别乱清):

sudo iptables -t nat -F sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

三条规则的含义:

  1. POSTROUTING ... MASQUERADE:从eth0出去的包做源地址伪装,这是 NAT 的核心。
  2. FORWARD ... RELATED,ESTABLISHED:允许从上游回来的、已建立连接的回包进入内网。
  3. FORWARD -i wlan0 -o eth0 -j ACCEPT:允许内网发起的包转发到上游。

这三条缺一不可。只配了 MASQUERADE 而没配 FORWARD 规则,是"能连上但上不了网"的经典原因——因为默认 FORWARD 链策略可能是 DROP。

5.6 启动服务并验证

按顺序启动:

sudo systemctl start hostapd sudo systemctl start dnsmasq

然后用手机搜一下MyHotspot,连上,看能不能上网。如果不行,按下一节的排查思路走。

6. 连不上或连上没网:完整排查链路

这一节我按"从现象到根因"的顺序,把最常见的几类问题拆开讲。排查的核心思路是分层验证:先确认热点广播了没,再确认客户端拿到 IP 没,再确认转发和 NAT 通没通。

6.1 热点根本搜不到

先看 hostapd 状态:

sudo systemctl status hostapd

如果启动失败,多半是配置问题。常见原因:

  • 密码少于 8 位。
  • 网卡不支持 AP 模式(回到 3.2 检查)。
  • 网卡被其他进程占用(比如 NetworkManager 还在管着它)。这种情况需要把网卡从 NetworkManager 里排除,编辑/etc/NetworkManager/NetworkManager.conf,在[keyfile]段加unmanaged-devices=interface-name:wlan0,然后重启 NetworkManager。

6.2 能连上但拿不到 IP

这说明 hostapd 正常,问题在 dnsmasq。检查:

sudo systemctl status dnsmasq

常见原因是 53 端口被占用。用sudo ss -ulnp | grep :53看谁占着。如果是 systemd-resolved,可以禁用它或改 dnsmasq 监听端口。另一个原因是dhcp-range网段和wlan0的 IP 不在同一网段,检查 5.1 配的地址和 5.3 的 range 是否匹配。

6.3 拿到 IP 了但上不了网

这是最典型的一类。按下面顺序查:

  1. IP 转发开了没:cat /proc/sys/net/ipv4/ip_forward,应该是 1。
  2. NAT 规则在不在:sudo iptables -t nat -L -n -v,看有没有 MASQUERADE 那条。
  3. FORWARD 链策略:sudo iptables -L FORWARD -n -v,看包有没有被 ACCEPT,计数有没有增长。
  4. 上游网卡名对不对:MASQUERADE 里的-o eth0必须是你真正上网的那张网卡。如果你上游是无线连的,这里就得改成对应的无线网卡名。

我遇到过一次特别隐蔽的情况:上游网卡名在重启后变了(从eth0变成了enp3s0),导致 MASQUERADE 规则指向了一个不存在的接口,NAT 静默失效。所以网卡名一定要用ip link确认,别凭记忆。

6.4 DNS 解析失败

如果 IP 能 ping 通(比如ping 223.5.5.5通),但域名解析不了,那是 DNS 问题。检查 dnsmasq 的server=配置,以及客户端拿到的 DNS 是不是192.168.12.1。可以在客户端上nslookup或dig测一下。

7. 让配置在重启后依然生效

前面很多命令是临时的,重启就没了。要让它开机自动生效,需要做几件事。

7.1 持久化网卡 IP

Ubuntu 用 netplan 管理网络。编辑/etc/netplan/下的 yaml 文件,给wlan0加静态地址。示例:

network: version: 2 renderer: networkd ethernets: eth0: dhcp4: true wifis: wlan0: dhcp4: no addresses: [192.168.12.1/24]

改完sudo netplan apply。注意缩进必须用空格,yaml 对缩进极其敏感,这是新手常翻车的地方。

7.2 持久化 iptables 规则

用iptables-persistent:

sudo apt install iptables-persistent -y sudo netfilter-persistent save

这样当前的 iptables 规则会被保存,开机自动恢复。

7.3 让 hostapd 和 dnsmasq 开机自启

因为我们前面 disable 了它们,现在配置好了,重新 enable:

sudo systemctl enable hostapd sudo systemctl enable dnsmasq

但要注意,dnsmasq 开机自启时可能和 systemd-resolved 抢 53 端口,建议在 dnsmasq 配置里加bind-interfaces并明确interface=wlan0,减少冲突概率。

8. 几个我踩过的坑和实用心得

最后分享一些文档里不会写、但实际会遇到的细节。

关于 ARM 平台:ARM 开发板上跑这套方案,命令和 x86 完全一样,但有两个额外注意点。一是开发板板载无线模块的 AP 支持情况参差不齐,务必先用iw list确认;二是开发板资源有限,hostapd 和 dnsmasq 都很轻量,问题不大,但如果同时跑其他重负载服务,注意内存。另外开发板常通过网口连主机,此时上游网卡就是那个网口,名字可能是eth0也可能是end0之类,以实际为准。

关于信道选择:2.4GHz 只有 1、6、11 三个真正不重叠的信道。如果你周围 WiFi 密集,选错信道会导致热点速度极慢甚至频繁掉线。可以用sudo iw dev wlan0 scan | grep -i freq看看周围占用情况再决定。

关于双无线网卡:如果你有两张无线网卡,想实现"无线连上游 + 无线开热点",思路是一样的,只是把上游出口网卡从eth0换成连上游的那张无线网卡名即可。但要注意两张网卡别用同一信道,否则会互相干扰。

关于调试技巧:排查时善用sudo journalctl -u hostapd -f和sudo journalctl -u dnsmasq -f实时看日志,比瞎猜快得多。另外在客户端上ping网关(192.168.12.1)能通、但ping外网不通,基本就锁定在转发或 NAT 层,直接查 6.3 那几步。

我个人在实际操作中的体会是,这套方案真正的难点从来不是命令本身,而是理解数据包从客户端到外网再回来的完整路径。一旦你脑子里有了这条链路,任何一环出问题你都能顺着链路定位,而不是对着报错干瞪眼。这也是为什么我在前面花了那么多篇幅讲原理——命令会过时,网卡名会变,但这条链路是不变的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询