"Tương đối dễ dàng" là một thuật ngữ khó, nhưng bạn có thể
- thiết lập các bảng định tuyến cho mỗi liên kết của bạn - một bảng cho mỗi liên kết, với một cổng mặc định duy nhất
- sử dụng bộ lọc mạng để đóng dấu giống hệt nhau trên tất cả các gói của một luồng
- sử dụng bảng quy tắc ip để định tuyến các gói thông qua các bảng định tuyến khác nhau tùy thuộc vào nhãn hiệu
- sử dụng tuyến có trọng số nhiều nexthop để cân bằng các gói đầu tiên trong phiên qua các cổng / liên kết của bạn.
Đã có một cuộc thảo luận tại danh sách gửi thư của netfilter về chủ đề này, nơi tôi đang đánh cắp các danh sách từ:
1. Quy tắc định tuyến (RPDB và FIB)
ip route add default via <gw_1> lable link1
ip route add <net_gw1> dev <dev_gw1> table link1
ip route add default via <gw_2> table link2
ip route add <net_gw2> dev <dev_gw2> table link2
/sbin/ip route add default proto static scope global table lb \
nexthop via <gw_1> weight 1 \
nexthop via <gw_2> weight 1
ip rule add prio 10 table main
ip rule add prio 20 from <net_gw1> table link1
ip rule add prio 21 from <net_gw2> table link2
ip rule add prio 50 fwmark 0x301 table link1
ip rule add prio 51 fwmark 0x302 table link2
ip rule add prio 100 table lb
ip route del default
2. Quy tắc tường lửa (sử dụng ipset để buộc chế độ LB "chảy")
ipset create lb_link1 hash:ip,port,ip timeout 1200
ipset create lb_link2 hash:ip,port,ip timeout 1200
# Set firewall marks and ipset hash
iptables -t mangle -N SETMARK
iptables -t mangle -A SETMARK -o <if_gw1> -j MARK --set-mark 0x301
iptables -t mangle -A SETMARK -m mark --mark 0x301 -m set !
--match-set lb_link1 src,dstport,dst -j SET \
--add-set lb_link1 src,dstport,dst
iptables -t mangle -A SETMARK -o <if_gw2> -j MARK --set-mark 0x302
iptables -t mangle -A SETMARK -m mark --mark 0x302 -m set !
--match-set lb_link2 src,dstport,dst -j SET \
--add-set lb_link2 src,dstport,dst
# Reload marks by ipset hash
iptables -t mangle -N GETMARK
iptables -t mangle -A GETMARK -m mark --mark 0x0 -m set --match-set
lb_link1 src,dstport,dst -j MARK --set-mark 0x301
iptables -t mangle -A GETMARK -m mark --mark 0x0 -m set --match-set
lb_link2 src,dstport,dst -j MARK --set-mark 0x302
# Defining and save firewall marks
iptables -t mangle -N CNTRACK
iptables -t mangle -A CNTRACK -o <if_gw1> -m mark --mark 0x0 -j SETMARK
iptables -t mangle -A CNTRACK -o <if_gw2> -m mark --mark 0x0 -j SETMARK
iptables -t mangle -A CNTRACK -m mark ! --mark 0x0 -j CONNMARK --save-mark
iptables -t mangle -A POSTROUTING -j CNTRACK
# Reload all firewall marks
# Use OUTPUT chain for local access (Squid proxy, for example)
iptables -t mangle -A OUTPUT -m mark --mark 0x0 -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m mark --mark 0x0 -j GETMARK
iptables -t mangle -A PREROUTING -m mark --mark 0x0 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark --mark 0x0 -j GETMARK
Bạn có thể muốn theo dõi cuộc thảo luận danh sách gửi thư của bộ lọc mạng cho một số biến thể ở trên.