Замена сервера. Эмуляция интернет-сервера.

Замена сервера. Эмуляция интернет-сервера.

У меня есть две сети, последовательные сети, обе скрыты под собственным 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?

решение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 loopback в уже связанном ответе:

    # 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-ed и DNAT-ed правильно, потому что первый пакет был.


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

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, а не вернется к вам.

решение2

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

[email protected]# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan

и на сервере:

[email protected]# ip link add name s666 type dummy
[email protected]# ifconfig s666 66.66.66.66
[email protected]# ifconfig s666 up

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