1.
总体架构与准备工作
在开始之前,先确认:运营商链路(例如台湾常用的中嘉、中华电信)带宽、公网IP数量、路由器/交换机是否支持VLAN/多播、以及服务器是否为Linux(建议Ubuntu/Debian/CentOS)。准备工作包括:记录所有公网IP、各IP用途;确定主链路和备份链路;在每台服务器上安装 iproute2、iptables、tc(iproute2 包含 tc)、ifb、htop、vnstat、iftop。建议先在测试环境(内网或VPS)做验证。
2.
IP 绑定与接口别名配置(实际操作)
在Linux上对每个公网IP做逻辑别名。例如主接口为 eth0,添加多个IP:执行命令 ip addr add 1.2.3.4/32 dev eth0 label eth0:1,同时配置路由策略(见下一节)。将这些命令写入 /etc/network/interfaces 或使用 netplan/systemd-networkd 来永久化。在台湾机房,常常需要做 /32 配置并在路由器上做对端路由。
3.
策略路由:按源IP做出站路径控制
为了对每个源IP单独做带宽/延迟控制,需要为每个IP建立策略表。步骤:编辑 /etc/iproute2/rt_tables 添加自定义表号;执行 ip rule add from 1.2.3.4/32 table 101;然后 ip route add default via
dev eth0 table 101。为每个公网IP重复上述操作。这样可以保证基于源IP的路由决策,后续可以按表设置tc规则或策略。
4.
出站带宽限速:用 tc + HTB 按 IP 限速(命令示例)
先清空旧规则:tc qdisc del dev eth0 root || true。创建根队列:tc qdisc add dev eth0 root handle 1: htb default 30。创建父类:tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit(整口)。为单个IP创建类:tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit ceil 2mbit。然后用 tc filter 匹配源IP:tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4/32 flowid 1:10。按需为每个IP重复,调整 rate/ceil。注意:HTB 控制的是出站(egress),若要限制入站需见 ifb 章节。
5.
入站带宽控制:ifb + tc 的实操步骤
Linux 无法直接对 ingress 做精确限速,需使用 ifb(虚拟回环)。启用内核模块:modprobe ifb numifbs=1。把 ingress 重定向到 ifb0:tc qdisc add dev eth0 ingress;tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0。然后在 ifb0 上用 tc qdisc/class 进行 HTB 限速,方法同出站。清晰记录每个IP的规则与优先级,方便后续维护。
6.
延迟与抖动控制:使用 netem 做延迟注入与丢包模拟
如果需要人为控制延迟(例如测试站群在较高延迟下的表现),在 tc class 或 qdisc 上加 netem:tc qdisc add dev ifb0 parent 1:10 handle 10: netem delay 100ms 10ms distribution normal loss 0.1%。对于生产环境仅在必要且经过同意的前提下使用。netem 可以叠加在 HTB 下作为子 qdisc,先创建HTB类再 attach netem。
7.
基于连接数/端口的流量控制与黑白名单
结合 iptables 做预过滤:用 connlimit 模块限制单位IP并发连接数:iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 200 -j DROP(根据站群特点调整)。用 recent、hashlimit 做速率限制。对于恶意流量,可以先通过 iptables 标记包(-j MARK --set-mark 10),再用 tc filter 根据 fwmark 匹配到特定类,做更精细的带宽控制。
8.
多链路与负载均衡:keepalived + LVS/HAProxy 示例
如果有多条ISP链路,建议在网关层做负载均衡或策略路由。使用 keepalived 做 VIP 切换,HAProxy 做四层负载分发。或者在服务器端用 iperf 测试链路质量后通过 ip route 的优先级(metric)和脚本动态调整 ip rule。注意对会话保持(sticky)和源地址策略的考虑,避免站群流量被不同出口打散。
9.
监控与自动化:持续观察与报警配置
部署监控:vnStat(流量统计)、iftop/bmon(实时)、Prometheus + node_exporter(指标采集),Grafana 可视化。写监控脚本定期检查 tc/iptables 状态并记录到日志,若发现异常触发报警并自动调整限速脚本(例如通过Ansible或cron执行预定义命令)。保留配置快照,便于回滚。
10.
问:在台湾机房做多IP带宽控制,最常见的误区是什么?
常见误区是只对单个接口做简单限速而忽略策略路由与源IP的绑定,导致不同IP共享限速规则。此外忽视入站控制(没有使用ifb)会使实际入站带宽无法被限制,另一个误区是直接在生产环境大幅调整netem造成业务中断。解决办法是先在测试环境验证、使用策略路由和ifb、逐步放量。
11.
答:如何避免这些问题与快速排查步骤?
排查步骤包括:1) 检查 ip rule 与路由表(ip rule show; ip route show table );2) 检查 tc qdisc/class/filter(tc qdisc show dev eth0; tc class show dev eth0; tc filter show dev eth0);3) 用 ss/iftop/iftb/ tcpdump 查看连接与流量路径;4) 若为入站问题,确认 ifb 是否存在并且重定向规则生效。制定回滚脚本,遇到严重问题时一键清除 tc 规则和 iptables 相关规则。
12.
问:给出一个可复用的脚本模板来批量为多IP创建带宽规则?
示例思路:写一个 bash 脚本,读取 CSV(IP,rate,ceil),为每个IP创建对应的 HTB class 与 tc filter,并写入对应的 ip rule/ip route。脚本要包含:清理旧规则、创建根 qdisc、循环添加 class & filter、设置 ifb 重定向(如需),以及在 /etc/rc.local 或 systemd 单元中调用以开机生效。上线前请先在单机验证。以下为伪代码步骤(要在真实环境中替换网关与接口):
1) tc qdisc del dev eth0 root || true
2) tc qdisc add dev eth0 root handle 1: htb default 30
3) for each row: tc class add ...; tc filter add ...; ip rule add from /32 table ; ip route add default via table
4) 保存并启动。
13.
答:合规与安全提示(在台湾地区部署需注意)
在台湾或任何地区部署大规模站群时,确保遵守当地法律与机房/ISP 的服务条款。不要用于发起DDoS或其它违法行为。对访问日志与配置变更做审计,密钥与API凭证采用安全存储(例如 Vault)。定期更新内核和网络工具,防止已知漏洞被利用。
来源:台湾地区站群多ip服务器带宽与延迟管控技巧分享