перехватывать IP-пакеты, когда шлюз не является маршрутизатором провайдера

перехватывать IP-пакеты, когда шлюз не является маршрутизатором провайдера

В моей домашней сети следующая топология

          Internet
              |
     wifi     |
C ----------- A ---------- B

где

  • A (статический IP 192.168.0.254) — это маршрутизатор/точка доступа, предоставленная моим интернет-провайдером.
  • B (статический IP 192.168.0.1) — это Linux-машина, работающая как локальный DNS- и DHCP-сервер (работающий под управлением dnsmasq)
  • C — любой клиент, подключающийся к точке доступа и настроенный по DHCP.

На данный момент шлюзом по умолчанию, предоставляемым B (как DHCP-сервер), является просто A.

Затем предположим, что я хочу перехватить в B весь трафик, поступающий от любого клиента C. Вот что я сделал в B:

  1. активировать IP-пересылку с помощью

    # sysctl net.ipv4.ip_forward=1"
    
  2. поставлять B как шлюз. Конечно, B сам использует A как свой собственный шлюз

  3. запустите tcpdump на B, чтобы увидеть, что происходит

На клиенте C я запускаю любой запрос, например

$ traceroute www.google.com

Теперь я ожидаю, что трафик, исходящий из C, будет направлен в B, затем в A и, наконец, в Интернет.

Что работает.C может выйти в интернет

Что не работает.За исключением первого запроса, похоже, что B полностью обойден: tcpdump ничего не показывает; адрес B не отображается в выводе traceroute. Тем не менее, я уверен, что перенаправление происходит, поскольку C отключается от интернета, если я отключаю IP-пересылку на B.

Если происходит короткое замыкание, как его избежать?

Отказ от ответственности: Я знаю, что изменение топологии сети может решить проблему «перехвата всего трафика» (например, путем зеркалирования портов и т. д.), но я действительно хочу понять, что происходит с моей настройкой и как это исправить, не меняя топологию.

решение1

Вам нужно, чтобы хост B выполнил трансляции NAT, чтобы A не видел тот же пакет снова. Вместо этого B должен отправлять пакеты через A, как будто они исходят от B. Чтобы добиться этого, вы добавляете правило iptablesследующим образом:

# iptables -t nat -A POSTROUTING -s ip-of-C -j MASQUERADE

Согласно этому правилу, все пакеты, исходящие из B, будут перезаписаны так, как будто они исходят из B, но с сохранением таблицы обратных переводов, чтобы соответствующие ответы можно было обратно перевести и отправить в C.

Обратите внимание на -s ...часть, которая ограничивает применение правила только к пакетам, полученным из C (или он может быть установлен как локальная локальная сеть), а не, например, к ответным пакетам.

EDIT (принимая во внимание комментарий @theuncle): Объяснение того, почему это не работает без NAT, заключается в том, что хост B понимает, что пакет приходит и уходит без изменений через один и тот же интерфейс, поэтому он может улучшить сетевое взаимодействие, указав C напрямую обращаться к A для соответствующего трафика.

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