イーサネット経由であるネットワークに接続され、Wi-Fi経由で別のネットワークに接続されたデバイスがあります。私はnetctlを使ってインターフェースを管理します。両方の netctl プロファイルが有効な場合、設定は次のようになります。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether b8:27:eb:eb:ab:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/21 brd 192.168.7.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::ba27:ebff:feeb:abdc/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether b8:27:eb:be:fe:89 brd ff:ff:ff:ff:ff:ff
inet 10.10.0.89/23 brd 10.10.1.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 fe80::ba27:ebff:febe:fe89/64 scope link
valid_lft forever preferred_lft forever
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.10.0.1 0.0.0.0 UG 303 0 0 wlan0
10.10.0.0 0.0.0.0 255.255.254.0 U 303 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.248.0 U 0 0 0 eth0
両方のnetctlプロファイルが有効になっている場合、イーサネットインターフェイスを指定するとホスト(google.com)に正常にpingを送信できますが、wifiインターフェイスを指定するとpingが失敗することがわかりました。
$ ping -c4 -Ieth0 google.com
PING google.com (74.125.136.100) from 192.168.1.200 eth0: 56(84) bytes of data.
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=1 ttl=44 time=21.4 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=2 ttl=44 time=21.3 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=3 ttl=44 time=21.10 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=4 ttl=44 time=37.1 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 21.317/25.440/37.086/6.729 ms
$ ping -c4 -Iwlan0 google.com
PING google.com (74.125.136.138) from 10.10.0.89 wlan0: 56(84) bytes of data.
--- google.com ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 154ms
この動作を見てEthernetケーブルを外してみましたが、まだwlan0でpingを実行できず、eth0がIPアドレス、ゲートウェイなどを保持していることがわかりました。変更される唯一のことは、代わりstate DOWN
に報告することですstate UP
。
それから私はnetctl stop my-ethernet-profile
走った。実際に実際にプロフィールを停止するにはできるwlan0で正常にpingを送信しました。したがって、ICMP は wlan0 でブロックされません。 eth0のプロファイルが実際に停止した場合、すべてが大丈夫に見えます。ただし、実行中はそうではありません(インターフェースに関係なくUP
)DOWN
。
だから私はいくつかを理解しようとしています。
- 両方のデバイスが接続されている場合(より正確には、両方のnetctlプロファイルが有効になっている場合)、Wi-Fi pingが失敗するのはなぜですか?
- イーサネットインターフェイスが接続されていないことを認識しても、システムが設定を維持するのはなぜですか?
- インターフェイスがダウンしたときにプロファイルを停止するようにnetctlを設定する方法はありますか?
- 状態がから切り替えられたときに任意の
UP
スクリプトを実行する方法はありますかDOWN
?たとえば、netctl stop my-ethernet-profile
ケーブルを外した状態で走らなければならない場合はどうなりますか?
最後に、ボンディングされたインターフェイスまたはWiFiフェイルオーバーを実行する方法があることを知っていますが、これは特定の用途に当てはまります。私は車輪を再発明するように聞こえるかもしれませんが、そこにはそのような理由があります。
答え1
私はそれに慣れていませんが、netctl
基本的な問題は、カーネルルーティングテーブルが2つのデフォルトゲートウェイを指定するという事実に関連しています。
両方のデバイスが接続されている場合(より正確には、両方のnetctlプロファイルが有効になっている場合)、Wi-Fi pingが失敗するのはなぜですか?
この問題は、2つのデフォルトゲートウェイを含むルーティングテーブルが原因で発生します。
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.10.0.1 0.0.0.0 UG 303 0 0 wlan0
パスが競合している場合(この2つの場合のように)、カーネルは「メトリック」が最も低いパス(この場合は値が「0」のeth0)を選択するか、最初のパスが追加されたと思います。
pingを送る理由リモートホスト例では、ワイヤレスインターフェイスを指定するときに失敗した場合、カーネルがping -Iwlan0
指定したインターフェイスを使用してそのリモートホストにルーティングする方法を知らない可能性があります。技術的には、デフォルトゲートウェイ(メトリックが最も低い)は次のように到達するためです。別のインターフェース。これらのpingはビットバケットに入る可能性が高いです。
冗長性
一方または他方が中断された場合に備えて冗長インターネットを探している場合は、次のように独自のシェルスクリプトを作成することをお勧めします。
- デフォルトゲートウェイインターフェイスにトラフィックが流れない場合の検出
- デフォルトのGWの新しいインターフェイスを使用するようにカーネルルーティングテーブルを変更します。
- プライマリインターフェイスでトラフィックを監視します(UPホストとリモートホストに到達可能)。
- ルーティングテーブルをプライマリインターフェイスとして再設定します。
注:netctlの設定ワイヤレスフェイルオーバーへの有線接続基本レイヤ 1 接続(ケーブルの分離または WiFi AP オフ)を保証する場合に便利ですが、通常、両方のインターフェイスは同じネットワーク上にあり、デフォルトでは同じゲートウェイからインターネットを受信する必要があります。
インターフェイスがダウンしたときにプロファイルを停止するようにnetctlを設定する方法はありますか?
私はpreupとpredownディレクティブを使ってこれを行うことができると思います。
ExecUpPost='ifconfig wlan0 down|| true'
ExecDownPre='ifconfig wlan0 up|| true'
/etc/netctl/hooks/
マニュアルを確認してください。