Пинг одного интерфейса с другого, тот же хост

Пинг одного интерфейса с другого, тот же хост

У меня есть компьютер (под управлением 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 …каждый раз, когда нам нужно запустить что-то в нестандартном сетевом пространстве имен.

Действуйте следующим образом:

  1. Определите полезные переменные. Вот ns1произвольное имя для пространства имен; eth1и eth2устройства, которые вы хотите использовать.

    netns=ns1
    dev1=eth1
    dev2=eth2
    
  2. Создайте новое сетевое пространство имен.

    ip netns add "$netns"
    
  3. Переведите устройства в пространство имен по умолчанию.

    ip link set dev "$dev1" down
    ip link set dev "$dev2" down
    
  4. Добавьте одно из устройств в новое пространство имен (оно исчезнет из пространства имен по умолчанию). Здесь я выбираю переход $dev2в новое пространство имен.

    ip link set dev "$dev2" netns "$netns"
    
  5. Назначьте 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"
    
  6. Убедитесь, что оба устройства находятся там, где им положено быть, и имеют правильные IP-адреса.

                           ip address show
    ip netns exec "$netns" ip address show
    # examine output
    
  7. Физически соедините два интерфейса кабелем, если это еще не сделано.

  8. Поднимите интерфейсы. Пространство имен содержит собственное устройство обратной связи 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
    
  9. Проверьте маршруты. В моем 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
    
  10. Пинг в одну или другую сторону.

                           ping 192.168.1.6
    ip netns exec "$netns" ping 192.168.1.5
    

    Вы можете использовать -I, но это не обязательно. Адрес 192.168.1.6не назначен ни одному интерфейсу в сетевом пространстве имен по умолчанию; и 192.168.1.5не назначен в нестандартном пространстве имен.

И это оно. Это должно работать. Мои тесты показывают, что эти pings действительно используют кабель. Я могу сказать, потому что:

  • при отключении кабеля они прекращают передаваться; для сравнения: «внутренние» пинги (от проводного интерфейса до его собственного IP-адреса) передаются даже без кабеля;
  • iptraf-ngмониторинг пингуемого интерфейса показывает эхо-запросы ICMP и эхо-ответы ICMP; для сравнения: инструмент не показывает «внутренние» пинги для проводного интерфейса.

Базовая очистка: удаление сетевого пространства имен.

ip netns del "$netns"

Это вернет второе устройство в сетевое пространство имен по умолчанию.

Ни одна из использованных нами команд не вносит постоянных изменений, поэтому в случае возникновения каких-либо проблем просто перезагрузите систему.

Связанный контент