Организация proxy через GRE

Необходимо организовать виртуальную частную сеть через интернет с перенаправлением HTTP/HTTPS трафика через один прокси сервер.

Схема сети выглядит следующим образом

+---------+
| server_1|
| 1.1.1.1 |-------+
+---------+       |
+---------+       |      +--------+
| server_2|-------+------|  proxy |
| 2.2.2.2 |              | z.z.z.z|
+---------+       |      +--------+
+---------+       |
| server_n|-------+
| n.n.n.n |
+---------+

Все сервера имеют одну сетевую карту (eth0) с реальным IP адресом. Все запросы HTTP/HTTPS на/с сервера server_n должны перенаправляться на proxy сервер и маскироваться его адресом.

Первым делом необходимо включить маршрутизацию пакетов на всех серверах

sysctl -w net.ipv4.ip_forward=1

или через файл /etc/sysctl.conf

На всех серверах поднимем виртуальный интерфейс gre

ip tunnel add mgre0 mode gre key 0xfffffffe ttl 255
ip addr add 10.0.0.x/24 dev mgre0
ip link set mgre0 up

Присвоим proxy серверу адрес 10.0.0.250, остальным серверам 10.0.0.1, 10.0.0.2 и т.д.
После назначения адреса серверам необходимо указать соседей с которыми они будут связаны а одну виртуальную сеть.

Это делается командой

ip neigh add <local_ip> lladdr <real_remote_ip> dev mgre0

Полный синтаксис для server_n будет таким

ip tunnel add mgre0 mode gre key 0xfffffffe ttl 255
ip addr add 10.0.0.x/24 dev mgre0
ip neigh add 10.0.0.250 lladdr z.z.z.z dev mgre0
ip link set mgre0 up

На proxy

ip tunnel add mgre0 mode gre key 0xfffffffe ttl 255
ip addr add 10.0.0.250/24 dev mgre0
ip neigh add 10.0.0.1 lladdr 1.1.1.1 dev mgre0
ip neigh add 10.0.0.2 lladdr 2.2.2.2 dev mgre0
ip neigh add 10.0.0.n lladdr n.n.n.n dev mgre0
ip link set mgre0 up

После выполнения всех команд сервера будут доступны друг для друга по внутренним адресам 10.0.0.x

Теперь необходимо настроить маршрутизацию и фильтрацию пакетов на server_n.

Маркируем все пакеты HTTP/HTTPS через iptables

iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-xmark 0x1/0xffffffff

И добавляем для этих пакетов правило маршрутизации

ip rule add from all fwmark 0x1 table http.out
ip route add default via 10.0.0.1 dev mgre0 table http.out

Предварительно добавив таблицу http.out в /etc/iproute2/rt_tables

echo 200 http.out >> /etc/iproute2/rt_tables

Чтобы не настраивать маршрутизацию на proxy на каждом server_n добавим правило маскарадинга

iptables -t nat -A POSTROUTING -o mgre0 -j MASQUERADE

Для финальной настройки необходимо добавить правило маскарадинга на proxy, оно аналогично правилу на server_n, но в качестве исходящего интерфейса используется физический интерфейс eth

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Для теста схемы возможно потребуется отключить параметр Reverse Path Filtering. Принцип функционирования rp_filter:
если ответ на текущий пакет не может уйти через тот же интерфейс (когда приходит через один интерфейс, а уходит через другой), пакет отфильтровывается.

Отключение выполняется командой на server_n

sysctl -w net.ipv4.conf.all.rp_filter=0

Важное замечание — gre не шифрует трафик, а только организует виртуальную сеть, т.е. существует возможность перехвата и модификация пакетов. Для шифрования необходимо использовать IPSEC.

Так же в статье не рассматривается настройка iptables для форвардинга и фильтрации, подразумевается что все необходимые настройки уже сделаны.

Комментарии запрещены.