Страницы

пятница, 17 апреля 2009 г.

Приручаем интерфейс

Как не хорошо получается, целый месяц не писал. Ну будем наверстывать упущенное.

Значит имеется сервер, предназначенный для раздачи интернета на несколько пользователей. К интернету сервер коннектится через PPPoE, пользователи подключаются через VPN. Довольно часто имеют место разрывы соединения с провайдером (ессно по его вине), так вот если во время отсутствия коннекта с провайдером, к серваку подключается юзер в надежде полазить в интернете...он этого самого интернета не получит даже когда коннект с провайдером восстановится. А все почему? А потому что по умолчанию коннект с провайдером идет через интерфейс ppp0. Так вот коннект пропал, интерфейс тоже, и тут подключается юзер. На какой интерфейс его подключит сервак? Правильно, на ppp0. Ладно, юзер подключился, сидит курит бамбук, инета нет. Через неопределенное время серверу все-таки удается соединиться с провайдером, но поскольку интерфейс ppp0 занят, он цепляется на ближайший свободный, тоесть на ppp1. И интернета...опять нет! Все загвоздка была в файле /etc/rc.d/rc.firewall - так в моем SlackWare на сервере называется скрипт в котором прописаны все правила iptables. До недавнего времени в конце этого файла была замечательная строчка, осуществлявшая маскарадинг, понятно для каких целей.
Выглядела она так:

iptables -A POSTROUTING -t nat -o ppp0 --protocol all -j MASQUERADE

Понятно что маскарадились только пакеты с интерфейса ppp0. И если сервер подключался к провайдеру через другой интерфейс, то никакого маскарадинга не было и интернета тоже.
Попытки приучить сервер выдавать интерфейс ppp0 только для соединения с провайдером успеха не имели. Ну чтож, если гора не идет к Магомету... Разрешим серверу соединяться с провайдером через любой интерфейс, но при условии, что он будет нам каждую минуту сообщать на каком интерфейсе он в данный момент подключен. Для этого вместо приведенной выше строчки пишем две другие:

PPP=`ip route | grep 'via 10.254.254.254' | grep -o 'ppp[0-99]'`;

iptables -A POSTROUTING -t nat -o $PPP --protocol all -j MASQUERADE

Где 10.254.254.254 vpn-шлюз провайдера.
Вот и все. Теперь добавляем этот самый файл в крон выполняться каждую минуту, и имеем много счастья.
P.S Спустя два года после этого поста, я нашел более правильное решение проблемы. Читать.

Комментариев нет:

Отправить комментарий