Опрос


Что для Вас Умный Дом?


Результаты

Настройка VPN-соединения в Linux

24/11/2008 16:41:00

Использование GPRS/EDGE-Интернета там, где нет проводной связи безусловно определенный выход. Однако для системы "Умный Дом" неплохо было бы иметь доступ к домашнему серверу извне. Дело в том, что в случае GPRS-соединения реальный IP-адрес оператором связи не предоставляется, а значит "зайти" в виртуальным дом нельзя. В связи с этим я был счастлив, когда в моих курмышах появилась техническая возможность на установку проводного Интернета по технологии ADSL. В качестве модема был использован валявшийся без дела, поседевший от времени Thomson SpeedTouch 530.

К сожалению, провайдер отказался выдать статический IP-адрес. Но меня это не пугало, главное, что IP-адрес был реальным, хоть и выделялся динамически из определенной сети. Мне были вручены параметры VPN-соединения и вполне ожидаемые "наставления" относительно настроек этой штуки в Linux. Мы, люди, так или иначе использующие что-то, отличное от Microsoft Windows, относимся к таким наставлениям философски, отвечая что-нибудь нейтральное вроде "cам дурак". А все-таки приятно иногда общаться со службой поддержки, особенно когда на той стороне сидит какая-нибудь мадам средне-неопределенного возраста, дающая неизменную и удивительно полезную рекомендацию "перезагрузите компьютер".

Для того, чтобы Linux (например, Debian, как у меня) умел работать через VPN, нам необходимы следующие пакеты:

apt-get install ppp
apt-get install pptp-linux

Предположим, вы уже получили через DHCP адрес сетевого интерфейса. Физически линк есть.
Нужно создать файл с любым именем в каталоге /etc/ppp/peers. Например /etc/ppp/peers/vpn и написать туда что-нибудь вроде:

name login
pty "pptp XXX.XXX.XXX.XXX --nolaunchpppd"
remotename VPN
file /etc/ppp/options.pptp

где XXX.XXX.XXX.XXX - IP адрес вашего VPN-сервера.
Если планируется использовать Linux в качестве сервера/маршрутизатора в локальной сети, то велика вероятность того, что некоторые сайты на клиентских компьютерах (особенно под управлением Windows) не будут загружаться. Не вдаваясь в подробности этой проблемы могу порекомендовать уменьшить размер MTU соединения до 1400-1420 следующим образом.

mtu 1400
mru 1400

Теперь нужно отредактировать файл /etc/ppp/chap-secrets

login        VPN     passwd     *

Собственно, все, теперь запускаем команду
pppd start vpn
и видим по команде ifconfig появление нового интерфейса ppp0

Важно! Если IP-адрес VPN-сервера находится в сети отличной от той, что получена через DHCP модемом, то прежде чем запускать VPN необходимо прописать маршрут к этому хосту через существующий Ethernet-интерфейс. Делается это командой route

route add -host XXX.XXX.XXX.XXX netmask 255.255.255.255 dev eth0

Но правильнее прописать эту команду в файл /etc/network/interfaces где описан сам интерфейс.

Еще хочу заметить, что в моем случае после поднятия VPN-соединения Интернет появляется с задержкой примерно в 30 секунд. Поэтому если сразу пинги не идут - подождите.
Важно при этом, чтобы в файле /etc/resolv.conf был прописан работающий DNS-сервер. В файле /etc/ppp/peers/vpn можно прописать опцию usepeerdns, чтобы pppd брал правильный адрес DNS-сервера. Однако зачастую VPN-сервер выдает неправильный адрес DNS-сервера или же выдает правильный, но он перезаписывается неправильным адресом, выданным уже в процессе работы VPN-соединения DHCP-сервером. В таких случаях помогает пакет resolvconf, с помощью которого можно управлять записями о DNS серверах, указывать приоритеты DNS-серверов.

Чтобы VPN-соединение "поднималось" при загрузке системы, нужно включить его описание в файл /etc/network/interfaces

iface ppp0 inet ppp
        provider vpn

auto ppp0

Чтобы через VPN-соединение пустить всех пользователей из локальной домашней сети, нужно настроить NAT или MASQUERADE с помощью пакета iptables.
Правила для iptables можно разместить в любом удобном месте. Например создать файл с любым именем в каталоге /etc/network/if-up.d/ прописав в него следующее:

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

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

Теперь, если мы выполним эту команду, мы будем иметь возможность ходить в Интернет из локальной сети. Не забудьте только включить IP-forwarding в системе и файле /etc/sysctl.conf (как написано в статье про настройку GPRS)

Чтобы Network Address Translation (NAT) работал более четко и стабильно (в случае использования Linux в качестве маршрутизатора), мне потребовалось также добавить в вышеуказанный файл строчку:

iptables -t mangle -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS  --clamp-mss-to-pmtu

Может, кому-нибудь поможет... Вроде бы все... Хотя нет, есть один момент. Как же нам теперь зайти на наш сервер, если мы не знаем его адреса? Я решил вопрос таким образом. Купил самый дешевый аккаунт на коммерческом хостинге. Создал в нем каталог home , а в корне положил PHP-скрипт такого характера

<?php
$fp = fopen('/home/.htaccess', 'w');
$my_txt = "Redirect /home/ http://".$_GET['ip'];
fwrite($fp, $my_txt);
fclose($fp);
?>

Другими словами, я создаю файл .htaccess для Web-сервера Apache, в котором идет переадресация на мой домашний сервер.

Затем я уже на своем сервере добавил скрипт в каталог /etc/ppp/ip-up.d/ который с помощью программы wget обращается к моему аккаунту http://my_account/my_script.php?ip=XXX.XXX.XXX.XXX, а также прописал выполнение этого скрипта в cron каждые 30 минут.
Теперь когда IP-адрес VPN-соединения меняется, сервер как бы сообщает об этом на внешний хостинг. Теперь, чтобы бы мне зайти на домашний компьютер, я обращаюсь к внешнему хостингу по адресу http://my_account/home
Возможно это не самый оптимальный вариант, а при использовании Linux всегда существует масса разных способов решить ту или иную задачу, но он работает. В сети существуют также различные, так называемые, динамические DNS-службы. Можно использовать и их сервисы.

Тем, кто хочет использовать Linux не в качестве VPN-клиента, а в качестве VPN-сервера, скажу, что делается это еще проще.
Необходим пакет pptpd

apt-get install pptpd

Редактируем по своему усмотрению файл /etc/pptpd.conf и chap-secrets (как указано выше). Затем просто запускаем pptpd вручную и если работает, пишем простенький скрипт и кладем его в /etc/init.d

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:



Сортировка комментариев: Последние сверху | Первые сверху

2015-01-10 21:15:56 | Денис
А если у меня сервере апачи есть два интерфейса(полный и ограниченный).
И вот я хочу чтоб с любого компьютера(вообще любого) я мог получить доступ к ограниченному интерфейсу управления домом. А с устройств сконфигурированых для ВПН получить доступ к полной версии. И там, и там должна требоваться авторизация. Как это сделать? Или можете хоть ткнуть в мануалы. К сожалению, с этой темой вовсе незнаком и фраза "написать простой скриптик", только пугает.


2013-01-11 05:51:34 | N
Про OpenVPN и DynDNS говорилось выше. Первый для создания VPN-туннеля, второй для обеспечения соответствия DNS-имени и динамического белого адреса.
Если же адрес серый, есть два варианта:
1) UDP hole punching + OpenVPN
2) Hamachi
Про все неизвестные слова можно почитать в Википедии


2012-12-17 00:49:29 | oleg
странно читать первый абзац, что если GPRS, то не получится подключиться без реального IP...
у меня получается - через хостинг с VPN, правда я использую openvpn все вполне нормально работает.


2011-03-01 12:47:53 | Andrey_B
tpm3, Вы совершенно правы. Но и в статье уже было написано об этом "В сети существуют также различные, так называемые, динамические DNS-службы."
Я же применил этот вариант, потому что он показался мне более простым, учитывая, что хостинг, честно говоря, у меня уже был. Кроме того, точно таким же образом я передаю некоторую другую информацию для общего, открытого пользования, температуру на улице, информацию с метеостанции и прочее.


2011-03-01 12:34:10 | tpm3
Можно, в принципе, обойтись без покупки хостинга, а воспользоваться услугами, к примеру DynDNS.org, что позволит обновлять соответствие доменного имени нашего сервера айпи адресу по запросу клиента, который часто бывает встроен в популярные модели роутеров, ну и под линукс доступен.
А в особо запущенных случаях можно им отправить специальным образом подготовленный http-запрос, с указанием в какой конкретно айпи нужно разрешать имя:)