LINUX.ORG.RU
решено ФорумAdmin

Перенаправить локальный трафик (IMAP/HTTP) соединения по другому маршруту в Ubuntu?

 , ,


0

1

Здравствуйте! В Ubuntu нужно перенаправить локальный трафик с 80 порта (или например 995) на другой интерфейс, т. е. НЕ через дефолтный маршрут.

В системе: eth0: 192.168.15.20 подсеть 255.255.255.0 шлюз дефолтный 192.168.15.1 Нужно перенаправить на VPN-соединение PPP2: 192.168.50.2 шлюз 192.168.10.1

Пробовал так:

создал таблицу в /etc/iproute2/rt_tables "100 redir"
ip route add default via 192.168.10.1 dev ppp2 table 100
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
ip rule add fwmark 0x2/0x2 lookup 100
(взято отсюда: https://habrahabr.ru/post/108690/)
Так же пробовал маскарадить трафик:
iptables -t nat -A POSTROUTING -o ppp2 -j MASQUERADE
Для теста использовал броузер - после применения вышенаписаного перестает открывать страницы. Смотрел tcpdump -i ppp2 port 80 - пакеты уходят с интерфейса. И приходят ответы! Если прописать дефолтным маршрут «ip route add default via 192.168.10.1 dev ppp2» все работает отлично. -------------------------------------------------------- Пробовал с соединением на 995 порт. Ввел команды:
ip route add default via 192.168.10.1 table 100
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 995 -j MARK --set-mark 0x3
ip rule add fwmark 0x3/0x3 lookup 100
iptables -t nat -A POSTROUTING -o ppp2 -j MASQUERADE
Командой «openssl s_client -connect pop.ukr.net:995» gsnfkcz установить соединение. Вот фрагмент дампа:
# tcpdump -i ppp2 port 995
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ppp2, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
17:47:02.926110 IP 192.168.50.2.50747 > frv240.fwdcdn.com.pop3s: Flags [S], seq 2992313097, win 29200, options [mss 1460,sackOK,TS val 18945796 ecr 0,nop,wscale 7], length 0
17:47:03.206217 IP frv240.fwdcdn.com.pop3s > 192.168.50.2.50747: Flags [S.], seq 171551312, ack 2992313098, win 65535, options [mss 1200,nop,wscale 6,sackOK,TS val 2030069827 ecr 18945796], length 0
17:47:03.925211 IP 192.168.50.2.50747 > frv240.fwdcdn.com.pop3s: Flags [S], seq 2992313097, win 29200, options [mss 1460,sackOK,TS val 18946046 ecr 0,nop,wscale 7], length 0
17:47:04.204445 IP frv240.fwdcdn.com.pop3s > 192.168.50.2.50747: Flags [S.], seq 171551312, ack 2992313098, win 65535, options [mss 1200,nop,wscale 6,sackOK,TS val 2030069827 ecr 18946046], length 0
17:47:05.929222 IP 192.168.50.2.50747 > frv240.fwdcdn.com.pop3s: Flags [S], seq 2992313097, win 29200, options [mss 1460,sackOK,TS val 18946547 ecr 0,nop,wscale 7], length 0
17:47:06.206005 IP frv240.fwdcdn.com.pop3s > 192.168.50.2.50747: Flags [S.], seq 171551312, ack 2992313098, win 65535, options [mss 1200,nop,wscale 6,sackOK,TS val 2030069827 ecr 18946547], length 0
17:47:09.205870 IP frv240.fwdcdn.com.pop3s > 192.168.50.2.50747: Flags [S.], seq 171551312, ack 2992313098, win 65535, options [mss 1200,nop,wscale 6,sackOK,TS val 2030069827 ecr 18946547], length 0
17:47:09.933251 IP 192.168.50.2.50747 > frv240.fwdcdn.com.pop3s: Flags [S], seq 2992313097, win 29200, options [mss 1460,sackOK,TS val 18947548 ecr 0,nop,wscale 7], length 0
17:47:10.216299 IP frv240.fwdcdn.com.pop3s > 192.168.50.2.50747: Flags [S.], seq 171551312, ack 2992313098, win 65535, options [mss 1200,nop,wscale 6,sackOK,TS val 2030069827 ecr 18947548], length 0
17:47:13.216328 IP frv240.fwdcdn.com.pop3s > 192.168.50.2.50747: Flags [S.], seq 171551312, ack 2992313098, win 65535, options [mss 1200,nop,wscale 6,sackOK,TS val 2030069827 ecr 18947548], length 0
17:47:16.231110 IP frv240.fwdcdn.com.pop3s > 192.168.50.2.50747: Flags [S.], seq 171551312, ack 2992313098, win 65535, options [mss 1200,nop,wscale 6,sackOK,TS val 2030069827 ecr 18947548], length 0
Товарищ «Nick: vel, Полное имя: vel21ripn» с этого форума писал здесь подскажите правило для iptables для форварда нужных пакетов (комментарий) Не понимаю куда установить net.ipv4.conf.all.rp_filter=2?

Незнаю что делать - ответы приходят - дампом они видятся. Но приложения (openssl, firefox) их не воспринимают. Судя по нулевой длинне пакетов - клиент и сервер немогут договориться. Скорее все-го из-за того, что клиент отсылает запрос по дефолтному маршруту, а ответ приходит с другого интерфейса. Может нужно сменить адрес отправителя в источнике ответа? Правильна ли команда - iptables -t nat -A POSTROUTING --src 192.168.50.2 -p tcp --dport 80 -j SNAT --to-source 192.168.15.1 ???



Последнее исправление: Coffee (всего исправлений: 4)

куда установить net.ipv4.conf.all.rp_filter=2?

/etc/sysctl.conf и прочитать man и применить изменения, и лучше ″=0″, а не ″=2″.

mky ★★★★★
()
net.ipv4.conf.all.rp_filter = 0

это настройка параметров ядра, пишется либо сразу в procfs

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
либо с помощью команды sysctl,

либо пишется отдельной строкой в /etc/sysctl.conf, затем sysctl -p

возможно, как раз reverse path filter не пущат - пакеты через счетчик интерфейса проходят, а опосля происходит проверочка, и дропаются. В таком случае действительно нужен snat, но prerouting или postrouting - не помню, поэкспериментируй. А rp_filter лучше не отключать - как-никак защита от ддосов и прочих мерзостей.

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

а опосля происходит проверочка, и дропаются. В таком случае действительно нужен snat,

И как snat поможет пройти проверку rp_filter'а, если он меняет другой ip-адрес, чем проверяемый при reverse path filtering?

mky ★★★★★
()

В первом приближении вроде все правильно. Единственно вот здесь ip rule add fwmark 0x2/0x2 lookup 100 я не знаю что такое lookup но надеюсь тоже самое что и table, да и маска просто не нужна. Я бы написал ip rule add fwmark 0x2 table 100, но вроде ваш вариант тоже самое.
Возможно у вас другие правила влияют. Попробуйте запустить tcpdump -i any port 995 что бы посмотреть на всех интерфейсах.

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

РЕШЕНО! Огромное спасибо за советы! Действительно нужно было разрешить переадресацию и отключить фильтры в ядре:

/etc/sysctl.conf:

net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.eth0.rp_filter=0 net.ipv4.ip_forward=1 net.ipv4.conf.all.force_igmp_version=2

Сейчас уже поэкспериментирую с «/etc/sysctl.conf и прочитать man и применить изменения, и лучше ″=0″, а не ″=2″.» Главное, что заработало с отключеной фильтрацией - дальше разберусь. Спасибо всем за активное участие! Размещал запрос еще на 2 профильных форумах - дельных советов не дали.

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

В итоге чтобы все заработало нужно было только изменить знаение net.ipv4.conf.all.rp_filter=2 (по дефолту стоит 1). Все остальное не менял.

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

Камрады, подскажите пожалуйста как запретить трафик на удаленный порт 443 через интерфейс eth0? Команда iptables -A OUTPUT -o eth0 -p tcp --dport 443 -j DROP отлично с этим справляется, но она так же убивает трафий через интерфейс ppp2. Это все с учетом всего вышенаписаного - что у меня трафик на порт 443 перебрасывается на маршрут с ppp2:

# ip route add default via 192.168.10.1 table 202
# iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 995 -j MARK --set-mark 0x3
# iptables -t nat -A POSTROUTING -o ppp2 -j MASQUERADE
# ip rule add fwmark 0x3/0x3 lookup 202
Я так понимаю, что фильтр цепочки OUTPUT срабатывает раньше, чем маркирование пакетов в цепочке POSTROUTING и пакет просто отбрасывается.

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

Не совсем понятно почему у вас «443 перебрасывается на маршрут с ppp2» речь же шла про 80 и 995. Если вы так же и 443-й отправили на ppp2 тогда у вас и так с eth0 уходить не будет. Вобщем не совсем понятна задача.

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

Прошу прощения - экспериментирую с разными портами. На 443 нагляднее мониторить в броузере. «Если вы так же и 443-й отправили на ppp2 тогда у вас и так с eth0 уходить не будет.» Все верно, но это VPN и он может иногда падать. Так же тогда стираеться его дефолтный маршрут.Задачу решил так: Добавил в таблицу правил почти в самом конце такое правило:

#ip rule add fwmark 0x2/0x2 blackhole pref 32765
то есть список правил получился таковым:
# ip rule
0:      from all lookup local
30201:  from 192.168.50.2 lookup lanet1
30202:  from all fwmark 0x2/0x2 lookup usa2redir
32765:  from all fwmark 0x2/0x2 blackhole
32766:  from all lookup main
32767:  from all lookup default
Если пропадает VPN ppp2, то исчезает таблица маршрутов для этого интерфейса. Тогда благодаря правилу №32765 пакеты исчезают в черной дыре) И трафик никак не просочиться на eth0.

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

Оригинально :) Хоть и не отвечает полностью формулировке задачи (не пускать именно через eth0) но полностью решает вашу задачу.
Еще можно было через iptables
-t mangle -A POSTROUTING -o eth0 -p tcp --dport 443 -m mark --mark 0x3 -j DROP
Или если до этого в OUTPUT маркировать эти пакеты отдельно например 0x4 то можно и без -p tcp --dport 443

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

anc, большое спасибо за совет! Ваш вариант самый правильный и феншуйный))) Вчера не догадался применить mangle к цепочке POSTROUTING. Пробовал к OUTPUT.

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