LINUX.ORG.RU
ФорумAdmin

IPIP туннелирование. Проксирование трафика с eth интерфейса на туннельный интерфейс


0

1

Собственно установил туннель между двумя серверами с помощью IPIP

ip tunnel add tunnel1 mode ipip remote 2.2.2.2 local 1.1.1.1 ttl 250

ip link set tunnel1 up
ip addr add 10.0.0.1/30 dev tunnel1

ip route add default via 10.0.0.2 dev tunnel1 tab 0
ip rule add from 10.0.0.1/32 tab 0 prio 5

(Использовал инструкцию)

С сервера 10.0.0.1 - 10.0.0.2 пингуется.
Нужно, чтобы трафик при подключении к серверу 1.1.1.1 на порт 3306 с интерфейса eth0 «перекидывался» на tunnel1, 2.2.2.2 отвечал, и он возвращался обратно с tunnel1 на eth0.

IPtables PREROUTING и POSTROUTING пробовал. Возможно ошибся, вот правила (устанавливал только на 1.1.1.1):

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3306 -j DNAT --to 10.0.0.2:3306
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -d 10.0.0.2 -j SNAT --to 1.1.1.1
iptables -A FORWARD -s 1.1.1.0/24 -d 10.0.0.2 -i eth0 -o eth0 -p tcp --dport 3306 -j ACCEPT
iptables -t nat -A POSTROUTING -s 1.1.1.0/24 -j MASQUERADE

ip route:

root@ds3309:~# ip route
default via 1.1.1.1 dev eth0
10.0.0.0/30 dev tunnel1 proto kernel scope link src 10.0.0.1
1.1.1.0/24 dev eth0 proto kernel scope link src 1.1.1.1



P.s кто не понял, за 1.1.1.1 скрывается IP адрес первого сервера, а за 2.2.2.2 - второго (на который должен приходить трафик с первого и возвращаться на него же).


Дело достаточно срочное, прошу помочь.

Заранее спасибо.

Не проще поставить какой-нибудь TCP прокси аля HAProxy?

blind_oracle ★★★★★ ()

Может я чего не понял, но ведь у вас интерфейс называется tunnel1, почему вы пишете правила, как будто трафик идёт с eth0 на eth0, а не c eth0 на tunnel1 и обратно?

mky ★★★★★ ()

Вам нужен PBR с классикакацией по L4(номеру порту).

iptables <классификация_трафика_для_отправки_в_тунлей> -j MARK МЕТКА ip rule add fwmark МЕТКА lookup RT_RUN

RT_TUN это таблица роутинга, создаётся её в /etc/iproute2/rt_tables с номером, например 100

затем добавляете дефолт в тунель в эту таблицу: ip route add 0.0.0.0/0 via 10.0.0.2 dev tunnel1

В вашей инструкции был классический PBR - с классификацией по source ip

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

Если исходный трафик идёт на адрес 1.1.1.1, (который, как и 10.0.0.1, пренадлежит серверу 1), то только через DNAT можно отправить его на какой-то другой адрес/сервер, потому что в начале всегда идёт поиск по таблице маршрутизации local (255).

В вашей инструкции был классический PBR - с классификацией по source ip

Странная у него была инструкция, ведь "tab 0" она же «unspec routing table» это вобще непойми что.

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

Собственно я делал все по инструкции, укажите пожалуйста на ошибки. Из сообщений понял лишь половину.

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

Основная ошибка это следование инструкции, не вникая в команды. Если бы вы дали ссылку на эту самую инструкцию, может кто бы не поленился прочитать и поправить... Лично я вобще не понимаю, чего хотел автор инструкции указывая команды ″ip ... tab 0″, если в инструкции действительно ноль, а не другое число. Так сложной маршрутизации используются таблицы с номерами от 1 до 252. Но по мне никаких ″ip rule″ в вашем случае не нужно.

А что касается правил в iptables, то у вас пакеты будут идти между eth0 и tunnel1, поэтому пишите ″-o tunnel1″ в SNAT правиле. В FORWARD у вас правило вобще записано неверно, должно хватить ″-p tcp --dport 3306 -j ACCEPT″, остальные условия не нужны. И ″MASQUERADE″ не нужен, у вас прописан SNAT.

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

В скрипте tab указывается. Я просто 0 указал, видимо сглупил. Поставил на обоих серверах 10.

Сейчас попробую.

IlyaKronos ()
Ответ на: комментарий от mky

Собственно такие дела:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3306 -j DNAT --to 10.0.0.2:3306
iptables -t nat -A POSTROUTING -o tunnel1 -s 10.0.0.0/24 -d 10.0.0.2 -j SNAT --to 1.1.1.1
iptables -A FORWARD -p tcp --dport 3306 -j ACCEPT


Но к сожалению, ничего не работает.

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

SNAT-правило нужно писать адреса на tunnel1 (-j SNAT --to-source 10.0.0.1).

Если ваше утверждение, что «ничего не работает» основано на неудачных подпытках подключится к порту 3306 на 1.1.1.1, причём командой telnet, а не mysql-клиентом чтобы было ясно проходит ли подключение или нет, то можно посмотреть счёчики iptables.

Смотрите вывод команды ″iptables -L -n -v″ и аналогично для таблицы ″-t nat″. В этом выводе будут счётчики (пакетов и байт) и будет видно, работают ли правила. Если у DNAT-правила будет нулевой счётчик, значит входящих соединений вобще не было и нужно искать проблему в другом месте. Если у DNAT-правила и правила в FORWARD счётчики не нулевые, возможно, проблема в том, что SNAT-правило написано для соединений, исходящих с 10.0.0.0/24, а вы проверяете с какого другого адреса.

Если у всех трёх приведённых в вашем посте правил счётчики не нулевые, и возрастают при каждой попытке установить тестовое подключение, скорее всего проблемы в настройках на втором сервере.

P.S. Надеюсь, вы удаляете из iptables старые варианты ваших правил, а не просто добаляте новые.

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

Я не такой дурак, чтобы подключаться к MySQL базе с помощью telnet клиента.
Использую mysql -h 1.1.1.1

Вывод iptables -L -n -v (удивил немного):

root@ds:~# iptables -L -n -v
Chain INPUT (policy ACCEPT 1368 packets, 104K bytes)
pkts bytes target prot opt in out source
destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source
destination
0 0 ACCEPT tcp  — * * 0.0.0.0/0
0.0.0.0/0 tcp dpt:3306

Chain OUTPUT (policy ACCEPT 940 packets, 119K bytes)
pkts bytes target prot opt in out source
destination
root@ds:~#


Destination и source = 0.0.0.0/0, это так и должно быть?

А что Вы имеете ввиду под исходящих с... То есть только с 10.0.0.0?
Мне нужно, чтобы со всего интернета было доступно...

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

На данном форме, чтобы показывать вывод команд/логи и т.д., нужно ставить в начале тег [code], а в конце [/code] и смотреть с помощью кнопочки «Предпросмотр» что получилось. Внизу под формой ввода сообщения есть ссылка на описание LORCODE.

Destination и source = 0.0.0.0/0, это так и должно быть?

Да, все адреса. Вот для FORWARD вы показали, что пока вобще не одного пакета на ваш tcp dpt:3306 не прошло. Теперь читаем моё сообщение дальше:

Смотрите вывод команды ″iptables -L -n -v″ и аналогично для таблицы ″-t nat″.

И показываем вывод команды ″iptables -L -n -v -t nat″. Если там у DNAT-правила будут нули, тогда нужно думать, почему ваш MySQL-клиент подключается на какой-то другой адрес.

То есть только с 10.0.0.0?

Да.

Мне нужно, чтобы со всего интернета было доступно...

Ну тогда и нужно писать:

iptables -t nat -A POSTROUTING -o tunnel1  -d 10.0.0.2 -j SNAT --to 1.1.1.1
то есть не указывать диапазон src-адресов.

P.S. У вас вобще счётчики в FORWARD (policy ACCEPT 0 packets, 0 bytes) по нулям. Форвардинг в ядре включён? Первый пункт по этой ссылке http://arktop.ru/2013/05/включить-ip_forward-и-masquerade/

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.