私は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つの問題があります
無線インターフェースがen0、en3、en5の間で変化しているようです
私のMacBook Airでは、en0は常にワイヤレスで、Thunderbolt-to-Ethernetは常にen3、USB-to-Ethernetは常にen5です。しかし、Macの別のポートにアダプタを接続すると、そのNIC名が変わってしまいます。まずこれを解決する必要があります。ワイヤレスが常に同じ名前であることを確認してください。そうしないと、スタティックルートコマンドを入力したときに、
en0
の場所にNICが差し込まれていないと、コマンドは(明らかに)「アドレスエラー」(物理アドレスにリンクがない)で失敗します同様に、アダプタが常に同じSSIDに接続していることを確認してください。ゲートウェイアドレスは明らかにサブネットに対して有効でなければならず、WiFi ネットワークによって異なるサブネットを持つことになります。これは別のタイプのエラーを引き起こす可能性があります
無線が唯一のネットワーク接続かどうかは明記していませんでしたね。上記のことを考えると、そうではないのかな…?これとVMwareやParallelsによる仮想ネットワークは、さらに複雑な状況を引き起こす可能性があります。(例えば、接続された両方のネットワークが同じIP空間を使用している場合など)仮想マシンはブリッジ化されていることが多く、独自の IP/ルート/リンクを持っていることが多いのですが….)ネットワークトポロジーを投稿すると便利です
それが終わったら、
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
再起動してもこれが持続しない場合があります。別途対処が必要になります
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