macos – OS Xで特定のインターフェイスを介してIPルートを指示する方法は?

macos routing

私はmacを使用していて、特定のアドレスをwifi接続の特定のゲートウェイにルーティングしようとしています

I’m using:

route add -host 54.81.143.201 192.168.15.1

うまくいく時もあれば、そうでない時もあります。私が見つけたのは、選択するインターフェースが毎回違うということです。動作するには en0 である必要があります

netstat -nrうまくいかないときに出力する

54.81.143.201      192.168.15.1       UGHS            1       89     en5

これが効く時です。(注 en0)

54.81.143.201      192.168.15.1       UGHS            0        1     en

なぜ私はこんなことをしているのか?私たちの会社は、HipChatが動作しないプロキシを持っているからです。だから、私はまだ私の仕事のイーサネット上にいる間、オープンwifiネットワークを介してヒップチャットのトラフィックをルーティングしています

EDIT:

インターフェースだけでエントリーを追加してみたりもしました

route add -host 54.81.143.201 -interface en0

54.81.143.201      78:31:c1:c7:52:74  UHS             0        2     en0

HipChat の接続に失敗しました

EDIT 2: 誰かが私のルーティングテーブル全体を要求してきたので、今日はここにあります。54.81.143.201はen0ではなくen3にバインドされていることに注意してください

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            10.7.90.1          UGSc           31        6     en3
10.7.90/24         link#4             UCS             4        0     en3
10.7.90.1          0:23:ac:3d:db:c2   UHLWIir        16        0     en3   1200
10.7.90.44         40:6c:8f:19:4a:bb  UHLWI           0        3     en3    946
10.7.90.63         127.0.0.1          UHS             0        0     lo0
54.81.143.201      192.168.15.1       UGHS            0        0     en3
127                127.0.0.1          UCS             0        0     lo0
127.0.0.1          127.0.0.1          UH              3      209     lo0
169.254            link#4             UCS             1        0     en3
169.254.255.255    0:23:ac:3d:db:c2   UHLSW           0        0     en3

  48  Sean256  2014-05-19


ベストアンサー

Try:

route add -host 54.81.143.201 -interface en0

43  drkblog  2014-05-19


他の方が指摘されているように、これは実は3つの問題があります

  1. 無線インターフェースがen0、en3、en5の間で変化しているようです

    私のMacBook Airでは、en0は常にワイヤレスで、Thunderbolt-to-Ethernetは常にen3、USB-to-Ethernetは常にen5です。しかし、Macの別のポートにアダプタを接続すると、そのNIC名が変わってしまいます。まずこれを解決する必要があります。ワイヤレスが常に同じ名前であることを確認してください。そうしないと、スタティックルートコマンドを入力したときに、en0の場所にNICが差し込まれていないと、コマンドは(明らかに)「アドレスエラー」(物理アドレスにリンクがない)で失敗します

    同様に、アダプタが常に同じSSIDに接続していることを確認してください。ゲートウェイアドレスは明らかにサブネットに対して有効でなければならず、WiFi ネットワークによって異なるサブネットを持つことになります。これは別のタイプのエラーを引き起こす可能性があります

    無線が唯一のネットワーク接続かどうかは明記していませんでしたね。上記のことを考えると、そうではないのかな…?これとVMwareやParallelsによる仮想ネットワークは、さらに複雑な状況を引き起こす可能性があります。(例えば、接続された両方のネットワークが同じIP空間を使用している場合など)仮想マシンはブリッジ化されていることが多く、独自の IP/ルート/リンクを持っていることが多いのですが….)ネットワークトポロジーを投稿すると便利です

  2. それが終わったら、sudo route add -host 54.81.143.201 -iface en0 または sudo ipfw を試してみてください。アダプタの名前がわからない場合は、次のように MAC アドレスを指定することもできます。sudo route add -host 54.81.143.201 -link 14:10:9f:e7:fd:0a

    関連しています。https://discussions.apple.com/thread/5049994?searchText=policy%20route

  3. 再起動してもこれが持続しない場合があります。別途対処が必要になります

4  Courtney Schwartz  2014-08-12


sudo route -n add -net 54.81.143.201/32 192.168.15.1

3  Muthukumar Anbalagan  2015-12-31


-linkオプションでMACアドレスを指定することで、インターフェイスをまたいでルートを追加することができました

route add -host 54.81.143.201 -link [mac addr of 192.168.15.1 on en0]

これは、適切なインタフェースから 54.81.143.201 のトラフィックを送信します

ホストアドレスは、それぞれのインターフェイスに2つの別々の192.168.15.*が割り当てられていますよね?そうでなければ、どちらのインターフェイスからもトラフィックを送ることができますが、トラフィックはどちらのソースIPからも戻ってきます

2  Nevin Williams  2014-05-20


このソリューションは、最新のMacOS 10.12 (Sierra)で動作します。以下は Gist です

#!/bin/bash

# NOTE: wifi network interface is: en1
wifi_router=192.168.200.1
wifi_address=en1:ec.35.86.4f.00.cc
TOADDR=`ifconfig en1 inet | sed -nl 's/\w*inet \([^ ]*\).*/\1/p'`
TO=`echo -n ${TOADDR//[[:space:]]}`

echo "ADDING ROUTE TO $1 VIA en1 (wi-fi): $TO"
route -n add -host $1 $wifi_router -ifp $wifi_address -ifa $TO -static

echo ""
echo "ROUTE ADDED:"
route get $1

こんな感じで使ってください

> sudo ./route_wifi.sh IP_ADDRESS

それは wifi インターフェイスが次のものであることを仮定します: en1

wifi_router と wifi_address 変数には正しい値を入れることを忘れないでください。wifi_address のフォーマットに注意してください。確かに必要な情報のほとんどは ifconfig コマンドの出力から解析することができますが、私はそれにはあまりにも怠惰です =)

2  Alexander Malkoff  2017-08-21


OS X の route コマンドは、こちら に文書化されています。-ifscope パラメータとその値を使うと、インターフェイス結合ルートを指定することができます

しかし、これはあなたが望むものではありません。ネットワークのIP範囲が一意になるように、ネットワークを修正する必要があります。それ以外では、インターフェイスのメトリクス(別名優先順位)は、そうでなければ同じように機会のあるオプションからどのインターフェイスを選択するかに影響を与えます

1  Daniel B  2014-05-19


ここでは、ユーザー定義の名前「Wi-Fi」を、MacOSがその時点で割り当てたデバイス名(例:en0, en1, en9, …)に翻訳する方法を紹介します

これらの関数は、特定のスクリプトに入れることもできますし、.bash_profileの中に入れておくこともできます

function get_srvc_name ()
{
cat <<EOF | scutil | \
grep 'UserDefinedName' | \
awk -F': ' '{print $2}'
show Setup:/Network/Service/$1
EOF
}

function get_srvc_ids ()
{
cat <<EOF | scutil | \
sed -nEe '
/ServiceOrder/ {
:ids
n
/[0-9]+ :/ {
s/ *[0-9]+ : ([0-9A-Z-]+) */\1/p
b ids
}
}'
show Setup:/Network/Global/IPv4
EOF
}

function get_srvc_id_by_name ()
{
local srvc_ids=$(get_srvc_ids)

for srvc_id in $srvc_ids
do
local srvc_name=$(get_srvc_name "$srvc_id")
if [[ "$srvc_name" == "$1" ]]
then
echo $srvc_id
return
fi
done
}

function get_int_name ()
{
local srvc_id=$(get_srvc_id_by_name "$1")

cat <<EOF | scutil | \
sed -nEe '
s/ *DeviceName : ([a-zA-Z0-9]+) */\1/p'
show Setup:/Network/Service/$srvc_id/Interface
EOF
}

そして、get_int_name 'Wi-Fi'を呼び出すだけで、割り当てられたデバイス名を取得することができます

For example:

route add -host 54.81.143.201 -interface $(get_int_name 'Wi-Fi')

0  parleer  2019-12-02


あなたが主張するサービス “HipChat “について話そうとしているベンダーサーバーは 54.81.143.201 ですね?この場合、54.81.143.0 255.255.255.255.0 のルーティング エントリを作成して、より広い範囲を指定します。ソフトウェアを使用している場合は、この特定のサーバではなく、同じサブネット54.81.143.0/24にある複数のサーバのクラスタと通信している可能性があります。さらに、新しいエントリを作成する際には、ルートメトリクスが正しいことを確認してください。54.81.143.0/24 192.168.15.1 メトリック 20 En5 へのルートを作成したが、0.0.0.0.0/0 10.7.90.1 メトリック 10 En0 へのルートも作成したとします。コンピュータはあなたの新しいエントリを無視して、デフォルトのルート (En0 を経由して) を経由してトラフィックをルーティングし続けます。私はちょうどこれを読み終えたところなので、その点を指摘したいと思いました。乾杯!

-1  KaneNFL443  2015-10-28


NIC名を入れてみてください

route add -net 10.13.0.0 netmask 255.255.0.0 dev NicNameHere

これはCentOSで動作します

-1  user220248  2014-05-19


タイトルとURLをコピーしました