2011-02-10 14:48:50

VPN сервер за роутером

Linux VPN

Давно хотелось иметь возможность попадать в свою домашнюю сеть из любой точки интернета. В большинстве случаев описанных в примерах роутер и VPN сервер являлись одной и тоже физической машиной, а в моем случае VPN сервер будет внутри сети за роутером и клиент, подключающийся по VPN должен будет попадать в мою сеть в том же диапазоне адресов что и локальные участники, чтоб максимально упростить совместную работу.

Все это мне удалось сделать из интернета от стрим, роутера D-link DSL-2640u/BRU/D и сервера на основе Ubuntu 9.10 и выглядит это примерно так:


Благо стим выдает реальные адреса при подключении и нет необходимости в подключении каких-либо услуг с его стороны за дополнительные деньги.

Настраиваем роутер 

Для начала идем на роутер и настраиваем проброс VPN: Advanced Setup → NAT → Virtual Servers → Add. Выбираем PPTP в списке, вводим IP сервера и жмем "Save/Apply". Отдельно разрешать протокол GRE нигде не нужно. Потом сужаем диапазон адресов, выдаваемых по DHCP: Advanced Setup → LAN, там меняем End IP Address, я поставил себе 192.168.1.99 для того чтобы они не пересекались с выдаваемыми VPN сервером.

Мой роутер поддерживает Dynamc DNS, это очень удобно чтоб при подключении к VPN не вводить IP, который у стрима меняется каждые 24 часа, а вместо него удобное DNS имя. Идем в Advanced Setup → DNS → Dynamic DNS, жмем Add и вводим параметры.

Устанавливаем VPN сервер 

Теперь переходим к серверу. Для начала нам понадобится сам VPN сервер (в linux он называется pptpd). Устанавливаем:

sudo apt-get install pptpd 

Демон запущен и слушает порт tcp/1723, если на сервере используется firewall, то в нем нужно разрешить входящие соединения по протоколу GRE, а так же входящие соединения на tcp порт 1723:

$IPTABLES -A INPUT -p gre -s 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p gre -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 0/0 --dport 1723 j ACCEPT

Если все прошло успешно, переходим к настройке.  Первым делом крутим /etc/pptpd.conf

#убеждаемся что закомментировано, чтоб клиенту вбрасывались адреса
#noipparam
# включим передачу VPN-клиентам широковещательных пакетов с внутреннего интерфейса
bcrelay eth0
#настроим IP сервера
localip 192.168.1.10
#и диапазон адресов для клиентов
remoteip 192.168.1.234-245

Теперь настраиваем /etc/ppp/pptpd-options

# Требовать от клиента обязательное аутентификации
auth
#требуем авторизации только через MS-CHAPv2
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
#включаем шифрование
require-mppe-128
#поскольку VPN-клиентам выделяются адреса из реальной Ethernet-сети
#то чтобы все видели друг друга
proxyarp 
#мы не хотим становиться маршрутом по умолчанию
#но под виндой все равно потребуется настройка*
nodefaultroute

* не смотря на на nodefaultroute, под Windows при установке VPN все равно маршрут по-умолчанию вставал на VPN, чтобы этого не происходило идем в свойства VPN соединения → Сеть → Протокол TCP/IP → Свойства → Дополнительно, там снимаем галку "Использовать основной шлюз в удаленной сети".

Добавляем пользователей в /etc/ppp/chap-secrets

# client server secret IP addresses
user * password *

Здесь можно жестко задать IP для определенных пользователей.

Перезапускаем демона pptpd

sudo /etc/init.d/pptpd restart

Важно!

Теперь наш сервер будет работать роутером, поэтому для нормальной работы он должен уметь форвардить пакеты, иначе клиенты и локальные пользователи просто не увидят друг друга. Убеждаемся что

cat /proc/sys/net/ipv4/ip_forward

выдает 1 (0=disabled, 1=enabled). Если это не так, то нужно включить ip forwarding в ядре. Для этого открываем /etc/sysctl.conf  находим и меняем

net.ipv4.ip_forward=1

потом выполняем

sudo sysctl -p  

Все готово

Просим друзей создать VPN соединение к нашему серверу и проверить работоспособность, у меня все получилось с первого раза, чего и Вам желаю :)

А если все подключается, но ничего не работает 

И роутер не DSL, а устанавливает VPN-соединение с провайдером для доступа в интернет, то вполне возможно нужно изменить размер MTU, таким образом, чтобы он был меньше MTU соединения с провайдером. Например, вы подключаетесь к провайдеру с MTU=1400 (см. в настройках роутера), тогда для своего VPN сервера нужно задать меньшее значение, например 1300. Для этого идем в /etc/ppp/pptpd-options и дописываем

mru 1300
mtu 1300 

При написании были использованы следующие материалы: