Офисный VPN сервер PPTP и роутами через DNSMASQ на Centos 6

Неожиданно встала задача организовать работу коллег в офисной сети и исполь- зование рабочих ресурсов из дома. В моем случае подходил только протокол PPTP, поскольку не хотелось заморачиваться с ключами OpenVPN, а настройка клиента OpenVPN в Windows вообще не вызывала энтузиазма - достаточно было представить, сколько времени нужно было бы потратить на разъяснения коллегам, что и где нужно написать и поменять.

Итак, выбор пал на PPTP - туннельный протокол типа точка-точка, позволяющий пользователю устанавливать защищенное соединение с сервером путем создания специального туннеля. Вот что из этого вышло: ...

Имею в распоряжении:
Заранее подготовленная виртуалочка с centos 6.3, смотрящая одним концом в интернет, вторым в локальную сеть.

eth0 - int - 192.168.40.101/24 - офисная сеть
eth1 - ext - Y.Y.Y.Y/32 - внешний айпи
ppp+ - vpn - 172.20.20.0/24 - виртуальная сетка, выдаваемая на VPN

Ожидаемый результат:

Клиент подсоединяется к VPN, видит офисную сеть. Интернет на компьютере остаётся доступным, т.е. не заменяется основной роутинг. Пользователь кроме виндового (MAC) клиента ничего не трогает, никаких роутингов руками не прописывает, батников не пишет. Всё происходит автоматически. Да-да, я делаю акцент на этом, потому что бытует мнение, что через pptp нельзя выдавать static route, и пользователю на компьютере обязательно нужно что-то прописывать. Так вот - читайте дальше и поймете, что вы жестоко заблуждались.

Для доступа в офисную сеть через PPTP соединение выдаётся статический маршрут.
(pptp dnsmasq static route). Если же необходимо пустить весь трафик через офисный интернет, ставим галочку в настройках VPN-клиента, а в файрволле на сервере добавляется дополнительное правило. dnsmasq в этом случае ставить не нужно.

Сразу оговорюсь, конфиги как есть с рабочей конфигурации, которая уже работает и не требует дополнительной настройки.

0. Selinux - OFF!

Сразу всегда! Дабы потом не угадывать, почему происходит то, что не должно происходить.

# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted


1. Настроим файрволл следующим образом:

# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Wed Nov  7 14:57:12 2012
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#-A POSTROUTING -s 172.20.20.0/24 -o eth1 -j SNAT --to-source Y.Y.Y.Y --persistent # Нат в интернет, включаю для себя
-A POSTROUTING -s 172.20.20.0/24 -o eth0 -j SNAT --to-source 192.168.40.101 --persistent # Нат в офисную подсеть
COMMIT
# Completed on Wed Nov  7 14:57:12 2012
# Generated by iptables-save v1.4.7 on Wed Nov  7 14:57:12 2012
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [433:72508]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT  
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT # Порт для ssh
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1723 -j ACCEPT # Порт для pptp
-A INPUT -p udp -m state --state NEW -m udp --dport 67 -j ACCEPT # Порт для отладки dhcp dnsmasq
-A INPUT -p tcp -m state --state NEW -m tcp --dport 67 -j ACCEPT # Порт для отладки dhcp dnsmasq
-A INPUT -p udp -m state --state NEW -m udp --dport 68 -j ACCEPT # Порт для отладки dhcp dnsmasq
-A INPUT -p tcp -m state --state NEW -m tcp --dport 68 -j ACCEPT # Порт для отладки dhcp dnsmasq
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT # Порт для dns
-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT # Порт для dns - не нужен, но так красивее =)
-A INPUT -i ppp+ -j ACCEPT # Разрешаем любые входящие от клиентов на PPTP
-A INPUT -p gre -j ACCEPT # Разрешаем прохождение gre
-A FORWARD -j ACCEPT  # Форвардинг разрешен
-A FORWARD -i ppp+ -o ppp+ -j ACCEPT # Разрешаем передачу данных от одного клиента другому
COMMIT
# Completed on Wed Nov  7 14:57:12 2012


2. Вносим изменения в /etc/sysctl.conf:

# cat /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1 # Включаем форвардинг пакетов между сетевыми интерфейсами


3. Устанавливаем репозиторий pptp:

rpm -Uhv http://gnu.su/poptop # pptp-release-current.noarch.rpm


Лирическое отступление:

3,5. Позже заменил на accel-pptp (Но не суть, можно пропустить данный шаг - это понты)

брал тут:

wget http://gnu.su/accel-ppp-rpm
wget http://gnu.su/accel-ppp-spec
wget http://gnu.su/accel-pptp-rpm
wget http://gnu.su/accel-pptp-spec


Это лишь материал для сборки пакетов, но этого оказалось вполне достаточно. Для тех, кто уверен в своих силах. Честно скажу, скорость передачи данных возрастает сильно, а нагрузка на процессор падает значительно.

Все конфиги справедливы как для accel-pptp, так и для обычного pptp.


4. Ставим все необходимые пакеты из подключенного ранее репозитория:

yum install ppp  pptp pptpd dnsmasq


5. Настраиваем pptp:

cat /etc/pptpd.conf 
localip 172.20.20.1

remoteip 172.20.20.200-250

option /etc/ppp/pptpd-options


# cat /etc/ppp/pptpd-options 
name pptpd

refuse-pap # Запрещаем pap-авторизацию  - устарела, несекьюрно
refuse-chap # Запрещаем chap-авторизацию  - устарела, несекьюрно
refuse-mschap # Запрещаем mschap-авторизацию  - устарела, несекьюрно

require-mschap-v2 # Запрещаем mschap-v2

require-mppe-128 # Шифруем трафик - обязательное условие
nobsdcomp # Не сжимаем
nodeflate
novj
novjccomp
nologfd

proxyarp # Опция, без которой не заработает раздача роутингов через DHCP-inform

ms-dns 192.168.40.137 # ДНС 1
ms-dns 8.8.8.8 # ДНС 2

mtu 1400 # Урезаем пакеты до размера, который пролезет в трубу, иначе пакеты будут фрагментироваться, огромные тормоза
mru 1400

lcp-echo-failure 6
lcp-echo-interval 10

nodefaultroute # Отключаем дефолт роутинг, чтобы у Win-клиентов не ломался интернет при подключении к ВПН

debug # Для отладки


6. Настраиваем DNSMASQ для выдачи клиентам vpn статических маршрутов, через dhcp-request inform:

# cat /etc/dnsmasq.conf

domain-needed

# Change this line if you want dns to get its upstream servers from
# somewhere other that /etc/resolv.conf
resolv-file=/etc/resolv.conf

# By  default,  dnsmasq  will  send queries to any of the upstream
# servers it knows about and tries to favour servers to are  known
# to  be  up.  Uncommenting this forces dnsmasq to try each query
# with  each  server  strictly  in  the  order  they   appear   in
# /etc/resolv.conf
strict-order

server=192.168.40.137 # DNS откуда берем записи
server=/40.168.192.in-addr.arpa/192.168.40.137 DNS для обратной зоны, не обязательно, но я прописал, дабы запомнить синтаксис

interface= lo # Интерфейс, на котором слушаем, дабы не вызывать конфликтов с уже имеющимся DHCP-сервером

except-interface=eth0 # Отключаем внутренний интерфейс, туда не нужно вещать
no-dhcp-interface=eth0 # Отключаем внутренний интерфейс, туда не нужно вещать, береженого Бог бережет

listen-address=172.20.20.1 # Слушаем на этом айпи

#bind-interfaces

domain= local # Дефолтный домен в локалке - local

dhcp-option=vendor:MSFT,2,1i

dhcp-range=172.20.20.0,172.20.20.250,255.255.0.0,12h # Обслуживаемые клиенты
dhcp-option=option:domain-search,local # Передаём наш сёрч домен, чтобы работали короткие имена
#dhcp-option=option:router,172.20.20.1 # Роутер, нам не нужно рутить все пакеты, поэтому выключаем
dhcp-option=option:ntp-server,X.X.X.X # Сервер времени
dhcp-option=1,255.255.255.0 # Внутренняя подсеть - маска
#dhcp-option=3,172.20.20.1 # Роутер(вид сбоку), нам не нужно рутить все пакеты, поэтому выключаем

dhcp-option=6, 192.168.40.137, 8.8.8.8 # Эта опция оказалась очень важна, поскольку dnsmasq пытался вписать себя в список выдаваемых DNS. Заменяем на свои
dhcp-option=121, 192.168.40.0/24, 172.20.20.1 # Роутинги для RFC-клиентов
dhcp-option=249, 192.168.40.0/24, 172.20.20.1 # Роутинги для Microsoft-клиентов
log-dhcp # Для отладки


7. Добавляем всё в автозагрузку:

chkconfig dnsmasq on
chkconfig pptpd on
chkconfig iptables on

В рабочей конфигурации на сервере должны летать такие пакеты:
# tcpdump -nnv -i any port 67 or port 68
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
19:25:12.783616 IP (tos 0x0, ttl 64, id 2, offset 0, flags [none], proto UDP (17), length 290)
    172.20.20.202.68 > 255.255.255.255.67: BOOTP/DHCP, Request, length 262, htype 8, hlen 6, xid 0x4, Flags [none]
	  Client-IP 172.20.20.202
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Inform
	    Client-ID Option 61, length 7: hardware-type 8, 00:00:00:01:00:00
	    Parameter-Request Option 55, length 6: 
	      Domain-Name-Server, Netbios-Name-Server, Vendor-Option, Subnet-Mask
	      Classless-Static-Route-Microsoft, Domain-Name
19:25:12.784198 IP (tos 0x0, ttl 64, id 7705, offset 0, flags [none], proto UDP (17), length 328)
    172.20.20.1.67 > 172.20.20.202.68: BOOTP/DHCP, Reply, length 300, htype 8, hlen 6, xid 0x4, Flags [none]
	  Client-IP 172.20.20.202
	  Server-IP 172.20.20.1
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: ACK
	    Server-ID Option 54, length 4: 172.20.20.1
	    BR Option 28, length 4: 172.20.255.255
	    Domain-Name Option 15, length 5: "local"
	    Classless-Static-Route-Microsoft Option 249, length 8: (192.168.40.0/24:172.20.20.1)
	    Domain-Name-Server Option 6, length 8: 192.168.40.137,8.8.8.8
	    Subnet-Mask Option 1, length 4: 255.255.255.0
19:25:16.984573 IP (tos 0x0, ttl 128, id 29931, offset 0, flags [none], proto UDP (17), length 328)


8. Настройка MS-клиентов на примере win7:

  • 8.1. Пуск -> Панель управления:
  • 8.2. Открыть "Просмотр состояния сети и задач" (или "Центр управления сетями и общим доступом"):
  • 8.3. Выбрать "Настройка нового подключения или сети":
  • 8.4. Выбрать "Подключение к рабочему месту":
  • 8.5. Выбрать "Использовать мое подключение к Интернету (VPN)":
  • 8.6. Ввести адрес сервера: vpn.gnu.su, Поставить галочку "Не подключаться сейчас, ..."
  • 8.7. Ввести имя пользователя и пароль:
  • 8.8. Нажать "Закрыть":
  • 8.9. В окне "Центр управления сетями и общим доступом" выбрать "Изменение параметров адаптера":
  • 8.10. Открыть свойства нового VPN-подключения:
  • 8.11. Открыть вкладку "Сеть":
  • 8.12. Открыть "Протокол Интернета версии 4" (можно дважды щелкнуть мышкой):
  • 8.13. Нажать кнопку "Дополнительно":

  • 8.14. Снять галочку "Использовать основной шлюз в удаленной сети"

  • 8.15. Открыть новое VPN-подключение:
  • 8.16. Убедиться, что введены правильные имя пользователя и пароль, и нажать "Подключение":


Вот и всё! Всегда Ваш - Я!




Вас также может заинтересовать:

Сервер OpenVPN на CentOS
Увидел свет офисный пакет LibreOffice 4.1
Настройка РРТР в GENTOO консольный вариант (PPTP Gentoo-way)
Для CentOS 5.6 доступны обновления, выпущенные для RHEL 5.7 (Centos 5.7 ?)
Релиз Linux-дистрибутива CentOS 5.6 (centos upgrade)
Iceotope сервер в масле