У меня Linux-машина с двумя сетевыми картами, мне нужно использовать одну для входящих пакетов, другую для исходящих пакетов.
1 ответ
Если вы согласитесь использовать один IP/ префикс на вашем компьютере (назовем его XXXX / Y, со шлюзом GGGG), то это можно сделать тривиально.
Добавьте свой адрес к
eth0
, но с полным префиксом подсети.например,
ip addr add X.X.X.X/32 dev eth0
Не устанавливайте адрес на eth1. Если он есть, очистите его с помощью
ip -4 addr flush dev eth1
Добавьте маршруты подсети и шлюза через
eth1
ip route add X.X.X.X/Y dev eth1
ip route add default via G.G.G.G dev eth1
Если вы используете Ubuntu или другие дистрибутивы Linux, которые по умолчанию включают фильтрацию обратного пути, отключите его, так как они предполагают и применяют симметричную маршрутизацию.
sysctl -w net.ipv4.conf.eth0.rp_filter = 0
sysctl -w net.ipv4.conf.eth1.rp_filter = 0
Если оба ваших сетевых интерфейса подключены к коммутатору, вам не нужно отвечать на ARP на eth1. Поскольку мы добавили IP-адрес к
eth0
, мы можем просто установитьarp_ignore
наeth1
равным 1 (только ARP для адресовeth1
) или 8 (ничего не отвечать).sysctl -w net.ipv4.conf.eth1.arp_ignore = 8
Как только эта конфигурация будет выполнена, будет только один трафик, который будет проходить в обратном порядке: если ядро получит запрос ARP для XXXX от eth0
, то оно ответит, используя eth0
.