Организация 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 </real_remote_ip></local_ip> |
Полный синтаксис для 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 для форвардинга и фильтрации, подразумевается что все необходимые настройки уже сделаны.