Iptables и подмена ip?

Доброго времени суток, Хабр!

Никто не подскажет как реализовать с помощью iptables подмену ip? А то установил привязку по ip и теперь нужно как-то решить проблему.


Суть задачи такова: имеется роутер и компьютер за роутером, необходимо подключиться к нему из-вне так, чтобы компьютер по ту сторону роутера думал, что подключение произошло от локального ip. Мой компьютер никак не связан с роутером, доступ к роутеру только удалённый.
  • Вопрос задан
  • 16754 просмотра
Решения вопроса 1
merlin-vrn
@merlin-vrn
Ну что, у меня получилось так сделать. Рассказываю.

Пусть у нас есть локалка, которая получает в интернет доступ через роутер.
на роутере два интерфейса:
  • eth0 — интернет, имеет адрес 192.0.2.55/24 (такой адрес выдал провайдер, у провайдера шлюз 192.0.2.1)
  • eth1 — локалка, имеет адрес 192.168.1.1/24 (так было по умолчанию. менять не стали.) — серый


Роутер делает трансляцию адресов (белый адрес только у него). На нём есть маршруты:
192.168.1.0/24 dev eth1 src 192.168.1.1
192.0.2.0/24 dev eth0 src 192.0.2.55
default via 192.0.2.1

и одно правило трансляции (это всё, что нужно для того, чтобы интернет появился в локалке): либо так
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

либо так
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 192.0.2.55


В локалке есть компьютер, скажем, с адресом
192.168.1.22/24

и маршрутами
192.168.1.0/24 dev eth0 src 192.168.1.22
default via 192.168.1.1

и на нём работает интернет.

Мы хотим подключиться к компьютеру с адреса 192.0.2.66 (извне) так, чтобы компьютер думал, будто мы на самом деле подключаемся с 192.168.1.77.

На роутере добавляем трансляцию назначения:
iptables -t nat -A PREROUTING -s 192.0.2.66 -i eth0 -j DNAT --to-destination 192.168.1.22

чтобы все пакеты с нужного адреса завернуть на компьютер (а были они направлены роутеру, которому не нужны)

iptables -t filter -A FORWARD -s 192.0.2.66 -d 192.168.1.22 -j ACCEPT

чтобы разрешить прохождение всех таких пакетов

iptables -t nat -A POSTROUTING -s 192.0.2.66 -j SNAT --to-source 192.168.1.77

чтобы адрес источника в пакетах заменять на поддельный.

С точки зрения компьютера, 192.168.1.77 находится в локалке, ему не нужен роутер, чтобы послать туда пакет. Поэтому ответов мы не увидим — всё закончится тем, что компьютер получит приветственный пакет извне с нужными нам адресами и начнёт искать (arp who-has) на какой физический адрес отправлять ответы. Поскольку такого физического адреса нет, то ему никто и не ответит.

Решить эту проблему можно двумя способами. Либо можно назначить этот адрес роутеру: (на роутере)
ip addr add 192.168.1.77/24 dev eth1

теперь у роутера два адреса. Когда компьютер будет искать, кому бы отправить ответ, отзовётся роутер. Пакет подхватится conntrackом, будут сделаны обратные преобразования адресов и ответ пойдёт куда надо.

Либо можно сказать компьютеру, чтобы он конкретно до этого адреса ходил через роутер: (на компьютере)
ip route add 192.168.1.77 via 192.168.1.1

Есть и кардинальное решение. Пусть поддельный адрес будет в другой сети, не в локалке: 192.168.2.77/24; тогда никаких дополнительных проблем решать не придётся, а на роутере просто изменится аргумент в последнем --to-source.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
icoz
@icoz
Допустим, что на роутере 2 интерфейса следующего вида:
eth0 — интернет, имеет адрес ****/24 — неважно
eth1 — локалка, имеет адрес 192.168.1.1/24
Удаленный комп имеет адрес 1.2.3.4
Локальный комп имеет адрес 192.168.1.22
Локальный виртуальный комп имеет адрес 192.168.1.77

Сперва надо добавить дополнительный адрес к eth1, который будет обслуживать роутер:
ip addr add 192.168.1.77/24 dev eth1
или
ifconfig eth1 add 192.168.1.77

Роутинг от удаленного к локальному:
iptables -t nat -A PREROUTING -s 1.2.3.4 -i eth0 -j DNAT --to-destination 192.168.1.22
iptables -t filter -A FORWARD -s 1.2.3.4 -d 192.168.1.22 -j ACCEPT
iptables -t nat -A POSTROUTING -s 1.2.3.4 -j SNAT --to-source 192.168.1.77

Роутинг к удаленному от локального:
iptables -t nat -A PREROUTING -d 192.168.1.77 -i eth1 -j DNAT --to-destination 1.2.3.4
iptables -t filter -A FORWARD -d 1.2.3.4 -s 192.168.1.22 -j ACCEPT
POSTROUTING — не нужен, ибо и так есть NAT, настроенный самим роутером

ИМХО, должно так работать. Если что — пишите какие ошибки, будем разбираться.
Ответ написан
Ingtar
@Ingtar
Насколько я знаю, это делается функцией SNAT (source NAT) в цепочке prerouting таблицы nat
Ответ написан
Ingtar
@Ingtar
Возможно так:
-A POSTROUTING -d IP_роутера/32 -j SNAT --to-source НУЖНЫЙ_IP
Ответ написан
Комментировать
icoz
@icoz
Эх. Придётся чуть подождать. Щас накидаю примерно.
Ответ написан
icoz
@icoz
Только у удаленного компа айпи белый?
Ответ написан
opium
@opium
Просто люблю качественно работать
У вас на роутере линукс или просто роутер железка с вебинтерфейсом?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы