LINUX.ORG.RU
ФорумAdmin

Помогите настроить GRE туннель

 


0

1

Есть 2 сервера, расположенных в разных странах.

А ??.??.27.194

Б ??.??.216.226

А продакшн сервер с настройками

ip tunnel add gre1 mode gre remote ??.??.216.226 local ??.??.27.194 ttl 255
ip addr add 10.0.0.1/30 dev gre1
ip link set gre1 up

Б прокси сервер, используется для переброса трафика на сервер А

ip tunnel add gre1 mode gre remote ??.??.27.194 local ??.??.216.226 ttl 255
ip addr add 10.0.0.2/30 dev gre1
ip link set gre1 up

iptables -F
iptables -t nat -F
iptables -t nat -A PREROUTING -p tcp --dport 4600 -j DNAT --to-destination 10.0.0.1:4600
iptables -t nat -A POSTROUTING -j MASQUERADE

Все работает. Клиент подключается к 4600 пору на по адресу сервера Б ??.??.216.226 и весь трафик перебрасывается на сервер А.

Проблема в том, что мне нужно определять IP клиентов на сервере А, которые шлют трафик через сервер Б, а в логах я получаю только адрес туннеля.

tcpdump

01:23:32.051749 IP 10.0.0.2.52719 > 10.0.0.1.4600: Flags [S], seq 2197925176, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0

Мне нужно что-то вроде X-Forwarded-For в HTTP. Какие есть варианты?

Ответ на: комментарий от Anoxemian

Тогда ещё надо будет на стороне А сервера метить все соединения из тоннеля чтобы ответ шёл обратно через тоннель.

Пока писал заметил, что MASQUERADE правило слишком общее, по идее достаточно только для исходящего трафика

Flotsky ★★
()
Ответ на: комментарий от Flotsky
-- А 
ip tunnel del gre1
ip tunnel add gre1 mode gre remote ??.??.216.226 local ??.??.27.194 dev eno1
ip addr add 10.0.0.1 peer 10.0.0.2 dev gre1
ip link set gre1 up

-- Б
ip tunnel del gre1
ip tunnel add gre1 mode gre remote ??.??.27.194 local ??.??.216.226 dev eth0
ip addr add 10.0.0.2 peer 10.0.0.1 dev gre1
ip link set gre1 up

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

pingvinster
() автор топика
Ответ на: комментарий от ValdikSS

Зачем это правило?:

ip rule add to 10.0.0.1/32 table 1000
В обычной ситуации оно ни разу не сработает, пакеты на 10.0.0.1 найдут маршрут в таблице local, а если сделать, чтобы пакеты попадали в это правило, то они уйдут в gre-тунель, а не в сокет локальной программы...

И программа должна bind()’ится на 10.0.0.1.

У ТС'а просто tcp сервер слушает, ему не нужно про такое страшное знать :) Это если ТС уберёт и default таблице маршрут до 10.0.0.2, то тогда, чтобы его пингануть, нужно будет ″ping -I 10.0.0.1 10.0.0.2″.

Важнее проверть, что rp_filter выключен на gre-тунеле.

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

В обычной ситуации оно ни разу не сработает

Да, наверное, вы правы. Я мыслю транзитным трафиком.

У ТС’а просто tcp сервер слушает, ему не нужно про такое страшное знать :)

Без bind прослушивающего сокета на адрес не сработает: ответные пакеты в общем случае будут отправляться с IP-адреса и интерфейса default route main-таблицы. В линуксе же weak host model. Без bind у них будет src addr условно 0.0.0.0, а не тот, что попадает под rule.

Все проблемы можно элегантно решить bind’ом только на интерфейс (либо на адрес+интерфейс), это самый простой способ, не требующий раздельных таблиц маршрутизации и правил, но немногие программы это поддерживают, поэтому приходится городить.

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 1)
Ответ на: комментарий от ValdikSS

Да, наверное, вы правы. Я мыслю транзитным трафиком.

Хотя нет, я теперь сомневаюсь :D

Если не ошибаюсь, эта запись матчится, и как раз позволяет принимать пакеты без дополнительной настройки rp_filter (без его отключения). Но могу ошибаться, давно не проверял.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

src addr условно 0.0.0.0

Не помню такого. Демон, слушающий tcp 0.0.0.0 спокойно продолжал работать при PBR, ничего в коде менять не приходилось. Если бы udp, или если бы программа создавала соединение, то да, нужен bind() (указание src-адреса), а в случае ответа на tcp, ЕМНИП, автоматически src-адрес SYN-ACK пакета это dst SYN.

решить bind’ом только на интерфейс

Чего тут элегантного? Программа должна постоянно следить за списком интерфейсов.

mky ★★★★★
()