나는 이것을 읽었다지도 시간, 하지만 2개의 인터페이스에 iptables 규칙을 적용하여 인터넷 연결의 부하를 분산하는 방법을 생각 중입니다. 다음은 내 iptables 규칙입니다.
#!/bin/sh
IPT="/sbin/iptables"
LAN='ens38'
WAN='ens33'
OPT='ens37'
LAN_NET="192.168.100.0/24"
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT -A FORWARD -i $LAN -o $WAN -j ACCEPT
$IPT -A FORWARD -i $LAN -o $OPT -j ACCEPT
$IPT -A FORWARD -i $WAN -o $LAN -j ACCEPT
$IPT -A FORWARD -i $OPT -o $LAN -j ACCEPT
$IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $OPT -j MASQUERADE
# Load balancing rules (Split 50/50 between fwmark 1/2)
$IPT -t mangle -N balance1
$IPT -t mangle -A balance1 -m connmark ! --mark 0 -j RETURN
$IPT -t mangle -A balance1 -m state --state ESTABLISHED,RELATED -j RETURN
$IPT -t mangle -A balance1 -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 1
$IPT -t mangle -A balance1 -m statistic --mode nth --every 2 --packet 1 -j CONNMARK --set-mark 2
# Check to see if we have already marked a packet
$IPT -t mangle -A PREROUTING -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
$IPT -t mangle -A OUTPUT -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
# Mark incoming connections to return on the interface they came in on
$IPT -t mangle -A PREROUTING -i $WAN -m state --state NEW -j CONNMARK --set-mark 1
$IPT -t mangle -A PREROUTING -i $OPT -m state --state NEW -j CONNMARK --set-mark 2
# New outgoing packets
$IPT -t mangle -A PREROUTING -i $LAN -p tcp --dport 80 -m state --state NEW -j balance1
$IPT -t mangle -A PREROUTING -i $LAN -p tcp --dport 443 -m state --state NEW -j balance1
# $IPT -t mangle -A OUTPUT -p tcp --dport 80 -m state --state NEW -j balance1
# Choose our route and save the mark
$IPT -t mangle -A PREROUTING -m connmark --mark 1 -j MARK --set-mark 1
$IPT -t mangle -A PREROUTING -m connmark --mark 2 -j MARK --set-mark 2
$IPT -t mangle -A PREROUTING -m state --state NEW -m connmark ! --mark 0 -j CONNMARK --save-mark
echo 1 > /proc/sys/net/ipv4/ip_forward
나는 2개의 테이블을 정의하고 /etc/iproute2/rt_tables
다음과 같이 선택했습니다.
[root@R1 ~]# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
1 wan
2 opt
iproute에 대한 경로를 추가하는 스크립트는 다음과 같습니다.
LAN_DEV='ens38'
WAN_DEV='ens33'
OPT_DEV='ens37'
WAN_GW="192.168.84.2"
OPT_GW="192.168.0.1"
LAN_NET="192.168.100.0/24"
ip rule add fwmark 1 table wan
ip rule add fwmark 2 table opt
# Add default route for table wan and opt
ip route add default via $WAN_GW dev $WAN_DEV table wan
ip route add default via $OPT_GW dev $OPT_DEV table opt
# Add LAN route for table wan and opt
ip route add $LAN_NET dev $LAN_DEV table opt
ip route add $LAN_NET dev $LAN_DEV table wan
내가 아는 한가이드, 연결 태그에서 패킷 태그를 복원하고 저장합니다 restore-mark
. save-mark
따라서 규칙이 적용됩니다.패킷당존재하다연결. 예: 연결 A가 있습니다. iptables 규칙은 연결 A의 패킷 4개마다 계산하여 1,2,1,2로 표시합니다.
연결이 많은 경우 연결을 개별적으로 표시하려면 어떻게 해야 합니까? 예: A, B, C 3개의 연결이 있고 이를 세어 1, 2, 3으로 레이블을 지정하고 싶습니다.
실제로 이 규칙은 WAN(ens33)의 경로만 사용합니다. 패킷이 라우터에 들어갈 때. OPT(ens37)로 라우팅되지 않습니다. 설명할 수 없습니다.
답변1
알려진 연결을 다시 표시하지 않고 허용하려면 규칙이 필요합니다.
이렇게 하면 새로운 연결만 카운터를 트리거합니다.
iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
iptables -A PREROUTING -t mangle -m mark --mark 0 -m nth --counter 1 \
--every 3 --packet 1 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -m mark --mark 0 -m nth --counter 1 \
--every 3 --packet 2 -j MARK --set-mark 2
iptables -A PREROUTING -t mangle -m mark --mark 0 -m nth --counter 1 \
--every 3 --packet 3 -j MARK --set-mark 3
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark