나는 세 개의 인터페이스에 연결된 라즈베리 파이를 가지고 있는데, eth0
내가 달성하고 싶은 것은 모든 인터페이스를 통해 인터넷에 대한 경로를 갖는 것이지만 지금까지는 wlan0
하나의 경로만 얻는 것입니다.ppp0
eth0
ppp0
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)
대신 명령을 내리세요. route
Linux 명령 중 하나입니다.이것은 더 이상 사용되지 않는 방법입니다. 기본적으로 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)를 수행할 수 있는 중급/고급 네트워크 스위치가 있는 경우 두 개의 케이블/연결을 동시에 사용하여 링크 집계를 수행할 수 있습니다( bond
Linux의 모드는 4임).