Iptables и подмена ip?
Ну что, у меня получилось так сделать. Рассказываю.

Пусть у нас есть локалка, которая получает в интернет доступ через роутер.
на роутере два интерфейса:

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.
У вас на роутере линукс или просто роутер железка с вебинтерфейсом?