попробуйте
#mark packets from 192.168.1.1 to 192.168.1.2
iptables -t mangle -I OUTPUT -s 192.168.1.1 -d 192.168.1.2 -j MARK --set-mark 11
#mark packets from 192.168.1.2 to 192.168.1.1
iptables -t mangle -I OUTPUT -s 192.168.1.2 -d 192.168.1.1 -j MARK --set-mark 12
#add routing table for 192.168.1.1
ip ru a fwmark 11 table 11
ip r a 192.168.1.2 dev eth0 t 11
#add routing table for 192.168.1.2
ip ru a fwmark 12 table 12
ip r a 192.168.1.1 dev eth1 t 12
man ip, man iptables для получения дополнительной информации
Использовать сетевые пространства имен. Это похоже на запуск виртуальной машины, но это не виртуальная машина, а просто нечто похожее на отдельный IP-стек.
ip netns add otherhost
ip netns exec otherhost /bin/bash
Это откроет оболочку в сетевом пространстве имен otherhost
. Если вы изучите конфигурацию сети в нем, вы увидите, что интерфейса нет. Это как если бы вы использовали другой хост.
Теперь переместите интерфейс eth1
в сетевое пространство имен otherhost
:
ip link set eth1 netns otherhost
Теперь otherhost
пространство имен имеет ваш интерфейс eth1
. Настройте его так, как если бы это был отдельный хост, и сделайте то же самое для eth0
в пространстве имен сети по умолчанию. Это так просто.
Обратите внимание, что если вы закроете всю свою оболочку на otherhost
, пространство имен сети исчезнет,
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
accept_local
- BOOLEAN Принимать пакеты с локальными адресами источника. В в сочетании с подходящей маршрутизацией, это может использоваться для направления пакетов между двумя локальными интерфейсами по сети и их принятие должным образом. по умолчанию FALSE
Использование sysctl -w net.ipv4.conf.eth0.accept_local = 1
Отправляет пакет по сети.