
В моей домашней сети следующая топология
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:
активировать IP-пересылку с помощью
# sysctl net.ipv4.ip_forward=1"
поставлять B как шлюз. Конечно, B сам использует A как свой собственный шлюз
- запустите 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 для соответствующего трафика.