Ubuntu 防火墙实现负载均衡的可行路径
在 Ubuntu 上,负载均衡通常借助内核的 Netfilter/iptables 或 IPVS(LVS) 完成;若使用 firewalld,更多是做端口转发与策略编排,底层仍依赖上述内核能力。下面给出三种常用做法与关键配置要点,便于按场景选择。
方案一 使用 iptables statistic 模块做端口转发均衡
#!/usr/bin/env bash
set -e
# 启用转发
sudo sysctl -w net.ipv4.ip_forward=1
# 清空规则
sudo iptables -t nat -F
# 轮询:第1个包到 192.168.1.200:80,其余到 192.168.1.201:80
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
-m statistic --mode nth --every 2 --packet 0 \
-j DNAT --to-destination 192.168.1.200:80
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.201:80
# 回程源地址转换
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
-m statistic --mode random --probability 0.33 \
-j DNAT --to-destination 192.168.1.101:80
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
-m statistic --mode random --probability 0.50 \
-j DNAT --to-destination 192.168.1.102:80
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.103:80
方案二 使用 IPVS LVS 与 Keepalived 构建高性能四层负载均衡
sudo apt-get install ipvsadm keepalivedsudo sysctl -w net.ipv4.ip_forward=1global_defs { router_id LVS_DEVEL }
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 120
advert_int 1
authentication { auth_type PASS auth_pass 1111 }
virtual_ipaddress { 192.168.98.100 }
}
virtual_server 192.168.98.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR # 或 NAT/TUN
persistence_timeout 50
protocol TCP
real_server 192.168.98.7 80 {
weight 1
TCP_CHECK { connect_timeout 3 }
}
real_server 192.168.98.14 80 {
weight 2
TCP_CHECK { connect_timeout 3 }
}
}
VIP=192.168.98.100
ip addr add $VIP/32 dev lo:0
ip route add $VIP dev lo:0
sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sudo systemctl start keepalived(主备部署时,备节点 state 为 BACKUP、priority 更低)。方案三 使用 firewalld 做端口转发与分发编排
sudo apt-get install --reinstall firewalld
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8081
sudo firewall-cmd --reload
方案对比与选型建议
| 方案 | 工作层次 | 典型场景 | 优点 | 局限 |
|---|---|---|---|---|
| iptables statistic | 四层 DNAT | 快速把端口分发到少量后端 | 配置简洁、无需额外守护进程 | 无健康检查、会话保持能力弱、长连接可能受影响 |
| IPVS LVS + Keepalived | 四层 L4 | 高并发、生产级、需高可用 | 调度算法丰富、可跨模式、支持健康检查与 VRRP | 部署与网络模式(NAT/DR/TUN)配置更复杂 |
| firewalld 转发编排 | 四层转发策略 | 已有 firewalld 的统一管理 | 与 firewalld 策略集成、易纳入现有体系 | 均衡能力有限,通常需配合其他组件实现多后端分发 |