ubuntu网络命令详解

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

实际工作流程:

  1. 用户输入:nmcli device wifi connect "MyWiFi" password "123456"

  2. NetworkManager 收到命令

  3. NetworkManager 调用 wpa_supplicant:

  • 生成 wpa_supplicant 配置

  • 启动 wpa_supplicant 进程

  • 传递 SSID 和密码

  1. wpa_supplicant:
  • 执行 4-way handshake(四次握手)

  • 处理加密密钥交换

  • 报告连接状态给 NetworkManager

  1. 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

总结

核心要点:

  1. 作用:开启 Linux 的 IPv4 数据包转发功能

  2. 应用场景:路由器、热点共享、VPN服务器、容器网络

  3. 必须配合: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 在前台运行便于控制和获取日志。

相关推荐
Ribou2 小时前
Ubuntu 24.04.2安装配置k8s 1.35.0
linux·ubuntu·kubernetes
乘凉~2 小时前
【Linux作业】CentOS 7下MySQL数据库安装与数据导入实操项目报告
linux·数据库·centos
神算大模型APi--天枢6462 小时前
国产大模型后端开发与部署实战:从算力架构到行业规模化落地
大数据·运维·服务器·人工智能·架构
Boop_wu2 小时前
[Java EE] 网络原理(3) https
网络·https·java-ee
2301_767902642 小时前
Docker 从入门到实战
运维·docker·容器
尘似鹤2 小时前
Uboot移植--修改lcd和网络驱动
linux·学习·uboot
天呐草莓2 小时前
企业微信运维手册
java·运维·网络·python·微信小程序·企业微信·微信开放平台
qq_401700412 小时前
Linux驱动-设备树
linux
huangql5202 小时前
HTTP超文本传输协议:互联网的统一语言
网络·网络协议·http