Главная > IT > OpenVPN-server

OpenVPN-server

Ершов Илья
Создание единого адресного пространства (Ubuntu Server 8.04+OpenVPN)
20 января 2010

Недавно встала передо мной задача создать единое информационное пространство между двумя удаленными офисами. Также надо было поднять в филиале проксю и выпустить всех пользователей в глобальную сеть через нее. В качестве прокси решено было заюзать SQUID, для создания единого пространства напрашивался VPN. Железок типа Cisco там нет, поэтому придется использовать софтовый VPN. Знакомый линуксоид сказал: «Пользуй openVPN», направив меня тем самым меня в google.

Гуглить пришлось не долго. В сети полно конфигов как openVPN-сервера, так и клиента.
Итак. Имеем следующую конфигурацию сети:

В основном офисе openVPN-сервер имеет адрес 192.168.10.1. Он также выполняет функции прокси-сервера и почтового сервера. В филиале будет сеть 192.168.20.0/24, где шлюз будет иметь адрес 192.168.10.1. Также в филиале поднимем DHCP-сервер. Для VPN-сети будем использовать сеть 10.10.20.0, где сервер будет иметь адрес 10.10.20.1, а клиент (шлюз филиала) — 10.10.20.2.
Приступим к установке и настройке openVPN-сервера.

sudo apt-get install openvpn

Теперь непосредственно настройка. Нам необходимо сгенерировать сертификат и ключи для сервера и клиента. Для начала создадим папку, где будем хранить ключи:

sudo mkdir /etc/openvpn/keys

Настраиваем параметры для генерации сертификата и ключей:

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/

Правим файл vars. Необходимо исправить последние 5 строчек, относящихся к вашей организации, и поправить параметр export KEY_DIR="/etc/openvpn/keys";
Переходим к генерации:

sudo source ./vars
sudo ./clean-all
sudo ./build-dh
sudo ./pkitool --initca
sudo ./pkitool --server server
sudo ./pkitool client

В итоге получаем в каталоге /etc/openvpn/keys полный набор сертификатов и ключей.
Теперь нарисуем когфиг сервера. Необходимо в каталоге /etc/openvpn создать файл server.conf со следующим содержанием:

dev tun
tls-server
#Протокол обмена
proto udp
#Порт
port 1194
#Использовать сжатие
comp-lzo
persist-tun
persist-key
#Настраиваем адреса в виртуальной сети
ifconfig 10.10.20.1 10.10.20.2
#Прописываем на сервере маршрут до сети филиала
route 192.168.20.0 255.255.255.0
#Рассказываем клиенту, как добраться до сети офиса
push "route 192.168.10.0 255.255.255.0 10.10.20.1"
#Прописываем ключи и сертификаты
dh keys/dh1024.pem
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
#Куда пишем лог
log /var/log/openvpn.log
#На сколько подробный лог писать
verb 3

Теперь правим firewall:

#Заворачиваем трафик на проксю
iptables -t nat -A PREROUTING -s 192.168.10.0/24 -d ! 192.168.10.1 -p tcp --dport 80 -j REDIRECT --to-ports 3128
#Натим
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source external_ip
#Маскируем входящий vpn-трафик
iptables -t nat -A POSTROUTING -s 10.10.20.2 -d 192.168.10.0/24 -j MASQUERADE
#Правила для форвардинга
iptables -A FORWARD -i eth1 -s 192.168.10.0/24 -d 0/0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -d 192.168.10.0/24 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -p ALL -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
#Разрешаем SSH, SMTP, HTTP, IMAP, PROXY
iptables -A INPUT -p TCP -s 0/0 -m multiport --dport 22,25,80,143,443,3128,8080 -j ACCEPT
iptables -A INPUT -p TCP -s 0/0 -m multiport --sport 22,25,80,443,3128 -j ACCEPT
#Разрешаем подключение по VPN
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
#Разрешаем DNS
iptables -A INPUT -p UDP -s 0/0 --sport 53 -j ACCEPT
iptables -P INPUT DROP
#На выход все разрешено
iptables -P OUTPUT ACCEPT

Собственно, с сервером все. Для того, чтобы он принял параметры, делаем:

sudo /etc/init.d/openvpn restart

Переходим к настройке VPN-клиента.
Ставим openVPN:

sudo apt-get install openvpn

Далее создаем каталог для сертификата и ключей.

sudo mkdir /etc/openvpn/keys

Теперь необходимо скопировать с openVPN-сервера следующие файлы и положить их в созданную папку:

ca.crt
client.key
client.crt

Создаем в каталоге /etc/openvpn конфигурационный файл для клиента с именем client.conf следующего содержания:

client
dev tun
proto udp
ifconfig 10.10.20.2 10.10.20.1
remote external_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
log /var/log/openvpn.log
comp-lzo
verb 3

Параметры сходны с аналогичными для сервера. Единственное отличие — параметр remote, в котором указывается внешний ip-адрес openVPN-сервера и порт.
Далее правим firewall.

iptables -t nat -A PREROUTING -s 192.168.20.0/24 -d ! 192.168.20.1 -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o eth0 -j SNAT --to-source external_ip
iptables -A FORWARD -i eth1 -s 192.168.20.0/24 -d 0/0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -d 192.168.20.0/24 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -p ALL -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
iptables -A INPUT -p TCP -s 0/0 -m multiport --dport 22,25,80,143,443,3128,8080 -j ACCEPT
iptables -A INPUT -p UDP -s 0/0 --sport 53 -j ACCEPT
iptables -A INPUT -p TCP -s 0/0 -m multiport --sport 22,25,80,443,3128 -j ACCEPT
iptables -A INPUT -i eth1 -p UDP --sport 68 --dport 67
iptables -A INPUT -p udp --sport 1194 -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun+ -p ALL -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

После этого рестартуем openvpn

sudo /etc/init.d/openvpn restart

И пробуем пинговать хосты из различных сетей.
Настраиваем DHCP-сервер на шлюзе филиала. Будем использовать dhcp3-server

sudo apt-get install dhcp3-server

Правим конфигурационный файл /etc/dhcp3/dhcp.conf. Создадим пул для нашего сегмента:

subnet 192.168.20.0 netmask 255.255.255.0 {
range 192.168.20.30 192.168.20.254;
option domain-name-servers DNS_Server1_IP_address, DNS_Server2_IP_address;
option domain-name "DOMAIN.ORG";
option routers 192.168.20.1;
default-lease-time 600;
max-lease-time 7200;
}

Рестартуем DHCP-сервер для применения изменений:

sudo /etc/init.d/dhcp3-server restart

Клиенты должны получать адреса от него.

1. Ubuntu & OpenVPN на OpenNET
2. Настройка OpenVPN в Ubuntu
3. Полный разбор файла конфигурации OpenVPN
4. Iptables на OpenNET

Реклама
Метки: , ,
  1. 10.02.2010 в 14:04

    Я так понимаю деление на клиент и сервер условное? Или «сервер» в смысле тот у кого dhcp?) Пакет ведь ставится один и тот же.

    Везет тебе, подработкой обзавелся. Полтишок уже срубил?:)

  2. Ozzy
    10.02.2010 в 14:30

    Нет, DHCP поднят для конфигурирования хостов в удаленной сети.
    В OpenVPN сервере тот, у кого есть правильно настроенный файлик — server.conf, остальные — имеют конфигурационный файл client.conf, соответствующие сертификаты — клиенты.

  3. Alex
    12.12.2010 в 21:47

    я так понял что весь трафик нужно было пустить через одну проксю? Если да — то почему в листинге iptables для сервера и для клиента такие правила (для сервера понятно):
    у сервера: iptables -t nat -A PREROUTING -s 192.168.10.0/24 -d ! 192.168.10.1 -p tcp —dport 80 -j REDIRECT —to-ports 3128
    У клиента: iptables -t nat -A PREROUTING -s 192.168.20.0/24 -d ! 192.168.20.1 -p tcp —dport 80 -j REDIRECT —to-ports 3128
    То есть как я понял используется два сервера прокси?
    Или я что-то не понял?

    • Ozzy
      13.12.2010 в 10:29

      Все верно. В каждом отделении свой интернет и своя прокся.

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: