
Возможно ли в Linux направлять все запросы на определенный IP через виртуальный интерфейс, чтобы на другом конце они отображались с другим IP-адресом, нежели основной хост? Предположим, что eth0
у него IP-адрес 1.1.1.1, а eth0:1
у него адрес 1.1.1.2. Как сделать так, чтобы все запросы на 1.2.3.4 отображались как поступающие с eth0:1
? Я пробую следующее, но это, похоже, не работает:
route add 1.2.3.4 dev eth0:1
решение1
Да.
Одним из способов сделать это было бы использование IPTABLES для перезаписи пакетов, покидающих машину с несколькими IP-адресами, чтобы они указывали, что они приходят с виртуального интерфейса. Попробуйте
/sbin/iptables -t nat -I POSTROUTING -d DEST.IP -j SNAT --to VIRTUAL.IP
(Разумеется, вам необходимо настроить виртуальный IP-адрес так, как вы задумали, т. е. eth0:1 или эквивалент должен существовать, чтобы трафик мог вернуться на машину)
решение2
Возможно, необходимо использовать команду
ip route add 1.2.3.4 dev eth0:1 src 1.1.1.2
или маршрут с похожей опцией. Если это не работает так, как ожидалось, вам может потребоваться расширенная маршрутизация: создайте дополнительную таблицу маршрутизации для этой цели в /etc/iproute2/rt_tables, поместите указанную выше запись как единственную в эту таблицу и активируйте эту таблицу:
ip rule add to 1.2.3.4 priority 100 table to__1_2_3_4
ip route flush cache
Последним отчаянным решением будет netfilter: вы можете использовать SNAT с iptables в цепочке POSTROUTING, чтобы переписать исходный адрес для пакетов, направляемых в этот пункт назначения.