Настройка 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, ну и разумеется запросить у провайдера адреса, которые вы и будете раздавать.
На этом всё. Приятной работы!
Anonymous 2012-07-28 15:26:13 (#)