iptables 연결 플래그 불균형

iptables 연결 플래그 불균형

다음은 내 네트워크 토폴로지입니다.

+                                +
 |                                |
 |                                |
 |                                |
 |     +------------------+       |
 |     |                  |       |
 +-----+    firewall      +-------+
  eth0 |                  | eth1
       +--------+---------+
                | eth4
                |
                |
          +-----+---------+
          |               |
+---------+   switch      +---+
|         |               |   |
|         +-+-+-+-+-+-+-+-+   |
|         | | | | | | | |     |
+         + + + + + + + +     +

              10 Vlans

저는 확장된 통계와 연결 태그를 사용하여 LAN 네트워크의 부하를 분산합니다. 그러나 모듈 마킹 및 통계 기능은 그다지 좋지 않습니다. 내 iptables는 다음과 같습니다.

#!/bin/sh
#
# delete all existing rules.
#
IPT='/sbin/iptables'

LAN_IF='eth4'

WAN_IF='eth0'
OPT_IF='eth1'
LAN_NET='192.168.10.0/24'


VLAN1_NET='192.168.101.0/24'
VLAN2_NET='192.168.102.0/24'
VLAN3_NET='192.168.103.0/24'
VLAN4_NET='192.168.104.0/24'
VLAN5_NET='192.168.105.0/24'
VLAN6_NET='192.168.106.0/24'
VLAN7_NET='192.168.107.0/24'



$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X

#$IPT -A INPUT -j LOG --log-level 4 --log-prefix 'NETFILTER'
#$IPT -A OUTPUT -j LOG --log-level 4 --log-prefix 'NETFILTER'
$IPT -A FORWARD -j LOG --log-level 4 --log-prefix 'NETFILTER '


$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP


# Always accept loopback traffic
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT




# Allow for lan net
$IPT -A OUTPUT -o $LAN_IF -j ACCEPT
$IPT -A INPUT -i $LAN_IF -j ACCEPT

# Allow from local to internet
$IPT -A OUTPUT -o $WAN_IF -j ACCEPT
$IPT -A OUTPUT -o $OPT_IF -j ACCEPT

# Allow established connections, and those not coming from the outside
$IPT -A INPUT -s $LAN_NET -p icmp -j ACCEPT
$IPT -A OUTPUT -s $LAN_NET -p icmp -j ACCEPT


$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -m state --state NEW -i $LAN_IF -j ACCEPT

# Allow forward both WANT and OPT
$IPT -A FORWARD -i $WAN_IF -o $LAN_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $OPT_IF -o $LAN_IF -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
$IPT -A FORWARD -s $LAN_NET -o $WAN_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN7_NET -o $WAN_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN6_NET -o $WAN_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN5_NET -o $WAN_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN4_NET -o $WAN_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN3_NET -o $WAN_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN2_NET -o $WAN_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN1_NET -o $WAN_IF -j ACCEPT

#$IPT -A FORWARD -s $LAN_NET -o $OPT_IF -j ACCEPT
# Allow outgoing connections from the LAN side.
$IPT -A FORWARD -s $LAN_NET -o $OPT_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN5_NET -o $OPT_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN6_NET -o $OPT_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN7_NET -o $OPT_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN4_NET -o $OPT_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN3_NET -o $OPT_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN2_NET -o $OPT_IF -j ACCEPT
$IPT -A FORWARD -s $VLAN1_NET -o $OPT_IF -j ACCEPT




$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -s $VLAN1_NET -j ACCEPT
$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -d $VLAN1_NET -j ACCEPT

$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -s $VLAN2_NET -j ACCEPT
$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -d $VLAN2_NET -j ACCEPT

$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -s $VLAN3_NET -j ACCEPT
$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -d $VLAN3_NET -j ACCEPT

$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -s $VLAN4_NET -j ACCEPT
$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -d $VLAN4_NET -j ACCEPT

$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -s $VLAN5_NET -j ACCEPT
$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -d $VLAN5_NET -j ACCEPT

$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -s $VLAN6_NET -j ACCEPT
$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -d $VLAN6_NET -j ACCEPT

$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -s $VLAN7_NET -j ACCEPT
$IPT -A FORWARD -i $LAN_IF -o $LAN_IF -d $VLAN7_NET -j ACCEPT



# Masquerade.
$IPT -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $OPT_IF -j MASQUERADE



# load balancing
$IPT -A PREROUTING -t mangle -j CONNMARK --restore-mark
$IPT -A PREROUTING -t mangle -m mark ! --mark 0 -j ACCEPT

$IPT -A PREROUTING -p icmp -t mangle -m statistic --mode nth --every 2 --packet 0 -j MARK --set-mark 2
$IPT -A PREROUTING -p icmp -t mangle -m statistic --mode nth --every 2 --packet 1 -j MARK --set-mark 3
$IPT -A PREROUTING -t mangle -j CONNMARK --save-mark


# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward

명령을 통해 디버깅합니다 cat /var/log/messages |grep 0x2 |wc -l.cat /var/log/messages |grep 0x3 |wc -l

그러나 0x2로 표시된 패킷과 0x3으로 표시된 패킷의 수는 균형이 맞지 않습니다. 왜 이런 일이 발생합니까?

답변1

스크립트의 로드 밸런싱 부분은 다음과 같습니다.

  • 이미 연결을 알고 있었다면 이전에 했던 것과 같은 방식으로 하세요.
  • 이렇게 하지 않으면 절반의 시간이 한 인터페이스에서 전송되고 나머지 절반은 다른 인터페이스에서 전송됩니다.

따라서 각 인터페이스의 연결 수는 동일합니다.

그러나 일부 연결에는 3개의 패킷만 있고 다른 연결에는 1000개의 패킷이 있는 경우 패킷 수가 동일하지 않습니다. 또한 열려 있는 연결 수를 확인하면 일부 연결이 더 오래 지속되기 때문에 동일하지 않을 수 있습니다.

패킷의 부하를 분산하려면 다음 줄을 제거해야 합니다.

$IPT -A PREROUTING -t mangle -j CONNMARK --restore-mark
$IPT -A PREROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
$IPT -A PREROUTING -t mangle -j CONNMARK --save-mark

그러나 이는 연결의 IP 소스가 서로 다르고 비대칭 라우팅으로 인해 패킷의 절반이 대상 서비스에 도달하지 못하기 때문에 좋지 않은 생각입니다. 그리고 패킷 균형을 조정해도 그 이후에 전송되는 비트의 균형이 맞지 않습니다. 전송된 균형 비트도 수신된 비트의 균형을 맞추지 못합니다.

제 생각에는 스크립트를 지금과 같이 유지해야 합니다. 트래픽이 많을수록 링크의 균형이 더욱 균형을 이룰 것입니다.

관련 정보