奇妙な問題が発生しました。 IP アドレスを指定する VLAN インターフェイスで ping は機能しますが、インターフェイス名を指定すると機能しません。
システムはRocky Linux 8.5(4.18.0-348.el8.0.2.x86_64)を実行しています。ネットワークインターフェイスを接続し、レガシーネットワークスクリプトを使用して4つのブリッジインターフェイスを設定します(以下のスクリプトを参照)。
インターフェイス/ IPを指定せずに8.8.8.8にpingすると、すべてが期待どおりに機能します。を指定すると、br0
すべてが期待どおりに機能します。br1
、br2
またはを指定すると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が直接接続されていると想定しています(
tcpdump
8.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 インターフェイスのようなパス定義。それにもかかわらず、特にルーティングテーブルにパス不正が含まれている場合は、これを使用することをお勧めします。