пятница, 19 марта 2010 г.

OpenVPN for Fedora 12

Настроил в очередной раз виртуальную сеть на машине с федорой.

До этого я один раз описывал как настроить виртуальную сеть для Fedora 9 с использованием сертификатов (http://blog.axet.ru/2008/04/openvpn-with-fedora-8.html) и вот настал очередной момент когда я решил возобновить пользование этой сеткой.

В этот раз я хочу описать более подробно как происходит маршрутизация и настройка по шагам с использованием авторизации по паролю (проще настраивать). В таком случае будет значительно меньше вопросов о том "почему моя сеть не работает".



Первым делом давайте опишем что мы имеем и что хотим получить:

У меня дома настроена сеть с моим ADSL модемом, сервером и несколькими ноутбуками. Я хочу иметь возможность с любой точки планеты (офис, другая страна) заходить в мою локальную сеть как будто я физически вставляю ethernet шнур в мой ноутбук. Так, что бы все кто присутствовал в сети могли зайти на мою машину и я мог пользоватся всеми службами сети (удаленный терминал, программы обмена файлами, ssh, samba и так далее..)

Для выхода в интернет я использую ADSL модем, который автоматически получает внешний интернет IP адрес и настроен таким образом что делает настройку DNS через dyndns.org таким образом, что я мой динамический внешний IP адресс всегда имеет одно интернет имя.

Другими словами, если у вас динамический внешний IP адрес интернета, вам это не будет мешать, так как у вас есть интернет имя вида some.dyndns.org (или другое), которое всегда показывает на ваш сервер.

Как настроить dyndns.org писать не буду, так как это: 1) прото 2) в интернете куча примеров именно для вашего ADSL модема или дургого оборудования.

Кроме того что этот модем отвечат за настройку интернет имени\внешнего адреса, мой ADSL модем умеет раздавать динамические адреса всем комьпютерам локальной сети (через dhcp) подключенным к нему по ethernet и wifi соединениям.

Маска моей подсети 192.168.54.0/24 (192.168.54.0/192.168.54.255)

Так как у меня есть сервер Fedora 12 дома я могу запустить там любые службы и opensource программки. Но что бы они были видны с интернета необходимо настроить переброску портов с моего ADSL модема (у которого есть внешний адрес) на мой fedora сервер. Для этого так же воспользуйтесь инструкцией к модему в котором всегда будет пару строчек про forwarding, port mapping, nat, настройку портов. Надеюсь в этом тоже у вас получится разобраться.

А вот чего нет в этих инструкциях - как настроить федору, чем сейчас и займемся.

Прежде всего установите пакеты:

# yum install openvpn bridge-utils

Теперь необходимо понять как работает виртуальная сеть. Постараюсь объяснить на пальцах.

Служба openvpn делает часть работы по созданию виртуального ethernet шнура. Один кончик цепляется к вашему ноутбуку на виртуальный интерфейс tap созданный с помощью openvpn скриптов (например под windows), а второй кончек по интернету цепляет в сеть в которую вы хоитете подключится. На этом работа openvpn заканчивается. То почему вы получаете ip адрес и передаете данные с одной машины на другую отвечает операционная система.

Поэтому тут есть два этапа - настройка виртуального ethernet шнура и настройка OS что бы шнур правильно маршнутизировался.

Настройка виртуального шнура сводится к следующим этапам:

1) openvpn создает обычное tcp соединение к вашему ADSL модему по порту 1194 (openvpn порт)
2) модем перебрасывает соединение на ваш внутренний сервер fedora на порт 1194
3) сервер федора передает управление openvpn запущенной службе и инициализируется позволяя передавать данные по этому каналу.

К слову будет сказано что данноые tcp соединение может быть udp (что несколько быстрей) но некоторые фирмы могут вам мешать передавать udp пакеты, так что для большей совместимости оставте тип соединения tcp. А в некоторых случаях было бы хорошо на строить переадерсацию не 1194 порта а 80 порта на порт 1194, что позволит замаскировать вашу виртуальную сеть под псевдо WWW сервер.

Далее начинается вторая часть настройка OS что бы она правильно маршрутизиоровала данные.

Клиентская сторона обычно не требует дополнительной настройки или делает это спомощью красивых графических интерфейсов. А вот серверная, о которой я пишу статью, делает эту работу очень хорошо но через консоль.

Так что бы ваш виртуальный ethernet шнур начал работать правильно в федоре его необходимо соединить с вашей физической сетью. Делается это мостом (bridge).

Для этого необходимо создать\настроить несколько файлов:

Файл моста с фиксированным адресом:

/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
BOOTPROTO=none
BROADCAST=192.168.54.255
HWADDR=00:11:44:34:b2:68
IPADDR=192.168.54.3
IPV6INIT=yes
IPV6_AUTOCONF=yes
NETMASK=255.255.255.0
NETWORK=192.168.54.0
ONBOOT=yes
NM_CONTROLLED=no
TYPE=Bridge
GATEWAY=192.168.54.1
METRIC=10

Физический интерфейс который соединяется с виртуальным посредством моста.
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
BRIDGE=br0
BOOTPROTO=dhcp

Виртуальный кончик ethetner соедения который приходит с интернета, так же подключается к тому же bridge = br0
/etc/sysconfig/network-scripts/ifcfg-tap0
DEVICE=tap0
DEVICETYPE=ovpn
ONBOOT=yes
BRIDGE=br0
BOOTPROTO=dhcp
USERCTL=yes

Далее, так что бы после включения вашего сервера с федорой, данные интерфейсы правильно инициализировались, необходимо добавить скрипт:

/etc/sysconfig/network-scripts/ifup-ovpn
#!/bin/bash

. /etc/init.d/functions

cd /etc/sysconfig/network-scripts
. ./network-functions

[ -f ../network ] && . ../network

CONFIG=${1}

need_config ${CONFIG}

source_config

/usr/sbin/openvpn --mktun --dev ${DEVICE}

if [ -n "${BRIDGE}" -a -x /usr/sbin/brctl ]; then
     if ! LC_ALL=C /usr/sbin/brctl show | LC_ALL=C grep -q "^${BRIDGE} "; then
         /usr/sbin/brctl addbr ${BRIDGE} 2>/dev/null
     fi
     /sbin/ip addr flush dev ${DEVICE} 2>/dev/null
     /sbin/ip link set dev ${DEVICE} up
     if [ -n "$ETHTOOL_OPTS" ] ; then
       /sbin/ethtool -s ${REALDEVICE} $ETHTOOL_OPTS
     fi
     [ -n "${LINKDELAY}" ] && /bin/sleep ${LINKDELAY}
     /usr/sbin/brctl addif ${BRIDGE} ${DEVICE}
     # Upon adding a device to a bridge,
     # it's necessary to make radvd reload its config
     [ -r /var/run/radvd/radvd.pid ] && kill -HUP `cat /var/run/radvd/radvd.pid`
     exit 0
fi


/etc/sysconfig/network-scripts/ifdown-ovpn
#!/bin/bash

. /etc/init.d/functions

cd /etc/sysconfig/network-scripts
. ./network-functions

[ -f ../network ] && . ../network

CONFIG=${1}

source_config

/usr/sbin/openvpn --rmtun --dev ${DEVICE}
retcode=$?

exit $retcode

Теперь после запуска службы service network она автоматически поднимет ваш мост и добавит в него два интерфейса eth0 (физический) tap0 (виртуальный). Как раз на последний и будет происходит передача всей информации с виртуального ethernet кабеля.

После того как настроена openvpn и fedora все должно работать. Теперь более внимательно посмотрим на настройку клиентов\серверов openvpn.

Настройка openvpn на сервере сводится к следующему:

1) создание сертификатов\ключей
2) создание настройки сервера.

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

Несмотря на то что мы отказываемся от использования сертификатов для идентификакации клиентов нам необходимо пройти этап создания сертификатов. Почему это? Дело в том что openvpn это очень безопасный впн демон\клиент и несмотря на то что вы хотите использовать локальные имена пользователей как клиентов сервера, клиент подседеняющийся к серверу хочет быть удостоверенным в том что он общается именно с тем сервером который необходим. Что бы быть увеременным в этом, клиент используя полученный сертификат ca.crt проверят подлинность сертификата получаемого с сервера (mini.crt) который должен быть обязательно подписан указанным сертификатом хранилища (ca.crt). С технической точки зрени это этап (создание и подписывания сертификатов) может быть пропущен. ОДнако, такой опции в настройках я не нашел и это выглядит как не обязательный но важный шаг в безопасности. (Такая схема подключения с сертификатами исключает проникновение внутрь соеденения между вами и vpn сервером).

Итак создание сертификатов.

Для этого перейдите в директорию /usr/share/openvpn/easy-rsa/2.0/ и выполните следующие команды:

# cd /usr/share/openvpn/easy-rsa/2.0/
# . ./vars
# ./clean-all
# ./build-ca
# ./build-inter $( hostname | cut -d. -f1 )
# ./build-dh
# mkdir /etc/openvpn/keys
# cp -ai keys/$( hostname | cut -d. -f1 ).{crt,key} keys/ca.crt keys/dh1024.pem /etc/openvpn/keys/


После чего создайте файл настроек:

/etc/openvpn/tap0.conf
proto tcp-server
mode server
tls-server

dev tap0

plugin /usr/lib/openvpn/plugin/lib/openvpn-auth-pam.so login
client-cert-not-required
username-as-common-name

ca keys/ca.crt
cert keys/mini.crt
key keys/mini.key  # This file should be kept secret
dh keys/dh1024.pem

client-to-client
duplicate-cn
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

Этих действий на стороне сервера достаточно. Запускайте openvpn и не забудте добавить его в службы активируемые при запуске, а только что созданные скрипты пометьте как исполняемые:

# chkconfig --level 2345 openvpn on
# chmod +x /etc/sysconfig/network-scripts/ifdown-ovpn
# chmod +x /etc/sysconfig/network-scripts/ifup-ovpn

Теперь поверьте что мост создан успешно (обязательно наличие br0 [eth0, tap0]:


# /etc/init.d/network restart
# brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.00112474b268    no        eth0
                            tap0
virbr0        8000.000000000000    yes   
#

Так же вы можете проверить что служба Openvpn запускается:

# /etc/init.d/openvpn restart


Действия на стороне клиента достаточно простые. Вам неоходимо установить openvpn клиент с сайта (openvpn.net) И использовать либо графические утилиты для подключения либо следующий конфиг файл:

client.conf
client
dev tap

proto tcp
remote server.name.com 1194
resolv-retry infinite

nobind

persist-key
persist-tun

ca ca.crt
auth-user-pass
comp-lzo
verb 3

Как вы видите все что потребуется на клиенте это client.conf и файл ca.crt с сервера из папки /etc/openvpn/keys/ca.crt

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

Добавить пользователй можно командой:

# useradd name
# passwd name

5 коммент.:

  1. Опечаточка.
    Неправильно: подседеняющийся к серверу...
    Правильно: подсоединяющийся к серверу...

    ОтветитьУдалить
  2. Я извиняюсь, много опечаток. Прогоните пожалуйста текст через спелл-чекер. Напр. OpenOffice Writer с русским словарём.

    ОтветитьУдалить
  3. Я в курсе. Это стиль журнала рабочих ЧЕРНОВИКОВ.

    ОтветитьУдалить
  4. Выполнил всё по инструкции. Не пошло.
    1. Надо отключить или сконфигурировать SELinux.
    Я отключил. Для этого отредактировал файл /etc/selinux/config. Поставил там строку
    SELINUX=disabled. Затем рестартнул систему.

    2. Всё равно не пошло. Не стартует openvpn. Сообщение: "Cannot load certificate file keys/mini.crt: и т.д"
    Вроде бы мы действительно не генерировали файл mini.crt. откуда он должен взяться?

    ОтветитьУдалить
  5. Может ваш хост называется mini?
    Тогда этот файл создается в процессе выполнения команды:
    # ./build-inter $( hostname | cut -d. -f1 )

    ОтветитьУдалить