Перенаправление трафика loopback через маршрутизатор

Для некоторых целей тестирования я запускаю несколько приложений на основе сокетов на одном компьютере и хочу имитировать «реальные» сетевые условия между ними. Я думал, что самым простым было бы перенаправить весь трафик между приложениями через маршрутизатор, к которому подключен мой компьютер. Интуитивно это должно работать более или менее подобно нескольким компьютерам, подключенным к одной и той же сети, а сама сеть должна быть ограничена возможностями маршрутизатора (100 Мбит / с), а не локальными межсетевыми соединениями.

Моя машина (192.168.1.101) подключается непосредственно к маршрутизатору (192.168.1.2) через интерфейс em1 . Я попытался сделать это, добавив ip-маршрут. Результатом моей команды ip route является:

 default via 192.168.1.2 dev em1 proto static metric 1024 192.168.1.0/24 dev em1 proto kernel scope link src 192.168.1.101 192.168.1.101 via 192.168.1.2 dev em1 

Это, однако, похоже, не имеет никакого эффекта, поскольку pinging localhost возвращает более или менее те же результаты, что и pinging my machine (192.168.1.101), что составляет около 0,040 мс. В то же время, pinging другой машины в моей сети приводит к pings около 0.3-0.5ms.

Я пробовал traceroute, вот что я получаю:

 $traceroute 192.168.1.200 # my other computer traceroute to 192.168.1.200 (192.168.1.200), 30 hops max, 60 byte packets 1 192.168.1.200 (192.168.1.200) 1.005 ms 0.972 ms 0.954 ms $traceroute 192.168.1.101 traceroute to 192.168.1.101 (192.168.1.101), 30 hops max, 60 byte packets 1 localhost.localdomain (192.168.1.101) 0.051 ms 0.014 ms 0.013 ms $traceroute 127.0.0.1 traceroute to 127.0.0.1 (127.0.0.1), 30 hops max, 60 byte packets 1 localhost.localdomain (127.0.0.1) 0.053 ms 0.015 ms 0.013 ms 

Я что-то упускаю, или, может быть, я делаю это совершенно неправильно?

  • Блокировать все интернет-соединения, если они не подключены к серверу OpenVPN
  • Настройка OpenVPN для использования Firewalld вместо iptables на Centos 7
  • Модуль iptables не загружен после обновления Ubuntu с 14.04 по 16.04
  • Необычное поведение в iptables
  • Значение записей журнала из конфигурации iptables
  • Команда IPtables показывает, что libipt_random.so отсутствует
  • Как заблокировать SSH Brute Force через Iptables и как это работает?
  • Перенаправление трафика DNS для определенного домена
  • 2 Solutions collect form web for “Перенаправление трафика loopback через маршрутизатор”

    Проблема в том, что у вас есть маршрут в вашей local таблице, где говорится:

     $ ip route show table local [...] local 192.168.1.101 dev eth0 scope host [...] 

    При отправке пакета с [src = 192.168.1.101 dst = 192.168.1.101] и ожидая, что маршрутизатор отправит отраженный пакет обратно (некоторые откажутся от такого рода вещей), вы хотите, чтобы исходящий пакет пропустил этот маршрут, но а не возвращение пакета.

    Для этого вы можете изменить rules ip :

    Удалите правило catch-all для local таблицы.

     # ip rule del from all table local 

    И замените его на тот, который не делает этого для пакетов 192.168.1.101-> 192.168.1.101:

     # ip rule add not from 192.168.1.101 to 192.168.1.101 table local pref 0 

    Затем отметьте входящие пакеты netfilter:

     # iptables -t mangle -I PREROUTING -s 192.168.1.101 -d 192.168.1.101 -j MARK --set-mark 1 

    И скажите правилу ip, чтобы использовать только local таблицу:

     # ip rule add fwmark 1 table local pref 1 

    (конечно, вам также понадобится ваш ip route add to 192.168.1.101 via 192.168.1.2 в свою main таблицу)

    Вот несколько решений, которые могут ввести латентность, переупорядочивание пакетов и падение пакетов на * BSD и Linux.

    1. Использование netfilter для имитации потери пакетов

    2. Использование tc и netem для введения задержек и потерь

    3. В FreeBSD используйте dummynet . Вот вступительное слово .

    Linux и Unix - лучшая ОС в мире.