martin-ger/esp32_PPPoE_router

GitHub: martin-ger/esp32_PPPoE_router

基于 ESP32 和 WT32-ETH01 开发板的轻量级 PPPoE NAT 路由器固件,集成了防火墙、WireGuard VPN、动态 DNS 和 Web 管理界面。

Stars: 2 | Forks: 0

# ESP32 PPPoE 路由器 一个基于 ESP32 的 NAT WAN 路由器,专为带有有线上行链路的 **[WT32-ETH01](https://github.com/egnor/wt32-eth01)** 开发板设计。它可以直接与 WAN/DSL/有线调制解调器进行 PPPoE 通信,同时也支持用于纯以太网上行链路的 DHCP。客户端通过 WiFi(softAP)连接。包含完整的 Web 界面、防火墙、DHCP 预留、端口转发、WireGuard VPN 以及可选的 PCAP 抓包功能。 ## 使用场景 - 无需独立调制解调器路由器即可实现 PPPoE DSL / 有线调制解调器接入 - 带有有线上行链路的 WiFi 接入点,提供可靠的吞吐量 - 具有每客户端流量监控和防火墙功能的轻量级旅行或实验室路由器 ## 功能 - 基于 802.3 以太网的 PPPoE 上行链路(PAP / CHAP / auto,可选 VLAN tag) - 具有四个 ACL 列表和命中计数器的无状态包防火墙 - 具有 IP 预留、客户端封锁和静态地址池的 DHCP 服务器 - 带有设备名称解析的端口转发(TCP / UDP) - WireGuard VPN 客户端(全路由或分流隧道、断线开关、绑定 VPN 的端口映射) - 具有自动 WAN IP 注册的动态 DNS (DDNS) —— 支持 NoIP、DuckDNS、Selfhost.de、Dynu 和 Namecheap - 通过 TCP 流式传输到 Wireshark 的 PCAP 数据包捕获 —— 可选构建功能,默认禁用 - 基于 TCP 的远程 CLI 控制台(受密码保护) - 远程 syslog 转发(UDP,RFC 3164) - 通过 Web 界面进行 OTA 固件更新 - 通过 Web 界面进行配置备份/恢复(纯 JSON 或通过密码加密) - 可选的每客户端流量统计 - TTL 覆盖和 TCP MSS 钳制 - WiFi 监管国家代码 —— 设置允许的信道范围(FCC/ETSI/TELEC) ## 硬件 — WT32-ETH01 WT32-ETH01 是一款紧凑型的 ESP32 模块,集成了 LAN8720A 以太网 PHY,使其成为无需外部 MAC 芯片的有线上行链路路由器的理想选择。 | 参数 | 值 | |-----------|-------| | MCU | ESP32 (240 MHz 双核) | | Flash | 4 MB | | 以太网 PHY | LAN8720A (RMII) | | WiFi | 802.11 b/g/n 2.4 GHz | | MDC GPIO | 23 | | MDIO GPIO | 18 | | PHY 地址 | 1 | | PHY 电源 GPIO | 16 | ## Web 界面 在连接到路由器 WiFi 网络的任何设备上,通过 `http://192.168.4.1`(或配置的 AP IP)即可访问。端口可配置;默认为 80。 ### 页面 **/ — 状态** 实时仪表板,显示上行链路状态、上行 IP、字节计数器、NAPT 表使用情况、已连接客户端列表(包含 MAC、IP、设备名称和可选的每客户端 TX/RX)、空闲堆栈和运行时间。还包含登录表单和密码管理。 **配置** 完整的路由器配置,分为多个部分: - AP 设置(SSID、密码、信道、认证模式、隐藏 SSID、IP 范围、MAC)—— 信道的最大值根据配置的国家/地区代码进行强制限制 - STA / 上行链路模式和设置(静态 IP) - 远程控制台设置(端口、超时) - PCAP 监控设置(模式、snaplen)—— 仅在使用 `CONFIG_PCAP_CAPTURE` 构建时显示 - 系统设置(OTA 更新、配置备份 / 恢复) **PPPoE** PPPoE 设置(用户名、密码、服务名称、认证模式、VLAN、baby-jumbo) **映射** DHCP 租约和预留管理,以及端口转发规则: - 带有活动租约的 DHCP 地址池概览 - 通过 MAC 和设备名称添加 / 删除 IP 预留 - 阻止某设备获取 IP - 添加 / 删除 TCP 和 UDP 端口转发规则 **防火墙** 跨所有四个包流列表(`to_esp`、`from_esp`、`to_ap`、`from_ap`)的 ACL 规则管理。添加包含协议、源/目的地 CIDR、端口以及允许/拒绝/监控操作的规则。查看每个规则的命中计数器并清除统计信息。 **VPN** WireGuard 配置:私钥、对端公钥、可选的预共享密钥、endpoint 主机和端口、隧道 IP、子网掩码、持久化 keepalive、全路由 / 分流隧道开关以及断线开关。还显示实时连接状态、隧道 IP 和 MSS/PMTU 值。 **DDNS** 动态 DNS 配置页面(仅在使用 `CONFIG_DDNS_ENABLED=y` 构建时显示)。提供提供商选择(NoIP、DuckDNS、Selfhost.de、Dynu、Namecheap)、主机名/子域名、凭证或 token 字段(根据提供商显示/隐藏)、keep-alive 间隔(小时),以及用于立即推送 DNS 的“触发更新”按钮。显示实时状态(启用/禁用、提供商、最后更新时间戳、最后报告的 WAN IP)。 ### 密码保护 可选的密码用于保护除状态仪表板外的所有页面。可通过 Web 界面或 `set_router_password` 设置。身份验证使用带有 16 字节随机盐值的 SHA-256。会话基于 cookie,具有 30 分钟的空闲超时。清除密码将开放所有页面且无需身份验证。 ### 配置备份 / 恢复 **配置** 页面可将整个 NVS 配置导出为 JSON 文件,并可将其重新导入。 **导出 —— 根据是否输入密码短语分为两种模式:** | 导出类型 | WiFi 密码 | WireGuard 私钥 + PSK | PPPoE 密码 | |-------------|----------------|-----------------------------|----------------| | 明文(无密码短语) | 包含 | **省略** | **省略** | | 加密(有密码短语) | 包含 | 包含 | 包含 | 加密导出使用 XChaCha20-Poly1305 AEAD,密钥通过 PBKDF2-HMAC-SHA256(10,000 次迭代,16 字节随机盐值)从密码短语中派生出 32 字节密钥。密文被封装在 JSON 信封 `{"enc":1,"s":"…","n":"…","c":"…"}` 中,因此加密和明文文件共享相同的 `.json` 扩展名,且导入处理程序会自动检测格式。 **导入:** 如果文件已加密,请在选择文件之前在 *Import* 密码短语字段中输入密码短语。如果密码短语错误,会在修改任何 NVS 密钥之前被认证标签拒绝。 这两个 endpoint(`/api/config-export`、`/api/config-import`)在启用密码保护时都需要处于活动会话中,并受 CSRF Origin 检查的保护。 ## WiFi 和网络 ### 上行链路 (Ethernet + PPPoE) 以太网接口连接到 DSL 或有线调制解调器。PPPoE 在以太网链路之上进行协商。通过 Web 界面或 CLI 配置凭证: ``` set_pppoe -u -p # ISP credentials set_pppoe -a <0|1|2> # Auth: 0=auto, 1=PAP, 2=CHAP set_pppoe -s # Service name (optional) set_pppoe -v # 802.1Q VLAN tag (0=off) set_pppoe -j <0|1> # Baby-jumbo frames (MSS 1460 vs 1452) set_pppoe -e <0|1> # Enable / disable PPPoE ``` ### AP (WiFi 客户端) ``` set_ap # Configure AP (empty password = open) set_ap_ip # Change AP subnet (e.g. 192.168.4.1) set_ap_dns # Custom DNS for clients (empty = upstream) set_ap_auth # Auth mode (requires restart) set_ap_hidden # Hide SSID (requires restart) set_ap_channel <0-N> # 0 = auto; max N depends on country (requires restart) set_ap_nat # Enable / disable NAT (requires restart) set_wifi_country # WiFi country code (2-char ISO 3166, e.g. US, DE; 01 = world-safe) ap # Enable or disable AP immediately ``` ### DHCP 预留 通过 MAC 地址为设备预留固定 IP。预留的 IP 绝不会分配给其他设备。 ``` dhcp_reserve add [-n ] # Reserve IP for device dhcp_reserve del # Remove reservation dhcp_reserve block [-n ] # Block device from getting any IP ``` ### 端口转发 ``` portmap add TCP # Add TCP mapping portmap add UDP # Add UDP mapping portmap del TCP # Delete TCP mapping portmap del UDP # Delete UDP mapping ``` DHCP 预留中的设备名称可用于代替 IP 地址。 ### WireGuard VPN 一个保护所有 AP 客户端流量的 WireGuard 客户端隧道。支持两种路由模式: | 模式 | 行为 | |------|-----------| | **全路由** | 所有 AP 客户端流量均通过隧道发送。WireGuard netif 成为默认路由。 | | **分流隧道** | 只有前往配置的 VPN 子网的流量通过隧道发送;其他所有流量直接发往 WAN。 | 可以启用 **断线开关**,以便在 VPN 已启用但尚未连接时阻止所有非本地 AP 流量,防止在重新连接期间发生互联网泄漏。端口转发规则可以标记为绑定 VPN,使得它们仅在隧道连通时激活。 MTU 和 MSS 会自动调整以补偿 WireGuard 开销(60 字节:20 IP + 8 UDP + 16 WireGuard header + 16 authentication tag)。 ### 动态 DNS (DDNS) 当上行链路建立或 WAN IP 发生变化时,自动向动态 DNS 提供商注册您的 WAN(PPPoE)IP 地址。所有连接均使用 HTTPS。 支持的提供商: | 提供商 | 设置 | |------|------| | **NoIP** | 用户名、密码、完整的 FQDN | | **DuckDNS** | 子域名、认证 token | | **Selfhost.de** | 用户名、密码(DynAccount 凭证 —— 无需主机名) | | **Dynu** | 用户名、密码(DynAccount 凭证 —— 无需主机名) | | **Namecheap** | API key 或密码、完整主机名 | 当启用 DDNS 时,路由器会自动更新 DNS 记录: - 每次连接 PPPoE 时 **立即更新** - 在配置的 keep-alive 间隔(默认为 24 小时)**定期更新** —— 无论 IP 是否更改都无条件重新注册,满足 NoIP 的 30 天 keepalive 要求 可通过 Web 界面(**DDNS** 页面)或 CLI 访问配置: ``` # 启用 DDNS ddns enable 1 # 选择 provider (0=NoIP, 1=DuckDNS, 2=Selfhost.de, 3=Dynu, 4=Namecheap) ddns provider 1 # NoIP:设置 hostname、username 和 password ddns hostname myhost.no-ip.org ddns token myusername ddns password mypassword # DuckDNS:设置 subdomain 和 token ddns token 12345-abcde-token # Selfhost.de:设置 username 和 password(DynAccount credentials) ddns token myusername ddns password mypassword # Dynu:设置 username 和 password(DynAccount credentials) ddns token myusername ddns password mypassword # Namecheap:设置 hostname 和 API key 或 password ddns hostname example.com ddns token my-api-key-or-password ddns poll 24 # 触发立即更新 ddns update # 显示当前 DDNS 状态 ddns status ``` Home Assistant 传感器会自动发布(状态、提供商、主机名、最后更新时间戳)。 ### 其他网络设置 ``` set_sta_static # Static Ethernet WAN IP (PPPoE disabled only) set_sta_static dhcp # Revert WAN to DHCP (requires restart) set_ap_mac # Override AP MAC set_hostname # DHCP client hostname (max 32 chars) set_ttl <0-255> # TTL override (0 = disabled) set_tx_power <2-20|0> # WiFi TX power in dBm (0 = max/default) set_wifi_country # WiFi country code (e.g. US, DE, JP; 01 = world-safe) ``` ### 防火墙 无状态防火墙根据四个有序 ACL 列表之一来评估数据包。首条匹配规则生效;默认情况下允许未匹配的数据包。 **ACL 列表:** | 列表 | 方向 | |------|-----------| | `to_esp` | 互联网 -> 路由器(上行链路入站) | | `from_esp` | 路由器 -> 互联网(上行链路出站) | | `to_ap` | WiFi 客户端 -> 路由器 | | `from_ap` | 路由器 -> WiFi 客户端 | #### 规则语法 (CLI) ``` acl [] [] ``` **proto:** `ip`、`tcp`、`udp`、`icmp` **address:** CIDR 表示法 (`192.168.1.0/24`) 或 `any` **port:** 端口号或 `any`(仅限 TCP/UDP;对于 `ip`/`icmp` 忽略) **action:** `allow`、`deny`、`allow_monitor`(允许 + PCAP 捕获)、`deny_monitor` —— 仅当启用 `CONFIG_PCAP_CAPTURE` 时才能使用监控操作 **示例:** ``` acl to_esp TCP any any any 22 allow # Allow SSH inbound to router acl from_ap TCP any any any 443 deny # Block HTTPS from AP clients acl to_esp IP 10.0.0.0/8 any deny # Drop RFC-1918 inbound acl to_esp del 0 # Delete rule at index 0 acl to_esp clear # Remove all rules from to_esp show acl # Show all lists and hit counts ``` ### 数据包捕获 *(可选构建功能)* 数据包作为实时的 PCAP 文件,通过端口 19000 上的 TCP 连接进行流式传输,仅绑定到 AP 接口(从不在 WAN 上暴露)。直接在 Wireshark 中打开流: ``` nc 19000 | wireshark -k -i - ``` #### 捕获模式 | 模式 | 行为 | |------|-----------| | `off` | 禁用捕获 | | `acl` | 仅捕获匹配带有 `allow_monitor` 或 `deny_monitor` 的 ACL 规则的数据包 | | `promisc` | 通过 PPP/Ethernet 上行链路接口的所有流量 | 在 `acl` 模式下,在防火墙规则中添加 `allow_monitor` 或 `deny_monitor` 作为操作,将导致匹配的数据包无论在何种全局模式下都会被捕获,从而轻松监视特定的主机或端口。 ``` pcap mode # Set capture mode pcap snaplen <64-1600> # Max bytes per packet (default 64/96) pcap status # Show mode, client, and packet stats ``` ### 远程控制台 基于 TCP 的网络可访问 CLI(默认端口 2323)。在启用之前,需要先设置路由器密码。 ``` remote_console enable # Enable (requires password set) remote_console disable # Disable remote_console port # Change TCP port (default 2323) remote_console timeout # Idle timeout (0 = no timeout) remote_console kick # Disconnect active session remote_console status # Show status ``` 使用 `telnet 2323` 或 `nc 2323` 连接。 ### Syslog 将日志消息转发到远程 syslog 服务器(UDP,RFC 3164)。 ``` syslog enable [] # Enable (default port 514) syslog disable # Disable syslog status # Show configuration ``` ## CLI 参考 以 **115200 bps** 连接到串行控制台,或通过远程控制台连接。 ### 网络 | 命令 | 描述 | |---------|-------------| | `set_sta_static ` | 以太网 WAN 的静态 IP(仅限禁用 PPPoE 时) | | `set_sta_static dhcp` | 将 WAN 恢复为 DHCP(需要重启) | | `set_ap [pass]` | 配置 WiFi AP(空密码 = 开放) | | `set_ap_ip ` | 更改 AP 子网 IP | | `set_ap_dns [ip]` | AP 客户端的 DNS(留 = upstream) | | `set_ap_mac ` | 覆盖 AP MAC 地址 | | `set_ap_nat ` | 启用 / 禁用 NAT(需要重启) | | `set_ap_hidden ` | 隐藏 AP SSID(需要重启) | | `set_ap_auth ` | AP 认证:wpa2、wpa3、wpa2wpa3(需要重启) | | `set_ap_channel <0-N>` | AP WiFi 信道(0=auto,N 随国家/地区设定的最大值而定,需要重启) | | `set_wifi_country ` | WiFi 国家代码(2 字符 ISO 3166 或 `01` 代表全球安全);设置允许的信道范围 —— `US`/`CA`/`01`: 1–11,大多数其他国家/地区: 1–13,`JP`: 1–14 | | `set_hostname [name]` | DHCP 客户端主机名(留空 = default) | | `set_ttl [0-255]` | 上游数据包的 TTL 覆盖(0=off) | | `set_tx_power [2-20\|0]` | WiFi AP 发射功率(单位为 dBm,0=max,立即应用) | | `ap [enable\|disable]` | 立即显示或启用/禁用 AP | ### PPPoE | 命令 | 描述 | |---------|-------------| | `set_pppoe -u -p ` | 设置 ISP 凭证 | | `set_pppoe -a <0\|1\|2>` | 认证方式:0=auto,1=PAP,2=CHAP | | `set_pppoe -s ` | 服务名称(可选) | | `set_pppoe -v ` | VLAN tag(0=disabled) | | `set_pppoe -j <0\|1>` | Baby-jumbo 帧 | | `set_pppoe -e <0\|1>` | 启用 / 禁用 PPPoE | ### DHCP 和端口映射 | 命令 | 描述 | |---------|-------------| | `dhcp_reserve add [-n ]` | 添加 DHCP 预留 | | `dhcp_reserve del ` | 删除预留 | | `dhcp_reserve block [-n ]` | 封锁设备 | | `portmap add ` | 添加端口转发规则 | | `portmap del ` | 删除端口转发规则 | ### 防火墙 | 命令 | 描述 | |---------|-------------| | `show acl` | 显示所有四个 ACL 列表及其规则和命中数 | | `acl [] [] ` | 添加规则 | | `acl del ` | 按索引删除规则 | | `acl clear` | 清除列表中的所有规则 | | `acl clear_stats` | 重置列表的命中计数器 | 列表:`to_esp`、`from_esp`、`to_ap`、`from_ap` —— 协议:`IP`、`TCP`、`UDP`、`ICMP` —— 操作:`allow`、`deny`;当启用 `CONFIG_PCAP_CAPTURE` 时还支持 `allow_monitor`、`deny_monitor` ### WireGuard VPN | 命令 | 描述 | |---------|-------------| | `show vpn` | VPN 状态和完整配置 | | `set_vpn ` | 设置私钥(base64) | | `set_vpn ` | 设置对端公钥(base64) | | `set_vpn ` | 设置对端主机 / IP | | `set_vpn
` | 设置隧道 IP 地址 | | `set_vpn -m ` | 隧道子网掩码(默认为 255.255.255.0) | | `set_vpn -p ` | 对端 UDP 端口(默认为 51820) | | `set_vpn -a ` | 持久化 keepalive(0 = disabled) | | `set_vpn -k ` | 预共享密钥(base64,可选) | | `set_vpn -e <0|1>` | 启用 / 禁用 VPN | | `set_vpn -K <0|1>` | 断线开关 on/off | | `set_vpn -R <0|1>` | 1 = route-all,0 = split tunnel | ### 动态 DNS (CONFIG_DDNS_ENABLED) | 命令 | 描述 | |---------|-------------| | `ddns status` | 显示当前 DDNS 配置和状态 | | `ddns enable <0|1>` | 开启或关闭 DDNS | | `ddns provider <0-4>` | 选择提供商:0=NoIP,1=DuckDNS,2=Selfhost.de,3=Dynu,4=Namecheap | | `ddns hostname ` | 设置主机名(或 DuckDNS 的子域名) | | `ddns token ` | 设置 token(DuckDNS)、用户名或 API key/密码 | | `ddns password ` | 设置密码 | | `ddns poll ` | 设置 keep-alive 间隔(1–168 小时,默认为 24) | | `ddns update` | 触发即时的 DDNS 更新 | ### 数据包捕获 *(CONFIG_PCAP_CAPTURE)* | 命令 | 描述 | |---------|-------------| | `pcap mode [off\|acl\|promisc]` | 获取 / 设置捕获模式 | | `pcap snaplen []` | 获取 / 设置每个数据包的最大字节数(64–1600) | | `pcap status` | 显示捕获状态、客户端和数据包计数 | ### 远程控制台和 Syslog | 命令 | 描述 | |---------|-------------| | `remote_console status` | 显示远程控制台状态 | | `remote_console enable` | 启用 TCP 控制台 | | `remote_console disable` | 禁用 TCP 控制台 | | `remote_console port ` | 设置 TCP 端口 | | `remote_console timeout ` | 设置空闲超时时间 | | `remote_console kick` | 断开当前会话 | | `syslog enable []` | 启用远程 syslog | | `syslog disable` | 禁用 syslog | | `syslog status` | 显示 syslog 配置 | ### Web 界面 | 命令 | 描述 | |---------|-------------| | `web_ui enable` | 启用 Web 界面(需要重启) | | `web_ui disable` | 禁用 Web 界面(需要重启) | | `web_ui port ` | 设置 HTTP 端口(需要重启) | | `set_router_password ` | 设置 Web / 控制台密码(留空 = disable) | | `web_ui wan_access enable` | 允许从互联网访问 Web 界面和远程控制台 | | `web_ui wan_access disable` | 禁止所有来自互联网的管理访问 | ### 状态和系统 | 命令 | 描述 | |---------|-------------| | `show status` | 连接、客户端、NAPT 使用情况、堆栈、运行时间 | | `show config` | AP / PPPoE 配置 | | `show mappings` | DHCP 地址池、预留、端口转发 | | `show acl` | 带有命中计数的所有四个防火墙 ACL 列表 | | `show pppoe` | PPPoE 链接状态和会话详情 | | `show ota` | OTA 分区信息 | | `bytes [reset]` | 显示或重置 WAN 字节计数器 | | `client_stats ` | 每客户端流量统计 | | `ping [-c ] [-i ] [-W ] [-s ]` | 从路由器发出的 ICMP 回显 | | `heap` | 当前和最小的空闲堆栈大小 | | `version` | 芯片型号、IDF 版本、Flash 大小 | | `log_level [] [-t ]` | 获取/设置日志详细级别(none/error/warn/info/debug/verbose) | | `set_tz [\|clear]` | 设置时区(POSIX,例如 `CET-1CEST,M3.5.0,M10.5.0/3`) | | `factory_reset` | 擦除所有设置并重启 | | `restart` | 重启路由器 | ### 硬件 | 命令 | 描述 | |---------|-------------| | `set_led_gpio ` | 状态 LED GPIO 引脚(-1 / `none` = 禁用) | | `set_led_lowactive ` | LED 极性(on = 低电平有效/反转) | ### MQTT / Home Assistant *(可选构建功能)* | 命令 | 描述 | |---------|-------------| | `mqtt status` | 显示 broker、连接状态、设备 ID | | `mqtt enable` | 启用并启动 MQTT 客户端 | | `mqtt disable` | 禁用 MQTT 客户端 | | `mqtt broker ` | 设置 broker URI(例如 `mqtt://192.168.1.2`) | | `mqtt user ` | 设置 broker 凭证 | | `mqtt interval ` | 状态发布间隔(5–3600 秒) | | `mqtt rediscover` | 重新发布 Home Assistant 发现配置 | 启用后,Home Assistant 会自动发现这些实体: | 实体 | 类型 | 描述 | |---------|---------|-----------| | WAN IP | sensor | 当前 WAN IP 地址 | | Up link | binary sensor | 上行链路连通性状态 | | PPPoE | binary sensor | PPPoE 会话状态 | | Web UI | switch | 启用 / 禁用 Web 界面 | | Remote Console | switch | 启用 / 禁用远程控制台 | | Restart | button | 触发路由器重启 | (所有实体都会发布到共享的路由器状态主题,以及上行链路、客户端数量、字节计数器、堆栈、运行时间和 WAN IP。) ## 安全 ### 管理界面暴露 默认情况下,Web 界面和远程控制台只能从局域网(AP 子网)访问。任何来自 AP 子网外部的连接都会在 TCP 打开回调时被丢弃。同样的门控机制适用于 Web 服务器和远程控制台。Web 服务器还受到自动插入的 ACL 规则的额外保护,远程控制台仅监听 AP 接口。只有在以下情况下才允许连接: 1. 启用了 `wan_access` 标志(主动选择启用,默认禁用),**或者** 2. 客户端 IP 处于 AP 的 /24 子网内。 仅当从互联网无法访问路由器的管理端口时(例如在本地环境中或在另一个 NAT 之后),才启用 WAN 访问。 ``` web_ui wan_access on # Allow management from WAN (takes effect immediately for web interface, console after reboot) web_ui wan_access off # Restore LAN-only access immediately ``` ### 认证 一个单一的共享密码用于保护 Web 界面和远程控制台。如果未设置密码,管理界面将完全开放。在这种情况下,通常会禁止 WAN 访问。 **密码存储:** 密码以 `salt_hex:hash_hex` 的形式存储在 NVS 中 —— 包含一个 16 字节的随机盐值,后跟 `salt || password` 的 SHA-256 哈希值。 **Web 会话:** 登录后,服务器会颁发一个 31 字符的随机十六进制 token(取自 `esp_random()`)作为会话 cookie。会话在处于不活动状态 30 分钟后过期;活动会重置计时器。一次只能存在一个会话。Cookie 设置了 `SameSite=Strict`,但没有设置 `HttpOnly` 或 `Secure`(因为没有 TLS)。 **远程控制台:** 控制台规定每次连接最多允许 3 次失败的登录尝试,超过此限制后连接将被断开,并在重新连接前强制延迟 5 秒。失败的尝试会被记录并在 `remote_console status` 中计数。 ### 传输安全 Web 界面(HTTP)和远程控制台(纯 TCP)均未加密。密码和会话 token 在线路上以明文形式传输。这在受信任的本地 WiFi 网络上是可以接受的,但这意味着: - 任何有权访问网络的人都可以看到 Web 会话 cookie 以及通过浏览器输入的任何密码。 - 在 TCP 流中可以看到远程控制台密码。 ### 防火墙 无状态的 ACL 防火墙可跨四个流量方向提供数据包级过滤。默认情况下不会安装任何规则 —— 除非明确添加规则,否则允许所有流量。 ## 构建前置条件:ESP-IDF v5.5 或更高版本以及 `xtensa-esp32-elf` 工具链。 ``` # 设置 target idf.py set-target esp32 # (可选)配置 build-time features idf.py menuconfig # Build idf.py build ``` ### 构建选项 | Kconfig 符号 | 默认值 | 描述 | |-----|---------|-----| | `CONFIG_PCAP_CAPTURE` | **off** | 启用通过 TCP 的实时 PCAP 捕获。为环形缓冲区和 TCP 服务器任务增加约 16–32 KB 的 RAM。关闭时,`pcap` CLI 命令和 PCAP 配置页面不可用,并且 `allow_monitor`/`deny_monitor` ACL 操作也不可用。 | | `CONFIG_MQTT_HOMEASSISTANT` | on | 将路由器遥测数据连同 Home Assistant 自动发现功能一起发布到 MQTT broker。增加约 58 KB 的 Flash;只有在配置了 broker 时才会使用 RAM。 | | `CONFIG_DDNS_ENABLED` | **off** | 启用动态 DNS 客户端,以便向 NoIP、DuckDNS、Selfhost.de、Dynu 或 Namecheap 自动注册 WAN IP。所有五个提供商都会被编译;在配置时会选择默认提供商。所有 API 调用均使用 HTTPS (TLS)。 | ## 安装 刷写固件并监视启动日志: ``` idf.py -p /dev/ttyUSB0 flash monitor ``` 首次启动时,路由器将以默认设置启动: | 设置 | 默认值 | |---------|---------| | AP SSID | `ESP32_PPPoE_Router` | | AP 密码 | open | | AP IP | `192.168.4.1` | | Web 界面 | `http://192.168.4.1` | | PPPoE | disabled | 连接到 AP,打开 `http://192.168.4.1`(应由强制门户自动完成),并配置密码、PPPoE 凭证和其他任何设置。更改将在重启后生效(使用 Web 界面中的 **重启** 按钮,或者在 CLI 中使用 `restart`)。 要擦除所有设置并恢复出厂默认设置: ``` factory_reset # from CLI # 或 esptool.py erase_flash # full flash erase (also removes firmware) ```
标签:ESP32, UML, WireGuard, 内核驱动, 客户端加密, 物联网, 网络协议, 网络通信, 软路由, 防火墙