最近帮一家航运公司实操了一个棘手的旧船网络改造项目。船东图便宜买了几个星链终端,想直接把星链的高速网络灌进原本只有百兆带宽的老旧船内局域网。
结果船一出海,问题来了:星链动辄几十兆的下行流量,夹杂着船员刷视频的巨量 UDP 报文,直接形成了网络风暴,把底下机舱里那些可怜的旧 PLC 控制器冲得频频断线。这不仅没法用,更严重违背了网络隔离的规范底线。
被逼无奈,我要求现场立刻替换上一块具备工业级环境抗震认证的计算板(也就是业界常说的标准 海事网关 ),并决定抛弃默认的简单路由配置,直接深入 Linux 内核协议栈,手写脚本来实现底层的流量整形(QoS)和硬分流。今天把核心排障思路和代码扒出来,做个复盘。

一、 应对星链大流量:基于 tc 的 HTB 队列整形实操
防止机舱旧设备被大流量冲垮,必须利用 Linux 的 tc (流量控制) 模块进行 HTB (Hierarchical Token Bucket) 队列整形。我们要把星链的带宽进行严格的切片分配。
Bash
#!/bin/bash
# 清除旧队列,我们在 eth1 (连接旧船内网的接口) 上做文章
tc qdisc del dev eth1 root 2>/dev/null
# 建立根队列,假设星链实测可用带宽为 50Mbit
tc qdisc add dev eth1 root handle 1: htb default 20
tc class add dev eth1 parent 1: classid 1:1 htb rate 50mbit ceil 50mbit
# 业务数据类 (VLAN10) - 预留高带宽,高优先级,保障机舱和办公
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 30mbit ceil 40mbit prio 1
# 休闲数据类 (VLAN20) - 限制低带宽,低优先级,防止娱乐流量挤占
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 10mbit ceil 20mbit prio 2
# 使用 iptables 打 MARK,配合 tc 过滤器精准分拣
iptables -t mangle -A FORWARD -i eth0.10 -j MARK --set-mark 10
iptables -t mangle -A FORWARD -i eth0.20 -j MARK --set-mark 20
tc filter add dev eth1 parent 1: protocol ip prio 1 handle 10 fw flowid 1:10
tc filter add dev eth1 parent 1: protocol ip prio 2 handle 20 fw flowid 1:20
二、 物理级分流实操:基于 Nftables 的零信任策略
整形完流量,接下来就是满足合规的管控要求。用传统的 iptables 写几百条遍历规则,CPU 极易过载。直接上 nftables 构建状态机防火墙。
核心逻辑就是:除了明确放行的,其余跨网段的串扰数据包一律丢弃,坚决不让非授权终端去探测机舱的设备。
Bash
# 1. 净化环境
nft flush ruleset
# 2. 建立零信任的核心管控链
nft add table inet maritime_filter
nft add chain inet maritime_filter forward { type filter hook forward priority 0 \; policy drop \; }
# 3. 状态机放行:只允许已经顺利建立握手的回包通过
nft add rule inet maritime_filter forward ct state established,related accept
# 4. 雷池区:任何从生活网段(vlan20)试图访问机舱控制网段(vlan10)的包,直接丢弃
nft add rule inet maritime_filter forward iifname "vlan20" oifname "vlan10" counter drop

做旧船的网络改造,硬件必须达标,同时写好一份健壮的内核级流量管控脚本,比买普通的千兆交换机管用得多。