У меня есть компьютер (под управлением Linux) с двумя интерфейсами Ethernet. Я хочу протестировать их без подключения другого ПК.
Установка:
(192.168.1.5) eth1-------.
Linux PC/device | loopback cable
(192.168.1.6) eth2-------'
я бегу
ping -I eth1 192.168.1.6
но ответа не последовало.
Я не понимаю, в чем проблема. Почему Linux не позволяет это сделать? Как решить эту проблему?
решение1
Почему?
Я не могу полностью объяснить.
Как я могу решить эту проблему?
ОбычноLinux достигает локально назначенных IP-адресов внутрии это просто работает. Похоже, проблема возникает, когда действительно нужно, чтобы пакеты передавались наружу (например, по кабелю) и обратно – как в вашем случае.
Вы можете заставить это работать, используя сетевые пространства имен. Я отрегулировалэтот другой мой ответв соответствии с вашими потребностями.
Примечания:
- Я тестировал на Debian 10.
- Где находится команда,
ip …
вам, вероятно, понадобитсяsudo ip …
. Для удобства чтения я опускаюsudo
. Работайте в оболочке с повышенными правами или (временно) определите,alias ip='sudo ip'
чтобы иметь возможность удобно копировать-вставлять. - Я предполагаю, что никакая автоматизация не вмешивается, т.е. нет демона, который пытался бы настроить соответствующие интерфейсы по-своему.
- Для запуска команды в нестандартном сетевом пространстве имен я использую
ip netns exec …
. Таким образом можно запустить оболочку; тогда все, что вы запускаете из оболочки, будет использовать сетевое пространство имен. Этот ответ используетip netns exec …
каждый раз, когда нам нужно запустить что-то в нестандартном сетевом пространстве имен.
Действуйте следующим образом:
Определите полезные переменные. Вот
ns1
произвольное имя для пространства имен;eth1
иeth2
устройства, которые вы хотите использовать.netns=ns1 dev1=eth1 dev2=eth2
Создайте новое сетевое пространство имен.
ip netns add "$netns"
Переведите устройства в пространство имен по умолчанию.
ip link set dev "$dev1" down ip link set dev "$dev2" down
Добавьте одно из устройств в новое пространство имен (оно исчезнет из пространства имен по умолчанию). Здесь я выбираю переход
$dev2
в новое пространство имен.ip link set dev "$dev2" netns "$netns"
Назначьте IP-адреса.
ip address add 192.168.1.5/24 dev "$dev1" ip netns exec "$netns" ip address add 192.168.1.6/24 dev "$dev2"
Убедитесь, что оба устройства находятся там, где им положено быть, и имеют правильные IP-адреса.
ip address show ip netns exec "$netns" ip address show # examine output
Физически соедините два интерфейса кабелем, если это еще не сделано.
Поднимите интерфейсы. Пространство имен содержит собственное устройство обратной связи
lo
. Я поднимаю его на всякий случай, потому что в целом программы могут захотеть положиться на него.ip link set dev "$dev1" up ip netns exec "$netns" ip link set dev "$dev2" up ip netns exec "$netns" ip link set dev lo up
Проверьте маршруты. В моем Debian 10 нормальных маршрутов появляются автоматически. Эта команда
ip route show
отпечатки (среди прочих строк)
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.5
и эта команда
ip netns exec "$netns" ip route show
отпечатки
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.6
Пинг в одну или другую сторону.
ping 192.168.1.6 ip netns exec "$netns" ping 192.168.1.5
Вы можете использовать
-I
, но это не обязательно. Адрес192.168.1.6
не назначен ни одному интерфейсу в сетевом пространстве имен по умолчанию; и192.168.1.5
не назначен в нестандартном пространстве имен.
И это оно. Это должно работать. Мои тесты показывают, что эти ping
s действительно используют кабель. Я могу сказать, потому что:
- при отключении кабеля они прекращают передаваться; для сравнения: «внутренние» пинги (от проводного интерфейса до его собственного IP-адреса) передаются даже без кабеля;
iptraf-ng
мониторинг пингуемого интерфейса показывает эхо-запросы ICMP и эхо-ответы ICMP; для сравнения: инструмент не показывает «внутренние» пинги для проводного интерфейса.
Базовая очистка: удаление сетевого пространства имен.
ip netns del "$netns"
Это вернет второе устройство в сетевое пространство имен по умолчанию.
Ни одна из использованных нами команд не вносит постоянных изменений, поэтому в случае возникновения каких-либо проблем просто перезагрузите систему.