Иногда возникает ситуация, при которой необходимо иметь следующую схему сети:
Что имеем? Есть два 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 в дополнение ко всему вышенаписанному.
Сука!
Бля, как это понять?