マルチインターフェイスを使用したインターネットへのLinuxルーティング

マルチインターフェイスを使用したインターネットへのLinuxルーティング

私は3つのインターフェイスに接続されたラズベリーパイを持っていますが、私が達成しeth0たいのは、すべてのインターフェイスを介してインターネットへのパスを持つことですが、これまではwlan01つのパスだけを取得することです。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はインターネットへのパスを取得しません。言い換えれば、ローカルネットワークの外部にあるものをpingするために使用することはできません。理由を知っている人はいますか?アイデアが足りません。

答え1

まず:常に使用ip(8)代わりにコマンドを発行してください。routeLinuxコマンドの1つです。これは廃止予定の方法です。デフォルトでは、Linuxルーティングは他のオペレーティングシステムから移植されており、Linuxルーティングテーブル方式では使用できません(基本テーブルのみを表示)。

mainルーティングテーブルは常に暗黙的です。カーネルはまた、ルーティングする必要があるエントリを一致させる前に、テーブル(デフォルトではすべてのブロードキャスト、ローカルアドレス、およびループバックがある)を調べますmain。これはlocal、テーブルからルーティングするときにmain1つのデフォルトパスだけが他のパスよりも優先されるため、各インターフェイスにデフォルトパスを持つことができない理由です。どのテーブルがあるか見てください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つのケーブル/接続を同時に使用してリンクアグリゲーションを実行できます(bondLinuxのモードは4です)。

関連情報