Ubuntu 18.04でWi-Fiよりイーサネットに優先順位を付ける方法は?

Ubuntu 18.04でWi-Fiよりイーサネットに優先順位を付ける方法は?

ターゲット

イーサネットケーブルを接続するときは、ワイヤレスよりイーサネットに優先順位を付けてください。

方法

多くのインターネット検索と読書の最後に、次のポイントに達しました。信じる私がしなければならないことは次のとおりです

nmcli connection modify [id-of-ethernet-interface] ipv4.route-metric 200
nmcli connection modify [id-of-ethernet-interface] ipv6.route-metric 200

ここで、200は、無線よりイーサネットに優先順位を与えるための無線メトリックより低い値である。

結果

私を混乱させることは、上記のコマンドを実行して再起動した後(良い測定のために)得られたレポートroute -nとこれが私の目標を達成できないようです。

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         123.456.89.1    0.0.0.0         UG    600    0        0 wlp1s0
0.0.0.0         123.456.89.1    0.0.0.0         UG    20200  0        0 enp0s31f6
123.456.89.0    0.0.0.0         255.255.255.192 U     200    0        0 enp0s31f6
123.456.89.0    0.0.0.0         255.255.255.192 U     600    0        0 wlp1s0
654.321.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s31f6

この数は私のコマンドの実行に関連していますが、

0.0.0.0         123.456.89.1    0.0.0.0         UG    20200  0        0 enp0s31f6
654.321.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s31f6

最初の行には、私が設定した200値の前に20のプレフィックスがあります。実行中の項目に基づいて指標値をnmcli500に変更すると、route -n20500が報告されます。なぜこれが起こるのですか? 20200や20500ではなく、200や500が欲しいと言ったので間違っているようです。

2行目には測定値があり、その値がどこから来たのか全くわからないし、まったく影響を及ぼすことができないようです。誰もがこれについて明らかにすることができれば幸いです。

これらのコマンドは、影響指標以外には実質的な結果を生成しないようです。イーサネットが優先順位かどうかわからないので、そうでないと仮定します。

その他の結果

気になって作業していると思います。一部程度は用途です$ sudo ifmetric enp0s31f6 200。これは二つか三つのことをします。

  • インターフェイスのメトリックに影響します(route -nIfaceがあるすべての行の200値を報告しますenp0s31f6)。
  • これはUbuntuのUIに影響します(右上隅には、コマンドに提供された指標の値に応じて、イーサネットとワイヤレスアイコンの間の視覚的な切り替えが表示されますifmetric)。
  • それ時々NETLINK: Error: File exists私にエラーが発生します。同じコマンドの後続実行可能または可能このエラーは発生しません

一部のシステム情報

  • エリートノートブック850 G5
  • Ubuntu18.04
  • Ubuntuのインストールは、インストーラがディスク全体を使用し、暗号化を有効にし、サードパーティのドライバのダウンロードを有効にするなどの方法で行われます。

アップデート#1

$ nmcli c show
NAME                UUID  TYPE      DEVICE    
Wired connection 2  [n/a] ethernet  enp0s31f6 
WiFi1               [n/a] wifi      wlp1s0

$ route -n
Destination     Gateway  Genmask         Flags Metric Ref    Use Iface
0.0.0.0         [n/a]    0.0.0.0         UG    600    0        0 wlp1s0
0.0.0.0         [n/a]    0.0.0.0         UG    20200  0        0 enp0s31f6
[n/a]           0.0.0.0  255.255.255.192 U     200    0        0 enp0s31f6
[n/a]           0.0.0.0  255.255.255.192 U     600    0        0 wlp1s0
[n/a]           0.0.0.0  255.255.0.0     U     1000   0        0 enp0s31f6

答え1

ここに多くの質問があります。

  • 有線LANと無線LANは同じサブネットのブリッジです。123.456.89.0/24
  • これらのネットワークに同時に接続すると、2つのデフォルトゲートウェイが発生します(これはいくつかの高度なルーティングで解決可能ですip rules)。
  • Wi-Fiと有線接続の間にブリッジがあるため、これらのゲートウェイのアドレスは同じです。

イーサネットに接続したときにWi-Fiを自動的に無効にするには、次のように外部スクリプトを使用する必要があります。

スクリプトを作成します/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh。コンテンツ:

#!/usr/bin/env bash

name_tag="wifi-wired-exclusive"
syslog_tag="$name_tag"
skip_filename="/etc/NetworkManager/.$name_tag"

if [ -f "$skip_filename" ]; then
  exit 0
fi

interface="$1"
iface_mode="$2"
iface_type=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f2)
iface_state=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f3)

logger -i -t "$syslog_tag" "Interface: $interface = $iface_state ($iface_type) is $iface_mode"

enable_wifi() {
   logger -i -t "$syslog_tag" "Interface $interface ($iface_type) is down, enabling wifi ..."
   nmcli radio wifi on
}

disable_wifi() {
   logger -i -t "$syslog_tag" "Disabling wifi, ethernet connection detected."
   nmcli radio wifi off
}

if [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "down" ]; then
  enable_wifi
elif [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "up"  ] && [ "$iface_state" = "connected" ]; then
  disable_wifi
fi

スクリプトを無効にするには、次を実行します。touch /etc/NetworkManager/.wifi-wired-exclusive

答え2

これは、メトリックに20000を追加してアクセスできないと見なす接続にペナルティを与えるNetworkManagerだと思います。 ~からNetworkManager.conf マニュアル:

グローバル接続のないデバイスのデフォルトルートは、ルート指標+20000でペナルティを受けます。

ソリューション1

オプションにコメントを付けるか、空白のままにuri=して接続確認を無効にできますNetworkManager.conf

ソリューション2

net.ipv4.conf.all.rp_filter = 2に設定します/etc/sysctl.conf。気をつける情報漏えいの脆弱性がある可能性があります

背景

これNetworkManager.conf マニュアル接続確認が失敗する可能性がある理由の簡単な説明があります。

ディストリビューションで/proc/sys/net/ipv4/conf/*/rp_filterが次のように設定されている可能性があります。厳格なフィルタリング。 SO_BINDDEVICE を使用してすべてのデバイスに要求を送信するデバイス固有の接続確認には正しく機能しません。厳密なrp_filter設定はすべての応答を拒否し、最良のパスを除くすべての接続確認に失敗します。

私のディストリビューションでは厳密なフィルタリングが有効になっています。

$ /usr/sbin/sysctl net.ipv4.conf.all.rp_filter
net.ipv4.conf.all.rp_filter = 1

価値は1意味する厳格なフィルタリングこれが接続確認に失敗する理由です。システムの人々はそれを2(緩いフィルタリング)に変更しました。議論の余地のある提出紹介した抜け穴したがって、ディストリビューションによって復元されます。

関連情報