다중 인터페이스를 사용하여 인터넷으로 Linux 라우팅

다중 인터페이스를 사용하여 인터넷으로 Linux 라우팅

나는 세 개의 인터페이스에 연결된 라즈베리 파이를 가지고 있는데, eth0내가 달성하고 싶은 것은 모든 인터페이스를 통해 인터넷에 대한 경로를 갖는 것이지만 지금까지는 wlan0하나의 경로만 얻는 것입니다.ppp0eth0ppp0

route -n다음은 and의 출력 입니다 ip route show(현재 사용할 수 있는 ppp0 인터페이스는 없지만 작동한다는 것을 알고 있습니다).

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.39
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.243

/etc/dhcp/dhclient-exit-hooks.d/인터페이스가 dhcp로부터 견적을 받으면 트리거되는 스크립트를 작성했습니다.

#!/bin/bash

calculateCIDR() {
    nbits=0
    IFS=.
    for dec in $1 ; do
        case $dec in
            255) let nbits+=8;;
            254) let nbits+=7;;
            252) let nbits+=6;;
            248) let nbits+=5;;
            240) let nbits+=4;;
            224) let nbits+=3;;
            192) let nbits+=2;;
            128) let nbits+=1;;
            0);;
            *) 
                echo "Error calulating CIDR exiting."; 
                exit 1
            ;;
        esac
    done
    echo $nbits
}

calculateSubnet() {
    IFS=. read -r i1 i2 i3 i4 <<< $1
    IFS=. read -r m1 m2 m3 m4 <<< $2
    echo "$((i1 & m1)).$((i2 & m2)).$((i3 & m3)).$((i4 & m4))"
}

# check if all parameters are there
# expected parameters 
# $1 = iface
# $2 = ip
# $3 = mask
# $4 = gateway
if [ $# -ne 4 ]
  then
    echo "Illegal number of arguments"
    exit 2
fi

# assign variables
IFACE=$1
IP=$2
MASK=$3
GATEWAY=$4

# extract inface number and calculate table number 
case $IFACE in
    eth*)
        TABLEID=$(( 10 + `echo $IFACE | grep -o -E '[0-9]+'`))
        METRIC=0
    ;;
    wlan*)
        TABLEID=$(( 30 + `echo $IFACE | grep -o -E '[0-9]+'`))
        METRIC=$(( 50 + `echo $IFACE | grep -o -E '[0-9]+'`))
    ;;
    ppp*)
        TABLEID=$(( 90 + `echo $IFACE | grep -o -E '[0-9]+'`))
        METRIC=$(( 100 + `echo $IFACE | grep -o -E '[0-9]+'`))
    ;;
    *)
        echo "Bad interface exiting"
        exit 1
    ;;
esac

# create new table for interface only if not existing there already
grep -q -F "$TABLEID $IFACE" /etc/iproute2/rt_tables || echo "$TABLEID $IFACE" >> /etc/iproute2/rt_tables

# remove previous rules
while ip rule delete table $IFACE 2>/dev/null; do true; done

# flush previous table
ip route flush table $IFACE

# calculate CIDR from
CIDR=$(calculateCIDR $MASK)

# calculate subnet address
SUBNET=$(calculateSubnet $IP $MASK)

# create route for local network
ip route add $SUBNET/$CIDR dev $IFACE src $IP metric $METRIC table $IFACE

# create route for internet
ip route add default via $GATEWAY dev $IFACE metric $METRIC table $IFACE

# set rules for the interface
ip rule add from $IP/32 table $IFACE
ip rule add to $IP/32 table $IFACE

# done 
exit 0

이 동일한 스크립트는 네트워크 설정에서 제공되는 모든 인터페이스에 사용됩니다. wlan0은 인터넷으로의 경로를 얻지 못합니다. 즉, 로컬 네트워크 외부의 어떤 것도 핑하는 데 사용할 수 없습니다. 이유를 아는 사람 있나요? 아이디어가 부족해요.

답변1

첫째: 항상 사용ip(8)대신 명령을 내리세요. routeLinux 명령 중 하나입니다.이것은 더 이상 사용되지 않는 방법입니다. 기본적으로 Linux 라우팅은 다른 운영 체제에서 포팅되었으며 Linux 라우팅 테이블 방식과 함께 사용할 수 없습니다(기본 테이블만 표시).

main라우팅 테이블은 항상 암시적입니다. 커널은 또한 라우팅해야 하는 항목을 일치시키기 전에 테이블(기본적으로 모든 브로드캐스트, 로컬 주소 및 루프백이 있음)을 살펴봅니다 main. 이것이 local테이블에서 라우팅할 때 main하나의 기본 경로만이 다른 경로보다 우선하기 때문에 각 인터페이스에 기본 경로를 가질 수 없는 이유입니다. 어떤 테이블이 있는지 살펴보세요 ip rule list.

기본 중복성을 구성하기 위해 수행해야 할 작업은 다음과 같습니다.

  • 2개의 규칙(예: link01"link02")과 해당 라우팅 테이블을 만듭니다.
  • 테이블의 기본 경로를 비워 둡니다 main.
  • 테이블에 대한 기본 경로 link01와 테이블에 대한 또 다른 기본 경로를 만듭니다 link02.
  • 이러한 테이블에 대한 규칙을 만들거나 iptables각 테이블을 일치시킬 때 규칙을 만듭니다.
  • Wi-Fi 및 케이블 연결을 위해 별도의 네트워크 IP 범위를 만듭니다.

현재 설정에 문제가 있습니다. main동일한 게이트웨이 및 동일한 테이블( )에서 다른 인터페이스에 대한 기본 경로를 반복하고 있습니다(기본 경로를 두 번째로 추가하려고 하면 "경로가 이미 존재합니다" 오류가 발생할 수 있음). . 이런 일은 결코 일어나지 않을 것입니다. arp는 2개의 인터페이스에 동시에 게시되는 동일한 IP를 어떻게 처리해야 합니까?

대체 솔루션:

위에 나열된 항목을 변경하지 않고도 활성 백업 솔루션과 같은 일부 중복성을 원하는 경우,당신이 사용할 수있는결합된 인터페이스는 모드 1로 구성됩니다., eth0그리고 wlan0노예로서. 이것은데비안 예따라서 /etc/network/interfaces배포판에 맞게 조정해야 합니다.

# Slaves   
auto eth0
iface eth0 inet manual
    bond-master bond0
    bond-primary eth0
    bond-mode active-backup

auto wlan0
iface wlan0 inet manual
    wpa-conf /etc/network/wpa.conf
    bond-master bond0
    bond-primary eth0
    bond-mode active-backup

# Master
auto bond0
iface bond0 inet dhcp
    bond-slaves none
    bond-primary eth0
    bond-mode active-backup
    bond-miimon 100

이렇게 하면 케이블과 Wi-Fi를 통해 연결되며 두 가지 모두에 대해 "통합" IP 주소를 갖게 됩니다.

LACP(IEEE 802.3ad)를 수행할 수 있는 중급/고급 네트워크 스위치가 있는 경우 두 개의 케이블/연결을 동시에 사용하여 링크 집계를 수행할 수 있습니다( bondLinux의 모드는 4임).

관련 정보