Основной способ определить, где пакеты ядра - это таблица маршрутизации ( ip route
и другие), а не правила межсетевого экрана ( iptables
, nftables
). После того, как вы включили переадресацию IP с помощью net.ipv4.ip_forward = 1
, ядро будет обрабатывать входящие пакеты через таблицу маршрутизации и отправлять их обратно. Итак, если вы хотите, чтобы трафик на 10.0.0.2 проходил через eth0, независимо от того, откуда он пришел:
ip route add 10.0.0.2/32 dev eth0
Теперь, по умолчанию, когда ядро видит трафик, поступающий на eth0 и идущий обратно, то же самое, оно отправит перенаправление ICMP, чтобы сообщить исходной машине: «Эй, это неэффективно! отправьте его напрямую!» Вам нужно отключить это ( net.ipv4.conf.eth0.send_redirects = 0
). Он также проверяет исходный адрес, чтобы убедиться, что он пришел оттуда, где ожидал; вам может потребоваться отключить и это ( net.ipv4.conf.eth0.rp_filter = 0
).
Так как это происходит через механизм маршрутизации ядра, необходимые вещи, такие как уменьшение IP TTL, будут выполнены. Но такие вещи, как IP-адрес источника и назначения, не меняются.
Если вам нужно дополнительно изменить исходный или целевой IP-адреса, добавьте NAT поверх. Например, если вам нужен исходный IP-адрес для этой машины, вы можете добавить свой:
iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE
Обратите внимание, что если вы не изменили значение по умолчанию, FORWARD уже должен принять. Если нет, вы можете добавить свое правило (или, альтернативно, изменить значение по умолчанию).
Вы также можете изменить IP-адрес назначения при поступлении пакета, что изменит способ его маршрутизации (поскольку это изменение выполняется до того, как его увидит маршрутизация). Это выглядит так:
iptables -t nat -A PREROUTING -s 10.0.0.1 -j DNAT --to-dest 10.0.0.2
Обратите внимание, что вы не можете использовать здесь - out-interface
, потому что выходной интерфейс не известен до завершения маршрутизации. Вы можете использовать - внутри интерфейса
.
Вам также следует взглянуть на iperf3 и генератор пакетов .