どちらも同じように動作するシステムがいくつかあります。それぞれが2つの異なるサブネット上にインターフェースを持ち、それぞれがインターネットにアクセスできますが、ping-Iを使用できるのは一方のインターフェースのみです。たとえば、Debian8.11を実行しているLinuxボックス
/ etc/network/interfacesは次のとおりです。
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.94
netmask 255.255.255.0
gateway 192.168.0.1
# VLAN 782 'PUB', Public
auto eth0.782
iface eth0.782 inet static
address 192.168.2.94
netmask 255.255.255.0
と私のルーティングテーブル:
netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.782
私はできる:
root@pbx3:~# ping google.com
PING google.com (172.217.2.78) 56(84) bytes of data.
64 bytes from mia09s01-in-f14.1e100.net (172.217.2.78): icmp_seq=1 ttl=48 time=63.6 ms
私はできる:
ping -I eth0 google.com
PING google.com (172.217.2.78) from 192.168.0.94 eth0: 56(84) bytes of data.
64 bytes from ord08s13-in-f14.1e100.net (172.217.2.78): icmp_seq=1 ttl=48 time=70.2 ms
しかし、私はできません:
ping -I eth0.782 google.com
PING google.com (172.217.2.78) from 192.168.2.94 eth0.782: 56(84) bytes of data.
From 192.168.2.94 icmp_seq=1 Destination Host Unreachable
そのサブネット上のデバイスをnmapしてpingすることはできますが:
ping -I eth0.782 192.168.2.1
PING 192.168.2.1 (192.168.2.1) from 192.168.2.94 eth0.782: 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.385 ms
(別のシステム、eth0とeth1を使用するCentos 6.8でも同じ問題)
私の親友のグーグルは、これが私のルーティングテーブルと関係があるとほのめかしているようですが、何が悪いのか、またはそれを修正する方法を正確に見つけることができないようです。 192.168.2.1ゲートウェイをeth0.782ネットワークに追加しようとしましたが、eth0ネットワークが消えたため、明らかにゲートウェイは1つしかありません...
ヒントを事前に感謝します!
部分的な答え:
手始めに、サブネットのゲートウェイが必要です。 DHCPを機能させることができない場合は、今のところ手動で実行してください。
ip route add 192.168.2.0/24 via 192.168.2.1 dev eth0.782
(最初にゲートウェイのないルートを削除する必要がある場合があります。ゲートウェイのないルートを更新しようとしたことはありません。ip route
を使用してすべてのルートを取得し、次にip route del ...
を使用して前の手順の情報を使用して削除します。)
次に、ゲートウェイが正しく設定されていることをip route
(またはnetstat -rn
)で確認します。
次に、ping
を再試行します。インターフェイスにバインドすると、メインのルーティングテーブルが無視されるかどうかは実際にはわかりません。それが機能しない場合は、ポリシールーティングを使用して、送信元アドレスによって区別される2つのデフォルトルールを設定できます。
この設定を2つの異なるインターフェイスを介してインターネットにアクセスする方法として使用する場合:これは機能しません(FAQであり、毎週かそこらで誰かがこれの変形を試します)。
したがって、これが XY質問 であり、Xが「2つの異なる方法でインターネットにアクセスしたい」であり、Yが「デフォルトルートなしでpingしたい」である場合、次のようになります。 Xを詳しく説明する必要があります(たとえば、「使用するすべてのアプリケーションを特定のインターフェイスにバインドできるか」と「ネットワーク名前空間を使用しない理由」など)
編集
したがって、ユースケースが「他のLANの接続を確認し、結果に基づいて何かを行う」場合、おそらく最も簡単な方法は、別のネットワーク名前空間を作成し、それを/etc/netns/your_namespace/network/interfaces
(thisはip netns exec
の機能であり、それを読んでください)、inet dynamic
の代わりにinet static
を使用してDHCPアドレスとデフォルトルートを取得していることを確認してから、ip netns exec
を使用してこの名前空間でping
を実行します。
デフォルトルートの競合はなくなり、問題は解決しました。ネットワークの名前空間を確認する必要があります。こことunix.stackexchangeでたくさんの質問があります。
ポリシールーティングをping -I
バインディングと組み合わせることもできますが、特に2番目のインターフェイスにDHCP構成が必要な場合は、それがより困難になる可能性があります。
たぶんrp_filter
( https://www.theurbanpenguin.com/rp_filter-and-lpic-3-linux-security/ )に関連するものです。この設定では、送信元アドレスがルーティング可能でない場合(たとえば、発信インターフェイスにデフォルトのルールがない場合)、着信メッセージ(たとえば、ping応答)がドロップされる可能性があります。これは私のために働きます:
時間的変化:
echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter
恒久的な変更:/etc/sysctl.conf
を次のように編集します:
net.ipv4.conf.all.rp_filter=2
OK、それで私はそれをほとんどうまくいくようにしました、ヒントのためのdirktのおかげで、残念ながら私はあなたの答えを有用であるとマークするのに十分な評判を持っていません、ため息をつきます。まず、別のマシン(Debian9.9を実行しているRaspberryPi)を更新し、 https://www.sbprojects.net/projects/raspberrypi/vlan.php の指示に従うことから始めましたが、今では(例えば)
ping -I eth0.3750 google.com
または
traceroute -i eth0.3750 google.com
残念ながら、静的IPを設定すると機能しなくなりますが、eth0.3750を使用している場合はIPアドレスを知る必要がないので、十分に近いと思います。 FWIW、他のマシンは古く、適切なソフトウェアがすべて揃っていなかったため、RaspberryPiを使用するよりもアップグレード/更新の方が面倒でした。 8 *)