Настройка OpenVPN в bridge с физическим линком

()

Настройка OpenVPN в bridge с физическим линком это достаточно простая задача, хотя и с парой хитрых моментов, но сначала разберёмся зачем же это может быть надо? Ну во-первых мы можем раздавать пользователям адреса непосредственно из адресного пространства локальной сети предприятия, что в ряде случаев бывает важно. Во-вторых мы можем объединить openvpn-интерфейс в bridge с внешним линком сервера и выдавать клиентам реальные IP-адреса, что позволит например "вывести" наружу сервера, находящиеся в силу каких-то причин за NAT.

Приступим к решению задачи. Мы будем рассматривать установку OpenVPN-сервера на сервере под управленим Debian Squeze и двумя физическими интерфейсами:

  • внешний: eth0 c адресом 1.1.1.2/24 и маршрутом по умолчанию через 1.1.1.1;
  • внутрений: eth1 с адресом 192.168.192.1/24

Будем настраивать OpenVPN-сервер, который раздаёт клиентам адреса из диапазона 192.168.192.100-192.168.192.150. Установим необходимые пакеты:

apt-get install openvpn bridge-utils

Теперь гаисм eth1:

ifdown eth1

Открываем "/etc/network/interfaces" и пишем конфигурацию для br0, предварительно закомментировав конфигурацию для eth1:

#auto eth1
#iface eth1 inet static
#    address 192.168.192.1
#    netmask 255.255.255.0
#    network 192.168.192.0
#    broadcast 192.168.192.255


auto br0
iface br0 inet static
    bridge_ports eth1
    bridge_fd 0
    address 192.168.192.1
    netmask 255.255.255.0
    network 192.168.192.0
    broadcast 192.168.192.255

Теперь поднимаем br0:

ifup br0

Если на сервере был настроен iptables то во всех правилах надо заменить eth1 на br0, а так же добавить ещё одно правило, разрешающие трафик внутри групп интерфейсов, собранных в bridge:

iptables -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT

Приступаем к настройке собственно OpenVPN-сервера. Сперва сгенерируем ключи для OpenVPN-сервера и клиентов точно так, как было описано в этой статье. Далее создадим файл "/etc/openvpn/server.conf", следующего содержания:

# Здесь четыре параметра:
# 1. Адрес локального интерфейса, включаемого в бридж
# 2. Маска сети
# 3. Начало динамического диапазона для клиентов
# 4. Конец динамического диапазона для клиентов
server-bridge 192.168.192.1 255.255.255.0 192.168.192.100 192.168.192.150

# Снимите комментарий если хотите ВЕСЬ клиентский трафик пустить через сервер
#push "redirect-gateway 192.168.192.1"

# Сервер работает в режиме демона
daemon

# Случаеш порт 443/tcp
port 443
proto tcp-server

# Использует интерфейс tap0
dev tap0

# Сертификаты сервера
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem

# Просим клиента использовать сжатие
push "comp-lzo yes"

# И сами тоже его используем ;)
comp-lzo

# Посылать пакеты для поддержки соединения каждые 10 секунд
# И инициировать переподключение в случае отсутствия ответов в течении двух минут
keepalive 10 120

# Разрешаем клиентам обмениаваться трафиком между собой
client-to-client

# Не перечитывать ключи постоянно а держать их в памяти
persist-key

# Не закрывать сетевой интерфейс при переинциализации соединения
persist-tun

# Уровень информативности лога
verb 3

# Файл лога
log-append /var/log/openvpn-server.log

# Уровень безопасности. Как минимум нужна возможность запускать скрипты при старте
script-security 2

# Скрипт, запускаемый при поднятии интерфейса
up /etc/openvpn/server_up.sh

Хотя OpenVPN и поддерживает работу с интерфейсами, являющимися частью bridge, но по умолчанию интерфейс находится в состоянии "down" и не добавлен в bridge, по этому создаём ещё скрипт "/etc/openvpn/server_up.sh", который будет выполняться при старте сервера и "доделывать" работу по инициализации схемы:

#!/bin/sh

# Переводим интерфейс в состояние "up"
/sbin/ifconfig tap0 up
# Добавляем его в br0
/usr/sbin/brctl addif br0 tap0

Запускаем сервер:

invoke-rc.d openvpn start

На клиенте конфигурация будет выглядеть примерно так:

# Режим клиента
client

# Используем интерфейс tap0
dev tap0

# Куда подключаемся
remote 1.1.1.1 443

# Используем протокол tcp
proto tcp

# Ключи
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/home.crt
key /etc/openvpn/keys/home.key

# Не перечитывать ключи постоянно а держать их в памяти
persist-key

# Не закрывать сетевой интерфейс при переинциализации соединения
persist-tun

# Используем сжатие
comp-lzo

resolv-retry infinite
nobind
ns-cert-type server

# Уровень информативности лога
verb 3

# Файл лога
log-append /var/log/openvpn-client.log

Если вы хотите раздавать реальные IP-адреса то надо настраивать bridge уже для eth0, ну и разумеется запросить у провайдера адреса, которые вы и будете раздавать.

На этом всё. Приятной работы!

Ключевые слова: openvpn, bridge, ethernet.

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

Anonymous 2012-07-28 15:26:13 (#)

спасибо, очень помогла эта статья

Anonymous 2013-05-23 10:19:43 (#)

Спасибо за информацию, очень интересно прикручен server_up.sh Если не сложно, допишите как эта работа (как server_up.sh) реализована на стороне клиента. Не хватает теоретических знаний, которые в оригинале ну Очень трудно доходят. :-)

MooSE 2013-05-28 23:34:36 (#)

Цитата:

Спасибо за информацию, очень интересно прикручен server_up.sh Если не сложно, допишите как эта работа (как server_up.sh) реализована на стороне клиента. Не хватает теоретических знаний, которые в оригинале ну Очень трудно доходят. :-)

Не совсем понял вопрос. Интересует способ собрать бридж и на клиенте тоже? Или что?

Anonymous 2014-11-05 18:54:45 (#)

Класс, спасибо.
Можно дополнить статью или как сделать, чтоб клиентам выдавались статические IP, а не из пула?

MooSE 2014-11-06 23:07:36 (#)

Цитата:

Класс, спасибо.
Можно дополнить статью или как сделать, чтоб клиентам выдавались статические IP, а не из пула?


Тут надо копать в сторону параметра "ccd".

Anonymous 2014-11-07 16:46:55 (#)

Можно подробнее?

MooSE 2014-11-11 05:36:47 (#)

Цитата:

Можно подробнее?


В документации написано буквально следующее:
Цитата:


--client-config-dir dir
Specify a directory dir for custom client config files. After a connecting client has been authenticated, OpenVPN will look in this directory for a file having the same name as the client's X509 common name. If a matching file exists, it will be opened and parsed for client-specific configuration options. If no matching file is found, OpenVPN will instead try to open and parse a default file called "DEFAULT", which may be provided but is not required. Note that the configuration files must be readable by the OpenVPN process after it has dropped it's root privileges.
This file can specify a fixed IP address for a given client using --ifconfig-push, as well as fixed subnets owned by the client using --iroute.

One of the useful properties of this option is that it allows client configuration files to be conveniently created, edited, or removed while the server is live, without needing to restart the server.


Пример конфигурации с client-config-dir есть тут
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE