用于受控环境下流量捕获的开放 Wi-Fi 伪造接入点。使用 hostapd(原生 nl80211 AP 模式)+ dnsmasq(DHCP/DNS)+ iptables NAT 向上行接口转发。

iw phy → Supported interface modes: ... AP)。hostapd、dnsmasq、iw、iptables、rfkill、wireshark。编辑 fake_ap.sh 开头的变量。
INTERNET_IFACE — 具有互联网连接的上行接口这是已经存在默认路由的接口(以太网、USB 适配器、Wi‑Fi 客户端等)。名称因机器而异(eth0、enp3s0、wlp3s0……)。
ip route | grep default
# default via 192.168.1.1 dev enp3s0 ...
# ^^^^^^
# 使用此名称
将 INTERNET_IFACE 设置为 dev 后面的接口名称。
AP_IFACE — 用于伪造接入点的无线网卡使用 iw dev 中的物理 Wi‑Fi 接口。通常为 wlan0,但也可能是 wlp2s0 或类似名称。
iw dev
# phy#0
# Interface wlan0
# ^^^^^
# 使用此名称
选择支持 AP 模式的 phy 上的接口(iw phy → Supported interface modes: ... AP)。不要使用 Docker 桥接(docker0、br-*)或虚拟接口(veth*)。
FAKE_SSID="Free_Public_WiFi"
CHANNEL="6"
INTERNET_IFACE="enp3s0"
AP_IFACE="wlan0"
GATEWAY_IP="10.0.0.1"
sudo ./fake_ap.sh
该脚本会:
wlan0)。hostapd,使用开放 SSID 并设定信道。dnsmasq(DHCP + DNS 转发到 1.1.1.1 / 8.8.8.8)。sudo journalctl -t dnsmasq -f # DHCP 租约 + 每个客户端 DNS 查询
sudo wireshark -i wlan0 # 捕获客户端 L3 流量(使用你的 AP_IFACE)
sudo iw dev wlan0 station dump # 客户端 L2 状态(RSSI、速率、流量)
cat /var/lib/misc/dnsmasq.leases # 活跃租约
在 AP 接口(例如 wlan0)上打开 Wireshark,应用你需要的显示过滤器。
| 所学内容 | 过滤器 |
|---|---|
| 仅 SYN(新的 TCP 连接) | tcp.flags.syn == 1 && tcp.flags.ack == 0 |
| 正在进行的 TLS 握手 | tls.handshake |
| 大流量传输(TLS 上的 HTTP/2) |
# 某个客户端的加密流量 + 联系的域名
ip.src == 10.0.0.42 && (dns || tls.handshake.type == 1)
# 被动手机型号发现
ip.src == 10.0.0.42 && (dhcp || mdns || ssdp || nbns)
# 定向到特定域名的流量(如社交)
tls.handshake.extensions_server_name contains "instagram"
# 排除广播/多播噪音
not (eth.dst == ff:ff:ff:ff:ff:ff) && not (ip.dst >= 224.0.0.0 && ip.dst <= 239.255.255.255)
sudo tshark -i wlan0 -Y 'tls.handshake.type==1 && ip.src==10.0.0.42' \
-T fields -e tls.handshake.extensions_server_name
sudo tcpdump -i wlan0 -w /tmp/capture.pcap
journalctl -t dnsmasq -f 中查看。MIT — 见 LICENSE。
仅在你拥有或已获得书面授权测试的网络和设备上使用。拦截他人流量是违法的。
| 所学内容 | 过滤器 |
|---|
| 主机名和供应商(DHCP 选项 12/55/60) | dhcp |
| 设备名称 + 服务(Bonjour/AirPlay/Chromecast) | mdns |
| Windows 主机名 / SMB | nbns |
| 设备型号(UPnP) | ssdp |
| 从 MAC 获取供应商 | eth.addr == aa:bb:cc:dd:ee:ff |
| 来自同一客户端的所有流量 | ip.addr == 10.0.0.X |
| 所学内容 | 过滤器 |
|---|
| 通过 DNS 解析的域名 | dns.qry.name |
| HTTPS 域名(ClientHello 中的 SNI) | tls.handshake.type == 1 |
| 包含解析 IP 的 DNS 响应 | dns.flags.response == 1 |
| QUIC 连接(Google、YouTube、Meta) | quic |
| 明文 HTTP(完整 URL) | http.request |
| 应用/浏览器 User-Agent | http.user_agent |
tcp.len > 1000 |
| ICMP(客户端诊断 ping) | icmp |
| 所学内容 | 过滤器 |
|---|
| HTTP POST(在 http:// 站点上登录) | http.request.method == "POST" |
| FTP 凭据 | ftp.request.command in {"USER","PASS"} |
| Telnet | telnet |
| 明文 SMTP/IMAP/POP3 | `smtp |
| 负载中的可疑字符串 | frame contains "password" |