私は3つのインターフェイスに接続されたラズベリーパイを持っていますが、私が達成しeth0
たいのは、すべてのインターフェイスを介してインターネットへのパスを持つことですが、これまではwlan0
1つのパスだけを取得することです。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はインターネットへのパスを取得しません。言い換えれば、ローカルネットワークの外部にあるものをpingするために使用することはできません。理由を知っている人はいますか?アイデアが足りません。
答え1
まず:常に使用ip(8)
代わりにコマンドを発行してください。route
Linuxコマンドの1つです。これは廃止予定の方法です。デフォルトでは、Linuxルーティングは他のオペレーティングシステムから移植されており、Linuxルーティングテーブル方式では使用できません(基本テーブルのみを表示)。
main
ルーティングテーブルは常に暗黙的です。カーネルはまた、ルーティングする必要があるエントリを一致させる前に、テーブル(デフォルトではすべてのブロードキャスト、ローカルアドレス、およびループバックがある)を調べますmain
。これはlocal
、テーブルからルーティングするときにmain
1つのデフォルトパスだけが他のパスよりも優先されるため、各インターフェイスにデフォルトパスを持つことができない理由です。どのテーブルがあるか見てくださいip rule list
。
基本的な冗長性を構成するために実行する必要がある作業は次のとおりです。
- 2つのルール(例:
link01
"link02")と対応するルーティングテーブルを作成します。 - テーブルのデフォルトパスを空白のままにします
main
。 - テーブルへのデフォルトパス
link01
とテーブルへの別のデフォルトパスを作成しますlink02
。 - これらのテーブルのルールを作成するとき、または
iptables
各テーブルを一致させるときにルールを作成します。 - Wi-Fiとケーブル接続用に別々のネットワークIP範囲を作成します。
現在の設定に問題があります。main
同じゲートウェイと同じテーブル()で異なるインターフェイスへのデフォルトパスを繰り返しています(デフォルトパスを2番目に追加しようとすると、「パスがすでに存在しています」エラーが発生する可能性があります)。 。これは決して起こらないでしょう。 arpは2つのインターフェイスに同時に公開される同じIPをどのように処理する必要がありますか?
代替ソリューション:
上記の項目を変更しなくても、アクティブなバックアップソリューションなど、いくつかの冗長性が必要な場合、あなたが利用できる結合されたインターフェースはモード1で構成されています。、eth0
そしてwlan0
奴隷として。これはDebian はいしたがって、/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)を実行できる中級/上級ネットワークスイッチがある場合は、2つのケーブル/接続を同時に使用してリンクアグリゲーションを実行できます(bond
Linuxのモードは4です)。