Иногда возникает ситуация, при которой необходимо иметь следующую схему сети:

Форвардинг IP-адреса

Что имеем? Есть два Linux-сервера. Первый имеет два сетевых интерфейса, один “смотрит” в интернет, на нём повешен “белый” IP-адрес (например, 128.0.1.20). Второй интерфейс соединен шнуром с интерфейсом второго сервера. При этом, на интерфейс второго сервера повешен “белый” IP-адрес. Задача — сделать второй сервер доступным извне по его белому адресу.Для этого необходимо дать второму интерфейсу локальный IP-адрес, например, 192.168.0.1. Диапазон 192.168.0.0/16 — общепринятый для локальных сетей. На первом интерфейсе второго сервера необходимо назначить в качестве шлюза адрес 192.168.0.1 (адрес второго интерфейса первого сервера). Теперь, возвращаемся к первому серверу. Необходимо включить две вещи. Первая — форвардинг IP:

echo 1 | tee /proc/sys/net/ipv4/ip_forward

…и вторая — Proxy ARP:

echo 1 | tee /proc/sys/net/ipv4/conf/eth0/proxy_arp

Теперь пропишем маршрут:

route add -net 128.0.0.23 netmask 255.255.255.255 dev eth1

Маршрут прописывается на интерфейс, который соединен со вторым сервером.

Замечу, что, в случае, если первый сервер был перезагружен, настройки форвардинга сбросятся. Чтобы форвардинг работал всегда, нужно раскомментировать/дописать в файле /etc/sysctl.conf следующее:

net.ipv4.ip_forward=1
net.ipv4.conf.default.proxy_arp=1

Во всей этой красоте спрятался еще один нюанс. Если сменить IP-адрес второго интерфейса первого сервера на “белый”, поменять маршрут для него, изменить шлюз на этот же адрес в настройках сети второго сервера, то извне станет доступен не только второй сервер, но и второй сетевой интерфейс первого сервера. В любом случае, если требуется контролировать форвардинг пакетов, стоит воспользоваться iptables в дополнение ко всему вышенаписанному.