インターフェイス名を指定すると、VLAN ブリッジインターフェイスの Ping が失敗し、IP アドレッシングが期待どおりに機能します。

インターフェイス名を指定すると、VLAN ブリッジインターフェイスの Ping が失敗し、IP アドレッシングが期待どおりに機能します。

奇妙な問題が発生しました。 IP アドレスを指定する VLAN インターフェイスで ping は機能しますが、インターフェイス名を指定すると機能しません。

システムはRocky Linux 8.5(4.18.0-348.el8.0.2.x86_64)を実行しています。ネットワークインターフェイスを接続し、レガシーネットワークスクリプトを使用して4つのブリッジインターフェイスを設定します(以下のスクリプトを参照)。

インターフェイス/ IPを指定せずに8.8.8.8にpingすると、すべてが期待どおりに機能します。を指定すると、br0すべてが期待どおりに機能します。br1br2またはを指定するとbr3応答を受け取りません。br1などに関連付けられたIPアドレスを指定すると、期待どおりに機能します。

ping出力

# PING WORKS
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=104 ms
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 104.224/104.224/104.224/0.000 ms

# PING WORKS
$ ping -I br0 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.3.15.22 br0: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=101 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=101 ms

# PING FAILS
$ ping -I br1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.4.15.22 br1: 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2031ms

# PING WORKS
$ ping -I 10.4.15.22 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.4.15.22 : 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=4.72 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=4.65 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=4.65 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 4.645/4.672/4.721/0.065 ms

以下の出力からわかるように、ip addrインターフェイスbr1のIPアドレスは10.4.15.22です。今回もルーティングテーブルvlan4を使用するように設定されており、それに関連する正しいルールがあります。

出力は以下から来ます。ip addr show

# ip addr show
3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq master br0 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.3.15.22/16 brd 10.3.255.255 scope global br0
       valid_lft forever preferred_lft forever
7: eno1.4@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue master br1 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
8: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.4.15.22/16 brd 10.4.255.255 scope global br1
       valid_lft forever preferred_lft forever
9: eno1.5@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue master br2 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
10: br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.5.15.22/16 brd 10.5.255.255 scope global br2
       valid_lft forever preferred_lft forever
11: eno1.6@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue master br3 state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
12: br3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether 00:25:90:8e:b4:98 brd ff:ff:ff:ff:ff:ff
    inet 10.6.15.22/16 brd 10.6.255.255 scope global br3
       valid_lft forever preferred_lft forever

システム構成/ネットワークスクリプト

$ cat /etc/sysconfig/network-scripts/ifcfg-eno1
TYPE=Ethernet
BOOTPROTO=none
DEVICE=eno1
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
MTU=9000

$ cat /etc/sysconfig/network-scripts/ifcfg-eno1.4 
DEVICE=eno1.4
BRIDGE=br1
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
MTU=9000
VLAN=yes

$ cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=10.3.15.22
GATEWAY=10.3.0.1
DNS1=10.3.0.1
NETMASK=255.255.0.0
ONBOOT=yes
NM_CONTROLLED=no
DEFROUTE=yes

$ cat /etc/sysconfig/network-scripts/ifcfg-br1
DEVICE=br1
IPADDR=10.4.15.22
GATEWAY=10.4.0.1
DNS1=10.4.0.1
DEFROUTE=no
TYPE=Bridge
BOOTPROTO=static
NETMASK=255.255.0.0
ONBOOT=yes
NM_CONTROLLED=no

$ cat /etc/sysconfig/network-scripts/route-br1 
10.4.0.0/16 dev br1 src 10.4.15.22 table vlan4
default via 10.4.0.1 dev br1 table vlan4

$ cat /etc/sysconfig/network-scripts/rule-br1 
from 10.4.15.22/32 table vlan4
to 10.4.15.22/32 table vlan4

/etc/iproute2/rt_tables

$ cat /etc/iproute2/rt_tables
3 vlan3
4 vlan4
5 vlan5
6 vlan6

ip routeそしてip rule出力

$ ip route show
default via 10.3.0.1 dev br0 
10.3.0.0/16 dev br0 proto kernel scope link src 10.3.15.22 
10.4.0.0/16 dev br1 proto kernel scope link src 10.4.15.22 
10.5.0.0/16 dev br2 proto kernel scope link src 10.5.15.22 
10.6.0.0/16 dev br3 proto kernel scope link src 10.6.15.22 
169.254.0.0/16 dev br0 scope link metric 1006 
169.254.0.0/16 dev br1 scope link metric 1008 
169.254.0.0/16 dev br2 scope link metric 1010 
169.254.0.0/16 dev br3 scope link metric 1012

$ ip route show table vlan4
default via 10.4.0.1 dev br1 
10.4.0.0/16 dev br1 scope link src 10.4.15.22

$ ip rule
0:  from all lookup local
32758:  from all to 10.6.15.22 lookup vlan6
32759:  from 10.6.15.22 lookup vlan6
32760:  from all to 10.5.15.22 lookup vlan5
32761:  from 10.5.15.22 lookup vlan5
32762:  from all to 10.4.15.22 lookup vlan4
32763:  from 10.4.15.22 lookup vlan4
32764:  from all to 10.3.15.22 lookup vlan3
32765:  from 10.3.15.22 lookup vlan3
32766:  from all lookup main
32767:  from all lookup default

ベストアンサー1

バインドされたインターフェイスのルーティングルールを使用したフルパステーブルの選択SO_BINDTODEVICE、キーワードを含むルールoif以下も使用する必要があります。

oif 名前

一致する送信デバイスを選択します。発信インターフェイスは、デバイスにバインドされたローカルソケットから発生するパケットに対してのみ機能します。

INADDR_ANYそれ以外の場合、最初のルックアップ中にソースアドレスが指定されていない場合、クエリは正しいソースIPアドレス(プロンプトソースなどのアルゴリズムなど)を計算する前に、デフォルト値(つまり0.0.0.0/0)をソースセレクタとして使用します。 。追加されたルーティングルールは他のすべてのテーブルと一致しないため、INADDR_ANYすべての追加テーブルをスキップし、最終的に次のものを使用します。基本br0結合デバイス用の追加のフィルタを持つルートテーブル:デフォルトルートが定義されていないため、ベーステーブルにもデフォルトルートがない限り、ゲートウェイは不十分です。

したがって、次のコマンドを追加する必要があります。各行は独自の/etc/sysconfig/network-scripts/rule-brXファイルになければなりません(マイナス記号ip rule add )。

ip rule add oif br0 lookup 3
ip rule add oif br1 lookup 4
ip rule add oif br2 lookup 5
ip rule add oif br3 lookup 6

インターフェイスにバインドするときは、適切なルートテーブルを検索して、各場合に正しいゲートウェイを提供します。


すべてのカーネル評価は次のように確認できます。ip route get:

ip route get

単一パスのインポート

このコマンドはターゲットへの単一パスを使用し、カーネルが表示するものと正確にその内容を印刷します。

ルールを添付する前に

  • br0

    対称性のために、次のルーティングテーブルもあると仮定します(しかしそれは問題ではありません:基本ルーティングテーブルで十分ですbr0.):

    default via 10.3.0.1 dev br0 table 3 
    10.3.0.0/16 dev br0 table 3 scope link src 10.3.15.22 
    
    
    # ip route get from 10.3.15.22 to 8.8.8.8
    8.8.8.8 from 10.3.15.22 via 10.3.0.1 dev br0 table 3 uid 0 
        cache 
    # ip route get oif br0 to 8.8.8.8
    8.8.8.8 via 10.3.0.1 dev br0 src 10.3.15.22 uid 0 
        cache 
    

    2番目のケースでは、ソースアドレスを選択せず​​にインターフェイスにのみバインドするときにプライマリテーブルが使用されますが、プライマリテーブルにもプライマリパスがあるため、これはまだ正確ですbr0。動作します。

  • br1

    # ip route get from 10.4.15.22 to 8.8.8.8
    8.8.8.8 from 10.4.15.22 via 10.4.0.1 dev br1 table 4 uid 0 
        cache 
    # ip route get oif br1 to 8.8.8.8
    8.8.8.8 dev br1 src 10.4.15.22 uid 0 
        cache 
    

    2番目のケースではゲートウェイが定義されていないため基本表は、そのパスがゲートウェイを使用せず、インターフェイスが必須であるため、8.8.8.8が直接接続されていると想定しています(tcpdump8.8.8.8に対して発行されたARPクエリがある場合に表示される場合があります)。

    これはうまくいきません。

インターフェイスケースの追加ルールをバインドした後

  • br0

    # ip route get oif br0 to 8.8.8.8
    8.8.8.8 via 10.3.0.1 dev br0 table 3 src 10.3.15.22 uid 0 
        cache 
    

    全体的な結果は同じですが動作しますが、今回は追加のテーブルが必要です。

  • br1

    # ip route get oif br1 to 8.8.8.8
    8.8.8.8 via 10.4.0.1 dev br1 table 4 src 10.4.15.22 uid 0 
        cache 
    

    今回は、oif br1セレクタが正しいゲートウェイで正しいデフォルトパスを定義するルートテーブル4を選択します。動作します。


注:L3インターフェースにも同様の設定を使用してください(WireGuardやOpenVPNなどのVPNインターフェースなど)。トゥエンモード)は、L3インターフェイスにゲートウェイが必要ないため、これを必要としません(定義されていてもIPの下に確認するL2レイヤがないため使用されません)。したがって、バインド時に送信されるトラフィックには特定のゲートウェイは必要ありません。この L3 インターフェイスのようなパス定義。それにもかかわらず、特にルーティングテーブルにパス不正が含まれている場合は、これを使用することをお勧めします。

おすすめ記事