0. 前言
总结一下ubuntu的网络命令。之前总爱拿来就用,但容易引发问题!
一旦管理不好,在小黑屏上处理真是头疼!!本文将对症下药,分别介绍以下几行命令
bash
ip link set wlan0 down/up
ip addr flush dev wlan0
ip addr add 192.168.4.1/24 dev wlan0
systemctl start NetworkManager
systemctl restart NetworkManager
systemctl stop NetworkManager
systemctl start wpa_supplicant
systemctl stop wpa_supplicant
systemctl enable wpa_supplicant
systemctl disable wpa_supplicant
nmcli device wifi rescan
nmcli -t -f NAME connection show
nmcli connection up conn
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
pkill hostapd
pkill dnsmasq
sysctl -w net.ipv4.ip_forward=1
hostapd hostapd_f -B
dnsmasq -C dnsmasq_f --no-daemon
1. IP命令
ip link set wlan0 down
- 作用:禁用wlan0网络接口, 这是准备进行网络配置前的标准步骤。
- 等效于:ifconfig wlan0 down, ifconfig正在被逐渐淘汰
- 物理层面:关闭无线网卡的无线电;网络层面:断开所有连接,停止数据包收发
ip link set wlan0 up
- 作用:启用wlan0 网络接口
- 注意:此时接口还没有 IP 地址
- 物理层面:开启无线网卡的无线电;网络层面:激活接口,可以开始扫描/连接网络
ip addr flush dev wlan0
作用:清理旧配置,准备重新配置。清空 wlan0 接口的所有 IP 地址配置。具体行为:``删除所有 IPv4 和 IPv6 地址;删除所有相关路由;重置接口的网络配置
ip addr add 192.168.4.1/24 dev wlan0
- 作用:为 wlan0 接口添加静态 IP 地址,典型用途:设置为无线接入点的网关地址
- 配置内容:
IP 地址:192.168.4.1
子网掩码:255.255.255.0(/24 表示前24位是网络位)
网络范围:192.168.4.0 - 192.168.4.255
典型应用场景:创建无线接入点(AP)
bash
#!/bin/bash
# 将树莓派/开发板设置为 WiFi 热点
# 1. 停止网络管理器(避免干扰)
sudo systemctl stop NetworkManager
# 或
sudo systemctl stop wpa_supplicant
# 2. 配置接口为静态IP(作为AP的网关)
sudo ip link set wlan0 down
sudo ip link set wlan0 up
sudo ip addr flush dev wlan0
sudo ip addr add 192.168.4.1/24 dev wlan0
# 3. 安装并配置 hostapd(AP软件)
sudo apt install hostapd
sudo nano /etc/hostapd/hostapd.conf
# 添加:
# interface=wlan0
# ssid=MyHotspot
# channel=7
# hw_mode=g
# auth_algs=1
# wpa=2
# wpa_passphrase=12345678
# 4. 启动 hostapd
sudo hostapd /etc/hostapd/hostapd.conf
相关命令扩展
# 查看接口状态
ip link show wlan0
# UP 表示启用,LOWER_UP 表示物理连接正常
# 查看IP地址
ip addr show wlan0
# 或简写:ip a show wlan0
# 查看路由表
ip route show
# 确认是否有 192.168.4.0/24 dev wlan0 的路由
# 测试连通性
ping -c 3 192.168.4.1 # 测试自身IP
如果要完整配置一个AP,还需要:
# 1. 启用IP转发(如果要让客户端访问外网)
sudo sysctl -w net.ipv4.ip_forward=1
# 2. 设置NAT(网络地址转换)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 3. 设置DNS服务器(可选)
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
注意事项
所有命令都需要 root 权限:sudo ip link set wlan0 down
这些配置是临时的,重启后会丢失。查看重启后会恢复的配置:
cat /etc/network/interfaces
cat /etc/netplan/*.yaml # Ubuntu 18.04+
cat /etc/sysconfig/network-scripts/ifcfg-wlan0 # RHEL/CentOS
永久配置方法(Ubuntu Netplan):sudo nano /etc/netplan/01-network-manager-all.yaml
参考:https://blog.csdn.net/bing_feilong/article/details/148540159
执行顺序很重要:关闭 → 清空 → 启用 → 配置
这个顺序确保了配置的干净和正确。如果你看到这些命令在一起使用,大概率是在设置一个无线热点,特别是选择了 192.168.4.1 这个常见的热点网关地址。下一步通常会安装 hostapd(接入点软件)和 dnsmasq(DHCP/DNS服务器)。
2. NetworkManager和wpa_supplicant
systemctl start NetworkManager systemctl enable wpa_supplicant,其中的NetworkManager和wpa_supplicant什么关系?为什么不只使用其中一个?
这两个服务不是替代关系,而是协作关系。简单说:
-
wpa_supplicant:底层的 WiFi 连接引擎 -
NetworkManager:上层的网络管理框架
┌─────────────────────────────────────┐
│ NetworkManager (NM) │ ← 用户/应用层
│ ┌─────────────────────────────┐ │
│ │ 图形界面/CLI工具 │ │ ← nmcli, nmtui, 桌面小程序
│ │ (nmcli, nm-applet) │ │
│ └─────────────────────────────┘ │
│ ↓ │
│ WiFi配置/证书管理/连接策略 │ ← 管理层
│ ↓ │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ wpa_supplicant (wpa) │ ← 驱动层
│ ┌─────────────────────────────┐ │
│ │ 802.11认证/加密 │ │ ← WPA/WPA2, EAP等
│ │ (WPA, WPA2, WPA3, EAP) │ │
│ └─────────────────────────────┘ │
│ ↓ │
│ Linux无线驱动 (mac80211) │ ← 硬件层
│ ↓ │
└─────────────────────────────────────┘
↓
WiFi硬件
详细对比
1. wpa_supplicant - "WiFi连接引擎"
直接使用 wpa_supplicant(手动模式)
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
配置文件示例:/etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="MyWiFi"
psk="password123"
key_mgmt=WPA-PSK
}
主要功能:
- 802.11认证:处理 WPA/WPA2/WPA3 加密
- 企业级 WiFi:支持 EAP-TLS, EAP-PEAP, EAP-TTLS
- 底层驱动交互:通过 nl80211 与无线驱动通信
- 无管理功能:只管连接,不管IP地址、DNS等
2. NetworkManager - "网络管家"
主要功能:
- 多接口管理:同时管理以太网、WiFi、WWAN、VPN
- 连接管理:自动选择最佳网络,处理切换
- IP配置:DHCP/静态IP、DNS、路由
- 用户界面:提供 CLI (nmcli) 和 GUI
- 策略管理:根据位置自动切换配置
3. nmcli: NetworkManagerClient, 网络管家客户端
nmcli device wifi list: 列出当前位置的可用WIFI列表
nmcli device wifi rescan: 如果列表更新不及时,可以重新扫描一下
nmcli -t -f NAME connection show: 列出netplan都配置了哪些WIFI可用
nmcli device wifi connect "SSID" password "密码": 连接网络
为什么需要两者配合?
典型场景:连接加密的 WiFi
实际工作流程:
-
用户输入:nmcli device wifi connect "MyWiFi" password "123456"
-
NetworkManager 收到命令
-
NetworkManager 调用 wpa_supplicant:
-
生成 wpa_supplicant 配置
-
启动 wpa_supplicant 进程
-
传递 SSID 和密码
- wpa_supplicant:
-
执行 4-way handshake(四次握手)
-
处理加密密钥交换
-
报告连接状态给 NetworkManager
- NetworkManager:
-
收到连接成功信号
-
启动 dhclient 获取 IP
-
配置 DNS 和路由
可以只用其中一个吗?
极简系统只用 wpa_supplicant,适合:嵌入式设备、路由器、无桌面系统, 缺点:
- 无自动重连
- 无网络切换
- 无图形界面
- 配置复杂
故障排除
问题1:NetworkManager 无法连接 WiFi
检查 wpa_supplicant 是否运行
systemctl status wpa_supplicant
如果未运行,NetworkManager 可能无法启动它,则手动启动
sudo systemctl start wpa_supplicant
sudo systemctl restart NetworkManager
问题2:两个服务冲突
症状:频繁断线,IP地址冲突
解决:确保只有一个服务管理网络,禁用其他网络管理器
sudo systemctl stop networking
sudo systemctl disable networking
sudo systemctl stop systemd-networkd
sudo systemctl disable systemd-networkd
sudo systemctl enable --now NetworkManager
问题3:wpa_supplicant 被多次启动
检查是否有多个实例
ps aux | grep wpa_supplicant
可能原因:
1. NetworkManager 启动了一个
2. systemd 通过 @.service 启动了一个
3. 手动启动了一个
解决:
sudo systemctl stop wpa_supplicant
sudo systemctl disable wpa_supplicant
sudo systemctl restart NetworkManager
现代 Linux 的推荐配置
关键点 :systemctl enable wpa_supplicant通常是不需要的,因为 NetworkManager 会在需要时自动启动和管理它。如果你的系统需要手动启用它,可能是因为有特殊的网络配置。
桌面系统(推荐)
NetworkManager 全权管理
sudo systemctl enable --now NetworkManager
sudo systemctl disable wpa_supplicant # NetworkManager 会管理它
验证
nmcli device status
应该显示 wlan0 为 "managed"
服务器/无头系统
Ubuntu Server:使用 netplan + networkd或systemd-networkd + wpa_supplicant
RHEL/CentOS: NetworkManager(无GUI)
嵌入式/路由器
直接使用 wpa_supplicant + dhcpcd
sudo systemctl enable --now wpa_supplicant@wlan0 dhcpcd
或使用 networkd
sudo systemctl enable --now systemd-networkd
3. iptables NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE,这两行命令都有什么作用?
这是用于**设置和删除网络地址转换(NAT)**的,常用于路由器、VPN服务器或共享上网。
第一行:启用 NAT,让内网设备通过 eth0 访问互联网
第二行:禁用 NAT,恢复原始网络状态
典型工作流:
# 启用共享上网
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 使用完毕后清理
iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
iptables -D FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables -D FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
添加 NAT 规则
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
参数分解:
iptables # Linux 防火墙/包过滤工具
-t nat # 指定 nat 表(网络地址转换)
-A POSTROUTING # 追加(Append)到 POSTROUTING 链
-o eth0 # 匹配出站接口(Output interface)为 eth0
-j MASQUERADE # 跳转到 MASQUERADE 动作
作用:
源地址伪装(SNAT的特殊形式)
将内网设备(如192.168.1.0/24)的流量:
从:192.168.1.100 → 目标公网IP
变为:eth0的公网IP → 目标公网IP
示例:
内网电脑 (192.168.1.100) 访问 google.com (142.250.189.14)
经过 NAT 后:
源地址:192.168.1.100 → eth0的IP(如 203.0.113.10)
目标地址:142.250.189.14 不变
工作原理:
# 数据包流向:
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 内网设备 │ ──> │ Linux服务器 │ ──> │ 互联网 │
│ 192.168.1.x │ │ eth0:公网IP │ │ │
└─────────────┘ │ wlan0:内网IP │ └─────────────┘
└──────────────┘
↓
数据包修改过程:
源IP: 192.168.1.100 → 改为: eth0的公网IP
3. 应用场景:
# 场景1:WiFi热点共享上网
# 树莓派作为热点,让连接的设备能上网
# eth0 连接互联网,wlan0 创建热点
# 场景2:VPN服务器
# OpenVPN服务器,让VPN客户端能访问互联网
# eth0 连接互联网,tun0 VPN虚拟接口
# 场景3:局域网共享上网
# 旧式路由器功能,多设备共享一个公网IP
4. 完整配置示例:
#!/bin/bash
# 设置树莓派为WiFi热点并共享网络
# 1. 设置wlan0为AP模式
sudo ip link set wlan0 down
sudo ip addr flush dev wlan0
sudo ip addr add 192.168.4.1/24 dev wlan0
sudo ip link set wlan0 up
# 2. 启用IP转发
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# 或永久生效:echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipforward.conf
# 3. 添加NAT规则(关键!)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 4. 设置转发规则
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 5. 启动DHCP和DNS服务
sudo systemctl start dnsmasq
sudo systemctl start hostapd
删除 NAT 规则
iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
参数分解:
-D POSTROUTING # 从 POSTROUTING 链中删除(Delete)
# 其他参数与 -A 相同,用于精确匹配要删除的规则
作用解释:
1. 删除刚刚添加的规则
# 恢复原始状态,关闭NAT功能
# 内网设备将无法通过这台服务器上网
# 执行前后对比:
sudo iptables -t nat -L POSTROUTING -v -n
# 执行前:有 MASQUERADE 规则
# 执行后:规则被删除
2. 为什么要删除?
# 原因1:测试/调试后清理
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# ... 测试网络共享 ...
sudo iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # 清理
# 原因2:切换网络配置
# 从 eth0 切换到 ppp0(拨号上网)
sudo iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# 原因3:安全考虑
# 临时开启共享,用完关闭
完整清理示例
#!/bin/bash
# 完全清理NAT和转发配置
# 1. 删除NAT规则
sudo iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE 2>/dev/null
# 2. 删除转发规则
sudo iptables -D FORWARD -i wlan0 -o eth0 -j ACCEPT 2>/dev/null
sudo iptables -D FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null
# 3. 可选:清空所有规则
# sudo iptables -t nat -F # 清空nat表所有规则
# sudo iptables -F # 清空filter表所有规则
# 4. 关闭IP转发
echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
实际应用场景:家庭路由器配置
#!/bin/bash
# 将旧电脑改造为路由器
WAN_IFACE="eth0" # 连接光猫/外网
LAN_IFACE="eth1" # 连接内网交换机
LAN_NET="192.168.1.0/24"
# 1. 启用转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 2. 设置NAT
iptables -t nat -A POSTROUTING -o $WAN_IFACE -j MASQUERADE
# 3. 允许转发
iptables -A FORWARD -i $LAN_IFACE -o $WAN_IFACE -j ACCEPT
iptables -A FORWARD -i $WAN_IFACE -o $LAN_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 设置LAN接口IP
ip addr add 192.168.1.1/24 dev $LAN_IFACE
ip link set $LAN_IFACE up
# 5. 启动DHCP服务器
dnsmasq -i $LAN_IFACE --dhcp-range=192.168.1.100,192.168.1.200,12h
常见问题和解决方案
问题1:规则不生效
# 检查步骤:
# 1. 确认IP转发已开启
cat /proc/sys/net/ipv4/ip_forward # 应该显示 1
# 2. 确认规则存在
sudo iptables -t nat -L POSTROUTING -v -n
# 3. 确认接口名称正确
ip addr show # 查看实际接口名,可能是 enp3s0 而不是 eth0
# 4. 检查内核模块
lsmod | grep iptable_nat # 应该加载
sudo modprobe iptable_nat # 如果未加载
问题2:删除规则时出错
# 错误:iptables: Bad rule (does a matching rule exist in that chain)?
# 解决方案1:确保规则完全匹配
# 原命令:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 删除时参数必须完全一致:
iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 解决方案2:使用规则编号删除
sudo iptables -t nat -L POSTROUTING --line-numbers
sudo iptables -t nat -D POSTROUTING <规则编号>
# 解决方案3:清空整个链
sudo iptables -t nat -F POSTROUTING # 清除所有POSTROUTING规则
问题3:重启后规则丢失
# iptables规则默认不保存
# 保存当前规则:
# Debian/Ubuntu:
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
# RHEL/CentOS:
sudo iptables-save > /etc/sysconfig/iptables
sudo service iptables save
# 或使用iptables-persistent(Ubuntu):
sudo apt install iptables-persistent
sudo netfilter-persistent save
安全性: 防火墙规则
添加NAT的同时,限制转发;
只允许已建立的连接和特定端口;
# 允许HTTP/HTTPS
sudo iptables -A FORWARD -i wlan0 -o eth0 -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -p tcp --dport 443 -j ACCEPT
# 允许DNS
sudo iptables -A FORWARD -i wlan0 -o eth0 -p udp --dport 53 -j ACCEPT
# 默认拒绝其他转发
sudo iptables -A FORWARD -i wlan0 -o eth0 -j DROP
4. sysctl -w net.ipv4.ip_forward=1 详解
这条命令是 启用 Linux 系统的 IPv4 数据包转发功能,是让 Linux 系统充当路由器、VPN服务器、网关或网络共享设备的关键配置。一句话理解:没有这个设置,Linux就像一栋房子,只进不出;开启后,就像邮局,可以中转邮件。
详细解释
1. 默认状态
查看当前转发状态
cat /proc/sys/net/ipv4/ip_forward
或 sysctl net.ipv4.ip_forward
输出:
0 # 默认关闭(普通主机模式)
1 # 已开启(路由器模式)
默认是 0,因为:
普通桌面/服务器只需收发自己的数据包
安全考虑:减少攻击面
性能考虑:避免不必要的包处理
2. 作用原理
关闭转发时(默认):
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 设备A │────▶│ Linux │────▶│ 互联网 │
│192.168.1.2│ │ 主机 │ │ │
└─────────┘ └─────────┘ └─────────┘
│
┌────┴────┐
│ │
┌─────────┐ ┌─────────┐
│ 设备B │ │ 设备C │
│192.168.1.3│192.168.1.4│
└─────────┘ └─────────┘
行为:设备B发给设备C的数据包会被Linux丢弃
Linux:这不是发给我的包,我不负责转发
开启转发后:sysctl -w net.ipv4.ip_forward=1
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 设备A │────▶│ Linux │────▶│ 互联网 │
│192.168.1.2│ │ 路由器 │ │ │
└─────────┘ └─────────┘ └─────────┘
│
┌────┴────┐
│ │
┌─────────┐ ┌─────────┐
│ 设备B │ │ 设备C │
│192.168.1.3│192.168.1.4│
└─────────┘ └─────────┘
行为:设备B发给设备C的数据包会被Linux转发
Linux:我是路由器,我来转发这个包
实际应用场景
场景1:WiFi热点共享(最常见)
#!/bin/bash
# 将笔记本电脑变成WiFi热点
# 0. 硬件配置:
# - eth0/wlp3s0: 连接互联网(已有IP)
# - wlan0: 创建热点(设置IP 192.168.4.1)
# 1. 关键步骤:启用IP转发
sudo sysctl -w net.ipv4.ip_forward=1
# 2. 设置NAT(让热点设备能上网)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 3. 允许转发
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 现在连接热点的设备可以上网了
场景2:Linux路由器
#!/bin/bash
# 将旧PC改造成家用路由器
WAN="eth0" # 连接光猫/外网
LAN="eth1" # 连接家庭交换机
LAN_IP="192.168.1.1"
# 1. 启用转发(核心!)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 2. 设置LAN接口
ip addr add $LAN_IP/24 dev $LAN
ip link set $LAN up
# 3. NAT配置
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
iptables -A FORWARD -i $LAN -o $WAN -j ACCEPT
iptables -A FORWARD -i $WAN -o $LAN -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 启动DHCP服务
dnsmasq -i $LAN --dhcp-range=192.168.1.100,192.168.1.200,12h
相关参数和扩展
1. IPv6 转发
# 同时启用IPv6转发
sudo sysctl -w net.ipv6.conf.all.forwarding=1
# 查看所有转发参数
sysctl -a | grep "\.forwarding"
2. 临时 vs 永久生效
临时生效(重启失效)
sudo sysctl -w net.ipv4.ip_forward=1
# 或
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
永久生效
# 方法1:修改sysctl配置文件
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # 应用配置
# 方法2:使用sysctl.d目录(推荐)
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipforward.conf
sudo sysctl --system
# 方法3:某些发行版的特定文件
# Debian/Ubuntu: /etc/network/options
# 旧版: /etc/sysctl.d/10-network-security.conf
3. 检查是否生效
# 检查当前值
cat /proc/sys/net/ipv4/ip_forward
# 测试转发功能
# 在设备A上ping设备C,看是否能通
# 查看内核日志
dmesg | grep "forwarding"
安全注意事项
1. 风险:开启后系统成为路由器
# 可能的安全风险:
# 1. 内网设备暴露(如果防火墙配置不当)
# 2. 可能被用作跳板攻击
# 3. 增加DDoS攻击风险
# 安全建议:
# 配合iptables限制
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state NEW -j DROP
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state NEW -j ACCEPT
2. 最小化配置示例
#!/bin/bash
# 安全地开启转发
# 1. 只允许特定子网转发
LAN_SUBNET="192.168.1.0/24"
# 2. 启用转发
sudo sysctl -w net.ipv4.ip_forward=1
# 3. 严格限制转发规则
# 允许LAN到WAN
sudo iptables -A FORWARD -i eth1 -o eth0 -s $LAN_SUBNET -j ACCEPT
# 允许已建立的连接返回
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 默认拒绝其他所有转发
sudo iptables -P FORWARD DROP
# 4. 记录被拒绝的转发尝试(可选)
sudo iptables -A FORWARD -j LOG --log-prefix "FORWARD_DROP: "
常见问题排查
开启后设备仍不能上网
# 诊断步骤:
# 1. 确认转发已开启
cat /proc/sys/net/ipv4/ip_forward # 应为1
# 2. 检查iptables规则
sudo iptables -t nat -L -v -n
sudo iptables -L FORWARD -v -n
# 3. 检查路由表
ip route show
# 4. 测试基本连通性
# 在Linux路由器上:
ping -c 3 8.8.8.8
# 在内网设备上:
ping -c 3 192.168.1.1 # 网关
ping -c 3 8.8.8.8 # 外网
# 5. 检查DNS
cat /etc/resolv.conf
性能影响
1. 性能开销
# 开启转发会增加:
# - CPU使用:需要检查每个转发的包
# - 内存使用:维护连接跟踪(conntrack)
# - 延迟:额外的处理步骤
# 查看连接跟踪表大小
cat /proc/sys/net/netfilter/nf_conntrack_max
# 查看当前连接数
cat /proc/net/nf_conntrack | wc -l
2. 性能优化
# 调整连接跟踪表大小
sudo sysctl -w net.netfilter.nf_conntrack_max=100000
# 减少conntrack超时时间
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
# 使用更快的NAT模式
# MASQUERADE(动态)比 SNAT(静态)稍慢
# 如果可以,使用静态SNAT:
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.10
总结
核心要点:
-
作用:开启 Linux 的 IPv4 数据包转发功能
-
应用场景:路由器、热点共享、VPN服务器、容器网络
-
必须配合:iptables NAT规则才能实现完整功能
典型使用模式:三件套(缺一不可)
sudo sysctl -w net.ipv4.ip_forward=1 # 1. 启用内核转发
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 2. 设置NAT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT # 3. 允许转发
5. hostapd 和 dnsmasq 命令详解
hostapd hostapd_f -B
dnsmasq -C dnsmasq_f --no-daemon,这两条命令有什么作用?
这两条命令是搭建无线热点(WiFi Access Point)的核心组件,通常一起使用。
hostapd: 创建无线接入点
hostapd hostapd_f -B
参数分解:
hostapd # 无线接入点守护进程
hostapd_f # 配置文件路径(通常是 /tmp 下的临时文件)
-B # 后台运行(Daemon mode)
功能解释:
作用:将无线网卡变为 WiFi 热点(Access Point)
类比:无线路由器的"WiFi发射"功能
输入:无线网卡(如 wlan0)
输出:创建可供其他设备连接的 WiFi 信号
配置文件内容示例:
interface=wlan0 # 使用的无线接口
driver=nl80211 # Linux无线驱动
ssid=MyHotspot # WiFi名称
channel=6 # 信道
hw_mode=g # 802.11g模式
auth_algs=1 # 认证算法
wpa=2 # WPA2加密
wpa_passphrase=12345678 # WiFi密码
wpa_key_mgmt=WPA-PSK # 密钥管理
rsn_pairwise=CCMP # 加密算法
工作流程:
# 1. 读取配置文件
# 2. 初始化无线网卡为 AP 模式
# 3. 设置SSID、加密等参数
# 4. 开始广播 WiFi 信号
# 5. 处理客户端连接和认证
# 可视化流程:
┌─────────────┐ hostapd ┌─────────────┐
│ 无线网卡 │ ───────────> │ WiFi热点 │
│ (wlan0) │ 配置文件 │ │
└─────────────┘ └─────────────┘
↓
其他设备可以连接
实际应用:
# 手动创建配置文件
cat > /tmp/hostapd.conf << EOF
interface=wlan0
driver=nl80211
ssid=MyHotspot
channel=6
hw_mode=g
auth_algs=1
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
EOF
# 启动hostapd
sudo hostapd /tmp/hostapd.conf -B
dnsmasq: 提供DHCP和DNS服务
dnsmasq -C dnsmasq_f --no-daemon
参数分解:
dnsmasq # 轻量级DHCP和DNS服务器
-C dnsmasq_f # 指定配置文件
--no-daemon # 前台运行(不进入后台)
功能解释:
双重功能:
1. DHCP服务器:为连接的设备自动分配IP地址
2. DNS服务器:处理域名解析请求
类比:无线路由器的"自动分配IP"和"网址翻译"功能
配置文件内容示例:
interface=wlan0 # 监听wlan0接口
dhcp-range=192.168.4.100,192.168.4.200,12h # IP地址池
dhcp-option=3,192.168.4.1 # 默认网关
dhcp-option=6,8.8.8.8 # DNS服务器
server=8.8.8.8 # 上游DNS服务器
no-resolv # 不使用系统resolv.conf
log-dhcp # 记录DHCP日志
DHCP 工作流程:
# 当设备连接热点时:
设备 → DHCP Discover → dnsmasq
设备 ← DHCP Offer ← dnsmasq (分配IP:192.168.4.100)
设备 → DHCP Request → dnsmasq
设备 ← DHCP ACK ← dnsmasq (确认分配)
# 结果:设备获得IP、网关、DNS信息
实际应用:
# 手动创建配置文件
cat > /tmp/dnsmasq.conf << EOF
interface=wlan0
dhcp-range=192.168.4.100,192.168.4.200,12h
dhcp-option=3,192.168.4.1
dhcp-option=6,8.8.8.8
server=8.8.8.8
no-resolv
log-dhcp
EOF
# 启动dnsmasq
sudo dnsmasq -C /tmp/dnsmasq.conf --no-daemon
两者协作的完整流程
完整的热点创建流程:
python
#!/usr/bin/env python3
# 典型的Python代码实现热点创建
import tempfile
import subprocess
class WiFiHotspot:
def __init__(self):
# 创建临时配置文件
self.hostapd_f = tempfile.NamedTemporaryFile(mode='w', delete=False)
self.dnsmasq_f = tempfile.NamedTemporaryFile(mode='w', delete=False)
def create_configs(self, ssid="MyHotspot", password="12345678"):
# 1. 创建hostapd配置
hostapd_conf = f"""interface=wlan0
driver=nl80211
ssid={ssid}
channel=6
hw_mode=g
auth_algs=1
wpa=2
wpa_passphrase={password}
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP"""
self.hostapd_f.write(hostapd_conf)
self.hostapd_f.flush()
# 2. 创建dnsmasq配置
dnsmasq_conf = """interface=wlan0
dhcp-range=192.168.4.100,192.168.4.200,12h
dhcp-option=3,192.168.4.1
dhcp-option=6,8.8.8.8
server=8.8.8.8
no-resolv
log-dhcp"""
self.dnsmasq_f.write(dnsmasq_conf)
self.dnsmasq_f.flush()
def start(self):
# 配置网卡
subprocess.run(['ip', 'link', 'set', 'wlan0', 'down'])
subprocess.run(['ip', 'addr', 'flush', 'dev', 'wlan0'])
subprocess.run(['ip', 'addr', 'add', '192.168.4.1/24', 'dev', 'wlan0'])
subprocess.run(['ip', 'link', 'set', 'wlan0', 'up'])
# 启动hostapd(后台运行)
subprocess.Popen(['hostapd', self.hostapd_f.name, '-B'])
# 启动dnsmasq(前台运行,便于控制)
subprocess.Popen(['dnsmasq', '-C', self.dnsmasq_f.name, '--no-daemon'])
# 设置NAT(共享互联网)
subprocess.run(['iptables', '-t', 'nat', '-A', 'POSTROUTING',
'-o', 'eth0', '-j', 'MASQUERADE'])
设备连接时的完整交互:
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 手机 │ │ 热点 │ │ dnsmasq │ │ 互联网 │
│ │ │ (hostapd)│ │ │ │ │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
│ │ │ │
│ 扫描WiFi网络 │ │ │
│─────────────────> │ │ │
│ │ │ │
│ 发现"MyHotspot" │ │ │
│<───────────────── │ │ │
│ │ │ │
│ 发送连接请求 │ │ │
│─────────────────> │ │ │
│ │ │ │
│ WPA2认证过程 │ │ │
│<─────────────────>│ │ │
│ │ │ │
│ 连接成功,请求IP │ │ │
│────────────────────────────────────> │ │
│ │ │ │
│ │分配IP:192.168.4.100│ │
│<──────────────────────────────────── │ │
│ │ │ │
│ 访问google.com │ │ │
│────────────────────────────────────> │ │
│ │ │ DNS查询 │
│ │ │────────────────> │
│ │ │ │
│ │ │ 返回IP:142.250... │
│ │ │<──────────────── │
│ │ │ │
│ │返回DNS结果 │ │
│<──────────────────────────────────── │ │
│ │ │ │
│ 访问142.250.189.14 │ │ │
│───────────────────────────────────────────────────────> │
常见使用模式
模式1:快速创建临时热点
#!/bin/bash
# 快速创建测试热点
# 创建配置
cat > /tmp/hostapd.conf << EOF
interface=wlan0
ssid=TestAP
channel=6
hw_mode=g
EOF
cat > /tmp/dnsmasq.conf << EOF
interface=wlan0
dhcp-range=192.168.10.100,192.168.10.150,1h
EOF
# 设置网络
ip addr add 192.168.10.1/24 dev wlan0
ip link set wlan0 up
# 启动服务
hostapd /tmp/hostapd.conf -B
dnsmasq -C /tmp/dnsmasq.conf --no-daemon
模式2:带互联网共享的热点
#!/bin/bash
# 创建可以上网的热点
INTERNET_IFACE="eth0"
AP_IFACE="wlan0"
AP_IP="192.168.4.1"
AP_NET="192.168.4.0/24"
# 1. 配置AP接口
ip link set $AP_IFACE down
ip addr flush dev $AP_IFACE
ip addr add $AP_IP/24 dev $AP_IFACE
ip link set $AP_IFACE up
# 2. 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 3. 设置iptables NAT
iptables -t nat -A POSTROUTING -o $INTERNET_IFACE -j MASQUERADE
iptables -A FORWARD -i $AP_IFACE -o $INTERNET_IFACE -j ACCEPT
iptables -A FORWARD -i $INTERNET_IFACE -o $AP_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 启动hostapd
cat > /tmp/hostapd.conf << EOF
interface=$AP_IFACE
driver=nl80211
ssid=SharedInternet
channel=6
hw_mode=g
wpa=2
wpa_passphrase=secure123
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
EOF
hostapd /tmp/hostapd.conf -B
# 5. 启动dnsmasq
cat > /tmp/dnsmasq.conf << EOF
interface=$AP_IFACE
dhcp-range=192.168.4.100,192.168.4.200,12h
dhcp-option=3,$AP_IP
dhcp-option=6,8.8.8.8
server=8.8.8.8
EOF
dnsmasq -C /tmp/dnsmasq.conf --no-daemon
参数详解和选项
hostapd 重要参数:
# 运行模式
-B # 后台运行(daemon)
-f /path/to/log # 指定日志文件
-d # 增加调试信息
-K # 包含密钥信息在日志中(调试用)
# 常见配置选项:
country_code=US # 国家代码(影响可用信道)
ieee80211n=1 # 启用802.11n(高速模式)
ht_capab=[HT40+] # 40MHz信道
ignore_broadcast_ssid=0 # 0=广播SSID,1=隐藏
# 高级功能:
macaddr_acl=0 # MAC地址过滤:0=禁用,1=允许列表,2=拒绝列表
accept_mac_file=/path/to/macs # MAC地址列表文件
dnsmasq 重要参数:
# 运行模式
--no-daemon # 前台运行
--log-queries # 记录DNS查询
--log-dhcp # 记录DHCP分配
--keep-in-foreground # 保持前台(结合--log-queries)
# DHCP选项:
--dhcp-option=option:value # 自定义DHCP选项
--dhcp-option-force=option:value # 强制发送选项
--dhcp-authoritative # 权威DHCP服务器
--dhcp-leasefile=/path # 租约文件位置
# DNS选项:
--cache-size=1000 # DNS缓存大小
--no-negcache # 禁用否定缓存
--bogus-priv # 丢弃私有IP的反向查询
--filterwin2k # 过滤Windows DNS请求
调试和故障排除
调试 hostapd:
# 1. 前台运行查看输出
sudo hostapd /path/to/config -d
# 会显示详细的认证过程
# 2. 查看系统日志
sudo journalctl -u hostapd -f
# 3. 常见问题:
# - 无线网卡不支持AP模式:检查 iw list | grep "AP"
# - 信道被占用:尝试其他信道
# - 驱动问题:检查 dmesg | grep hostapd
调试 dnsmasq:
# 1. 前台运行并显示日志
sudo dnsmasq -C /path/to/config --no-daemon --log-queries --log-dhcp
# 2. 测试DHCP
sudo dhclient -v wlan0 # 在另一台设备上
# 3. 测试DNS
nslookup google.com 192.168.4.1
# 4. 查看租约
cat /var/lib/misc/dnsmasq.leases
同时调试两者:
#!/bin/bash
# 在一个终端中运行
sudo hostapd /path/to/hostapd.conf -d -K | tee hostapd.log
# 在另一个终端中运行
sudo dnsmasq -C /path/to/dnsmasq.conf --no-daemon --log-queries --log-dhcp | tee dnsmasq.log
安全注意事项
1. 加密设置(必须启用)
# 不安全的配置(避免使用!):
# auth_algs=1 # 仅开放认证
# wpa=0 # 无WPA加密
# 安全配置:
wpa=2 # WPA2
wpa_key_mgmt=WPA-PSK # 预共享密钥
rsn_pairwise=CCMP # AES加密(不要用TKIP)
wpa_passphrase=强密码 # 至少8位,混合字符
2. 隔离客户端
# 在hostapd配置中添加:
ap_isolate=1 # 隔离客户端,禁止互相访问
3. 限制连接数
# 在hostapd配置中添加:
max_num_sta=10 # 最多10个客户端
4. MAC地址过滤
# 创建MAC地址列表
echo "AA:BB:CC:DD:EE:FF" > /etc/hostapd/mac_list
# hostapd配置:
macaddr_acl=1
accept_mac_file=/etc/hostapd/mac_list
简单替代方案:使用 create_ap 脚本
# 一键创建热点
git clone https://github.com/oblique/create_ap
cd create_ap
sudo make install
# 创建热点
sudo create_ap wlan0 eth0 MyHotspot MyPassword
总结
hostapd:创建无线信号,处理WiFi认证
-
把网卡变成"WiFi发射器"
-
处理WPA/WPA2加密
-
管理客户端连接
dnsmasq:分配IP地址和解析域名
-
DHCP:自动分配IP、网关、DNS
-
DNS:本地域名解析,转发到上游DNS
典型使用场景:
-
树莓派/开发板制作便携热点
-
会议/活动临时WiFi网络
-
网络测试和调试环境
-
旧路由器改造或功能扩展
命令对比记忆:
| 命令 | 类比 | 功能 | 关键参数 |
|---|---|---|---|
hostapd config -B |
无线路由器 | 创建WiFi信号 | -B后台运行 |
dnsmasq -C config |
DHCP服务器 | 分配IP地址 | --no-daemon前台运行 |
这两条命令通常出现在嵌入式设备、网络工具、自制路由器 等场景中。-B 和 --no-daemon 的不同选择反映了两个服务不同的运行需求:hostapd 通常作为守护进程长时间运行,而 dnsmasq 在前台运行便于控制和获取日志。