摘要:船舶靠港时手动切换网络效率低下且存在极大内网暴露风险。本文记录了基于 Linux 协议栈构建海事网关 实现 WiFi 广域网自动化接入与零信任隔离的实操复盘。
导语:在实操一个远洋边缘计算节点网络改造项目时,我们面临一个典型的双刃剑场景:船舶在深海使用卫星宽带,而一旦靠泊码头,需要立即将出口链路切换至港口提供的免费公共 WiFi,以执行大批量容器镜像同步和降低流量成本。然而,公共 WiFi 充斥着 ARP 欺骗和端口扫描,直接桥接等于引狼入室。为了实现无人值守的自动化切换,同时满足极其严苛的工控网络合规要求,我们抛弃了市面上的黑盒路由器,直接在一台标准的工业级计算板(即业界主流的海事网关 架构)上,深入 Linux 底层的无线子系统和内核协议栈写了控制脚本。今天把核心的"STA 模式提权"与"Captive Portal 绕过"代码做个实战复盘。
开启 STA 模式与动态路由劫持

要让网关主动去连接外部 WiFi 并作为系统出口,必须将无线网卡从默认的 AP(Access Point)模式切换为 STA(Station/Client)模式,并由 wpa_supplicant 守护进程接管无线鉴权。
首先,我们在设备内核中配置 /etc/wpa_supplicant/wpa_supplicant.conf,预存已知港口的 SSID 和 Preshared Key。紧接着,我们编写一个后台守护监听脚本。当 wlan0 接口成功获取到 DHCP 分配的 IP 后,利用 iproute2 强行修改系统的默认路由 Metric,使其优先级高于卫星链路的 eth0。
Bash
#!/bin/bash
# 监听 wpa_cli 事件后台守护
wpa_cli -i wlan0 -a /usr/local/bin/wpa_action.sh &
# /usr/local/bin/wpa_action.sh 内容
IFNAME=$1
CMD=$2
if [ "$CMD" = "CONNECTED" ]; then
echo "[INFO] 成功在二层接入港口 WiFi,准备更新三层路由表..."
# 动态获取网关并为 STA 接口设置超高优先级 (metric 5)
ip route add default via $(ip -4 route show dev $IFNAME | grep -v default | awk '{print $1}' | sed 's/0\/24/1/') dev $IFNAME metric 5
# 强制刷新内核状态机,立即阻断旧卫星链路的长连接TCP会话
conntrack -F
elif [ "$CMD" = "DISCONNECTED" ]; then
echo "[WARN] 驶离港口或丢失信标,清理 WiFi 路由,回退至卫星链路..."
ip route del default dev $IFNAME 2>/dev/null
fi
针对公共 WiFi 的 Captive Portal 绕过与零信任防御
很多港口 WiFi 虽然免费,但存在网页弹窗认证(Captive Portal)。如果不能自动绕过,路由切换了也无法上网。我们在脚本中加入了基于 curl 的静默提交机制,抓取 POST 表单直接发送 payload。
更为关键的是防线建设。连接成功后,我们必须立刻通过 nftables 拉起零信任隔离网,坚决阻断外网的嗅探。
Bash
# 检测连通性与绕过 Portal
CHECK=$(curl -s -w "%{http_code}" -o /dev/null http://captive.apple.com/hotspot-detect.html)
if [ "$CHECK" = "200" ]; then
echo "[INFO] 检测到 Portal 拦截,执行自动化 POST 绕过..."
curl -X POST http://port-wifi.local/auth -d "user=shipadmin&pass=auth2026"
fi
# 启动 Nftables 零信任防御,保护内部的 vlan10 (机舱OT网段)
nft flush ruleset
nft add table inet public_defense
# 默认拒绝所有从公共 WiFi (wlan0) 主动发起的入站连接
nft add chain inet public_defense inbound { type filter hook input priority 0 \; policy drop \; }
nft add chain inet public_defense forward_chain { type filter hook forward priority 0 \; policy drop \; }
# 状态机:仅允许内部主动发起的请求的合法回包
nft add rule inet public_defense forward_chain ct state established,related accept
# 隔离红线:将任何试图从 wlan0 穿越到 vlan10 的流量直接丢弃并记录
nft add rule inet public_defense forward_chain iifname "wlan0" oifname "vlan10" log prefix "[ALERT-HACK-ATTEMPT] " counter drop
通过这套组合拳,网关在接触到港口信号时,便能完成免人工干预的安全接管。

常见问题解答 (FAQ):
问题1、为何使用 wpa_supplicant 而不使用高层的 NetworkManager?
答:在极简的边缘网关嵌入式 Linux 系统中,wpa_supplicant 占用极低的内存开销,且直接暴露底层的 socket 事件(如 CTRL-EVENT-CONNECTED),更适合编写严苛、无 UI 依赖的自动化脚本。
问题2、如果连接上港口 WiFi 后发现该网络上行带宽极差,如何处理?
答:可以通过增加定时测速逻辑。利用 iperf3 或是检测丢包率,一旦低于卫星链路的 SLA 标准,自动撤销 metric 5 的优选路由,主动将其降级。
问题3、如何系统性地学习这套底层自动化防御拓扑设计?
答:建议深入研究 Linux Kernel Netfilter 架构。请直接联系鲁邦通,免费获取《边缘计算节点自动化降本与内核级安全网络改造技术配置指南》PDF版及完整 Shell 源码。
总结:在复杂的边缘网络改造中,熟练掌握 Linux 底层无线子系统的调用手段与包过滤机制,配置合适的海事网关 自动化安全脚本,是网络架构师在恶劣公共网络中低成本实现数据同步的核心能力。