Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Перенаправление пользователя на страничку подключения при падении VPN  (Прочитано 3275 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
День, добрый.
Есть такая вот задачка.
1. У нас есть доступ по VPN к неким ресурсам.
2. Основной шлюз офиса выполняет маршрутизацию IP которые доступны по VPN на CentOS.
2. VPN поднимается на 15 часов и затем принудительно сбрасывается на стороне шлюза, не считая проблем со связью.
3. Данные для VPN аутентификации изменяются раз в минуту, посему нет возможности автоматически поднимать тунель.
3. VPN поднят на CentOS, а iptables выполняет маскарадинг трафика по тунелю.
4. Схема подключения

Как работает сейчас
1. Заходим на CentOS через браузер и выполняем VPN подключение.
2. Теперь весь офис может работать с ресурсами доступными через VPN.
3. Если туннель падает, то у пользователя браузер долго крутит колёсики и не открываются некоторые сайты. Он понимает, что нужно пойти и поднять VPN.

Чего хочется добиться
1. Что бы при падении VPN(tun0) пользователя переадресовывало сразу на страничку установления VPN соединения.

Варианты решения
1. Средствами только iptables насколько я понимаю это не решить потому как из nat POSTROUTING пакет уже не достать, или может я ошибаюсь ?
2. По событиям ifup/down изменяем правила в iptables - таким образом проблема решается, осталось лишь смочь отследить эти события по интерфейсу tun0.
3. Запуск скрипта при старте, который сам будет следить за tun0 и править iptables правила.
4. DNS не хотелось бы для этого использовать из-за кеша.

Для перенаправления пользователя на страничку подклчюения VPN, добавляем правило в iptables
iptables --table nat --append PREROUTING -i eth0 -p tcp -j DNAT -to-destination 10.0.4.2:80

Дополнительные материалы
1. Netfilter-diagram-rus
2. Iptables Tutorial 1.2.2
3. How Do I Run a Firewall Script As Soon As eth0 Interface Brings Up?
4. 13.3. Interface Control Scripts
5. Dynamic network configuration on Linux ...
6. How to configure `eth0` to retry `dhclient` when unplugged and replugged?

Вопросы собственно такие:
1. Можно ли всё же при помощи iptables забрать пакеты после nat POSTROUTING и выполнить редирект на IP ?
2. Если 1 не работает, то как отследить событие ifup/down и выполнить скрипт при этих событиях ?

Спасибо.
« Последнее редактирование: 03 Март 2012, 16:19:43 от slech »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25941
    • Просмотр профиля
Отследить поднятие/опускание интерфейса - именно так, как сказано в вопросе, ссылку на который вы давали. Проблема там была лишь в том, что вопрошающий использовал Network Manager и для него ответ не годился.
Попробуйте сами предложенный там рецепт, у вас должно работать.
По поводу "как завести", вопрос - ресурсы за VPN находятся в одной сети?
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
Попробуйте сами предложенный там рецепт, у вас должно работать.
Поэксперементирую

Цитировать
По поводу "как завести", вопрос - ресурсы за VPN находятся в одной сети?
Там много подсетей моя пограничная CentOS занимается NAT. Проблем с передачей трафика туда сейчас нет.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25941
    • Просмотр профиля
Тогда, думаю, один вариант.
При опускании интерфейса включать прозрачный редирект на внутренний веб-сервер. Замечательно, если страничка подключения - единственная и принимает любые возможные адреса без выплёвывания ошибок.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
У меня Apache сейчас принимает подключение по IP и выполняет переадресацию на http://proxy-vpn.domain.local/
CentOS custom network scripts on ifup and ifdown
interface post-up в CentOS
« Последнее редактирование: 03 Март 2012, 21:29:47 от slech »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25941
    • Просмотр профиля
Не надо спамить ссылками на блоги. Особенно это бессмысленно, когда доступ к блогу ограничен кучкой избранных.

Доменный суффикс .local зарезервирован для самоорганизующихся неуправляемых сетей.
Использовать его так, как это делаете вы, неправильно.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
(Нажмите, чтобы показать/скрыть)
В блоге как раз описанно что в CentOS нет аналога Debian:
/etc/network/if-pre-up.d
/etc/network/if-up.d
/etc/network/if-down.d
/etc/network/if-post-down.d

Используются два других файла:
/sbin/ifup-local
/sbin/ifdown-local

Создал я /sbin/ifup-local

/bin/bash /sbin/ifup tun0
Цитировать
/sbin/ifup: configuration for tun0 not found.
Usage: ifup <device name>
Т.е. vpnc поднимая VPN интерфйес не выполняет команду /sbin/ifup tun0
Да и собственно конфига для этого интерфейса нет. Как vpnc поднимает это интерфейс мне неизвестно.

Зато в
cat /var/log/messages | grep tun0
Цитировать
Mar  3 20:05:30 svn2p4sync netplugd[25570]: tun0: ignoring event

Сдаётся нужно через него это делать.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25941
    • Просмотр профиля
Вы задом наперёд читаете сообщения системы.
Цитировать
/sbin/ifup: configuration for tun0 not found.
Вам английским языком говорят - "при попытке поднять интерфейс по имени, описания интерфейса в файле /etc/network/interfaces не обнаружено".
При том, что я вообще не понимаю, зачем вы выполняете эту команду.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
Да вроде всё верно я читаю.

Ежели я собрался ориентировать на ifup/down мне нужно использовать
/sbin/ifup-local
/sbin/ifdown-local

Эти скрипты будут выполняться при включении или выключении интерфейса. В моём случае это tun0.
Создаю я скрипт /sbin/ifup-local
И выполняю команду включения интерфейса. Интерфейс у меня tun0:
/bin/bash /sbin/ifup tun0
Вижу ошибку о том что нет файла конфигурации интерфейса. Понимаю что файл такой я не создавал.
И собственно tun0 поднимается каким-то образом самим vpnc.
Получается, что раз
/bin/bash /sbin/ifup tun0
не работает и не может работать так как конфига нет, то vpnc не выполняет такую команду и соотвественно таким образом отловить поднятие у меня не получится.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25941
    • Просмотр профиля
Вам не надо выполнять ничего. Просто поднимите интерфейс. Нормальным способом. Как обычно его поднимаете.
Вы же не будете бегать и ifup'ать его, правильно? Вот и ставьте тесты в нормальных, а не выдуманных, условиях.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
Так и делал до тестов. Ничего не работает.

vi /sbin/ifup-local

#!/bin/bash
echo /sbin/ifup-local >>/tmp/log.txt
Устанавливаю VPN соединение - в логе ничего.
Поэтому пошёл тесты делать.

Подправил файлик:
vi /etc/netplug.d/netplug

Цитировать
netplug tun0 - probe - 2012-03-03--21:30:43
netplug tun0 - probe - 2012-03-03--21:50:53
netplug tun0 - in - 2012-03-03--21:50:53
netplug tun0 - probe - 2012-03-03--21:50:53
netplug tun0 - in - 2012-03-03--21:50:53
netplug tun0 - probe - 2012-03-03--21:50:53
netplug tun0 - in - 2012-03-03--21:50:53
netplug tun0 - in - 2012-03-03--21:50:53
netplug tun0 - in - 2012-03-03--21:50:53
Т.е. есть реакция на создание и отключение VPN соединения.

Но теперь я смотрю самое интересное наступило.
Перечитал вашу рекомендацию
Цитировать
При опускании интерфейса включать прозрачный редирект на внутренний веб-сервер. Замечательно, если страничка подключения - единственная и принимает любые возможные адреса без выплёвывания ошибо
Вот такое правило использую
iptables --table nat --append PREROUTING -p tcp -j REDIRECT --to-port 80 -m comment --comment "Redirect if VPN is down"

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25941
    • Просмотр профиля
Полностью таблицу nat покажите.
И, такие правила, которые туда-сюда шляются, лучше писать в отдельную цепочку, со ссылкой из главной.
Тогда убить правило можно, просто очистив цепочку.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
Chain PREROUTING (policy ACCEPT 53623 packets, 5490K bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       56  2912 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 /* Redirect if VPN is down */ redir ports 80
2        3   156 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443 /* Redirect if VPN is down */ redir ports 443

Chain POSTROUTING (policy ACCEPT 3040 packets, 220K bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 5772 packets, 408K bytes)
num   pkts bytes target     prot opt in     out     source               destination


VPN отключен.

теперь получается вот так:
1. заходим на страничку с прокси - всё ок. http://proxy-vpn.domain.local - можно установить соединение.
2. просим ресурс из VPN - редирект на дефолтный сайт Apache.
3. на том же Apache ставлю index.html c редиректом на http://proxy-vpn.domain.local
и начинается зацикливание.
« Последнее редактирование: 04 Март 2012, 00:22:12 от slech »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25941
    • Просмотр профиля
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн slech

  • Автор темы
  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
# Generated by iptables-save v1.3.5 on Sat Mar  3 22:25:20 2012
*nat
:PREROUTING ACCEPT [53979:5527506]
:POSTROUTING ACCEPT [3118:225776]
:OUTPUT ACCEPT [5850:413440]
-A PREROUTING -p tcp -m tcp --dport 80 -m comment --comment "Redirect if VPN is down" -j REDIRECT --to-ports 80
-A PREROUTING -p tcp -m tcp --dport 443 -m comment --comment "Redirect if VPN is down" -j REDIRECT --to-ports 443
COMMIT
# Completed on Sat Mar  3 22:25:20 2012
Хотя вроде зацикливаний нет, но это про исходит не мгновенно. Браузер долго крутит колёса. И затем открывает страничку https://proxy-vpn.cmlatitude.local
« Последнее редактирование: 04 Март 2012, 00:33:04 от slech »

 

Страница сгенерирована за 0.06 секунд. Запросов: 24.