资讯详情

资讯详情

Ubuntu 热点共享全攻略:从 IP 转发到 NAT 的完整配置指南

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 deviw dev会列出所有无线设备输出里Interface wlan0这样的就是无线网卡名。记住这个名字后面所有配置都要用。注意不同机器上网卡名可能完全不同x86 台式机常见wlan0、wlp3s0ARM 开发板上可能是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 DHCPiptables做 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 hostapd5. 一步步配置从网卡模式到 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内容如下interfacewlan0 drivernl80211 ssidMyHotspot hw_modeg channel7 wmm_enabled0 macaddr_acl0 auth_algs1 ignore_broadcast_ssid0 wpa2 wpa_passphraseMyPassword123 wpa_key_mgmtWPA-PSK wpa_pairwiseTKIP rsn_pairwiseCCMP逐项解释几个关键参数这些是新手最容易配错的地方drivernl80211这是现代 Linux 无线驱动的标准接口绝大多数网卡都用它。极老的网卡可能要用别的但基本可以忽略。hw_modeg表示用 2.4GHz 频段的 802.11g 模式。如果想用 5GHz改成hw_modea但要注意你的网卡和客户端都得支持 5GHz。channel7信道。2.4GHz 建议选 1、6、11 这三个互不重叠的信道之一避免和周围 WiFi 打架。我选 7 只是示例实际建议用 6 或 11。wpa2配合wpa_key_mgmtWPA-PSK表示用 WPA2 个人版加密这是目前兼容性最好的选择。wpa_passphrase热点密码至少 8 位少于 8 位 hostapd 会拒绝启动这是很多人第一次配就失败的原因。配好后告诉 hostapd 去哪里读配置。编辑/etc/default/hostapd找到#DAEMON_CONF这一行改成DAEMON_CONF/etc/hostapd/hostapd.conf5.3 写 dnsmasq 配置新建/etc/dnsmasq.conf的补充配置或者直接编辑主配置。我习惯单独放一个文件/etc/dnsmasq.d/hotspot.confinterfacewlan0 dhcp-range192.168.12.10,192.168.12.100,12h dhcp-option3,192.168.12.1 dhcp-option6,192.168.12.1 server223.5.5.5解释一下interfacewlan0只在这个接口上提供 DHCP 服务避免干扰其他网络。dhcp-range分配地址的范围从.10到.100租期 12 小时。范围别和网关.1重叠。dhcp-option3告诉客户端网关是192.168.12.1option 3 就是网关。dhcp-option6告诉客户端 DNS 是192.168.12.1option 6 就是 DNS也就是让 dnsmasq 自己代理 DNS。server223.5.5.5dnsmasq 自己向上游查询时用的 DNS。5.4 打开内核 IP 转发这一步千万别漏sudo sysctl -w net.ipv4.ip_forward1要永久生效编辑/etc/sysctl.conf加上或取消注释这一行net.ipv4.ip_forward1然后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三条规则的含义POSTROUTING ... MASQUERADE从eth0出去的包做源地址伪装这是 NAT 的核心。FORWARD ... RELATED,ESTABLISHED允许从上游回来的、已建立连接的回包进入内网。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-devicesinterface-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 了但上不了网这是最典型的一类。按下面顺序查IP 转发开了没cat /proc/sys/net/ipv4/ip_forward应该是 1。NAT 规则在不在sudo iptables -t nat -L -n -v看有没有 MASQUERADE 那条。FORWARD 链策略sudo iptables -L FORWARD -n -v看包有没有被 ACCEPT计数有没有增长。上游网卡名对不对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 持久化网卡 IPUbuntu 用 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-persistentsudo apt install iptables-persistent -y sudo netfilter-persistent save这样当前的 iptables 规则会被保存开机自动恢复。7.3 让 hostapd 和 dnsmasq 开机自启因为我们前面 disable 了它们现在配置好了重新 enablesudo systemctl enable hostapd sudo systemctl enable dnsmasq但要注意dnsmasq 开机自启时可能和 systemd-resolved 抢 53 端口建议在 dnsmasq 配置里加bind-interfaces并明确interfacewlan0减少冲突概率。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 那几步。我个人在实际操作中的体会是这套方案真正的难点从来不是命令本身而是理解数据包从客户端到外网再回来的完整路径。一旦你脑子里有了这条链路任何一环出问题你都能顺着链路定位而不是对着报错干瞪眼。这也是为什么我在前面花了那么多篇幅讲原理——命令会过时网卡名会变但这条链路是不变的。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →