У меня есть две сети последовательных сетей, обе скрыты под собственным NAT 192.168.31.0/24 -> 192.168.33.0/24 -> Интернет

У меня TCP-сервер на 192.168.33.35 и клиент на 192.168.31.32

Например, клиент выполняет TCP-запрос к серверу, расположенному в Интернете по адресу 66.66.66.66 . Я хочу, чтобы последний шлюз 192.168.33.1 отправил запрос на 192.168.33.35 и обманул клиента.

Наиболее выполнимым из того, что я попробовал, является:

iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66

Сервер получил пакет Syn и ответил. Но исходный IP-адрес ответа сервера, по-видимому, остается 192.168.33.35 после прохождения шлюза. И пакет теряется, полученный шлюзом 192.168.31.1 .

Похоже, часть SNAT не работает.

Что я могу сделать, чтобы эмулировать / подделать сервер стандартными инструментами openWrt?

2 ответа2

1

Вот что происходит:

  1. Ваш сервер 192.168.33.35 видит пакет Syn от 192.168.33.Z (он не знает о сети 192.168.31.0/24 и видит адрес "WAN" шлюза 192.168.31.1 , я не знаю, что такое Z ) и отвечает на этот адрес.
  2. В его таблице маршрутизации указано, что этот адрес принадлежит локальной сети, поэтому ответ предназначен для MAC-адреса 192.168.33.Z
  3. Даже если ответ физически проходит через компьютер 192.168.33.1 , шлюз с ним не работает, поскольку он предназначен для MAC-адреса другого компьютера.
  4. 192.168.33.Z видит ответ от 192.168.33.35 . Он ожидает от 66.66.66.66 и не знает, что делать.

Обратите внимание, что это не имеет значения 192.168.33.Z выполняет NAT (будучи 192.168.31.1 на его стороне LAN). Механизм сбоя очень похож на тот, где петля NAT (шпилька NAT) настроена только частично.

Вы должны сделать так, чтобы ваш сервер 192.168.33.35 отправлял ответы на MAC-адрес вашего шлюза 192.168.33.1 .

  • Либо установите правило маршрутизации для 192.168.33.Z (помните, я не знаю Z , вы понимаете; подставьте действительное число) или даже для всей сети 192.168.33.0/24 :

    # do this on the 192.168.33.35 machine
    route add -host 192.168.33.Z gw 192.168.33.1
    

    Обратите внимание, что это повлияет на все коммуникации с 192.168.33.35 до 192.168.33.Z В случаях, когда 192.168.33.35 должен действовать как 192.168.33.35 пакеты будут излишне маршрутизироваться; это не должно ломать вещи все же.

  • Или пусть шлюз 192.168.33.1 выполняет не только DNAT, но и SNAT. Это решение в основном совпадает с решением для обратной петли NAT в уже связанном ответе:

    # do this on the 192.168.33.1 gateway
    # you already have this line
    iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
    # this line is new
    iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
    

Этот фрагмент относится к вашей ситуации:

Обратите внимание, что таблица NAT в iptables используется только для первого пакета соединения. Более поздние пакеты, связанные с соединением, обрабатываются с использованием внутренних таблиц сопоставления, установленных при преобразовании первого пакета.

Это означает, что вторая из ваших строк (iptables … -j SNAT --to-source 66.66.66.66) не имеет значения, когда вы инициируете соединение от клиента. Более поздние пакеты будут обрабатываться SNAT и DNAT правильно, потому что первый пакет был.


Я думаю, если ваша первая строка

iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35

действовал на шлюзе 192.168.31.1 , он будет делать то, что вы хотите для других клиентов с 192.168.31.0/24 без каких-либо дополнительных уловок.


Это ваша вторая строка

iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66

будет применяться, если вы инициируете соединение с 192.168.33.35 . Интернет-серверы редко делают это, поэтому вам может не понадобиться это правило вообще. Если вам это нужно, помните, что:

  • правило будет работать только в том случае, если пакеты маршрутизируются через шлюз 192.168.33.1 котором действует это правило, поэтому для доступа к локальным компьютерам и представления их как 66.66.66.66 необходимо настроить таблицу маршрутизации на компьютере 192.168.33.35 же, как выше;
  • вы не можете общаться как 66.66.66.66 с внешними хостами (за пределами вашей сети), потому что даже если вам удастся связаться с ними, действующими как 66.66.66.66 , их ответ получит реальный 66.66.66.66 , а не вам.
0

Сделал это с маршрутизацией. К сожалению, он менее гибок для доступа к реальному серверу, но, по крайней мере, работает. Что-то вроде этого:

root@192.168.33.1# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan

и на сервере:

user@192.168.33.35# ip link add name s666 type dummy
user@192.168.33.35# ifconfig s666 66.66.66.66
user@192.168.33.35# ifconfig s666 up

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .