понедельник, 7 апреля 2014 г.

Подключение видеонаблюдения в сети 3G через OpenVPN сервер на VDS с белым адресом.

Задача: нужен доступ к видеорегистратору за серым адресом сети 3G.
3G находится за натом, поэтому напрямую подключиться не можем (либо платим ежемесячно за выделение нам белого адреса, что не хочется). Нужен белый адрес. Есть сервер Windows 2008 R2 на VDS с белым адресом. Его будем использовать как сервер OpenVPN. В качестве клиента OpenVPN будет роутер с возможностью подключения 3G модема, с возможностью установки альтернативной прошивки, например DD-WRT. Был использован TP-Link. Также на самом Windows сервере просматривать видео не желательно (тормозит из-за видеокарты), поэтому будет еще один OpenVPN клиент, на котором будет просматриваться видео.

Устанавливаем сервер OpenVPN. Генерируем сертификаты, ключи. При генерации обращаем внимание на Common Name, Name задаем соответствующие server, client1, client2. Вновь созданный после инсталляции TAP-адаптер переименовываем в "OpenVPN".

Выбираем какой туннель нам создавать TUN или TAP. Из википедии:
TAP работает как Ethernet устройство на канальном уровне модели OSI, оперируя кадрами Ethernet. TUN (сетевой туннель) работает на сетевом уровне модели OSI, оперируя IP пакетами. TAP используется для создания сетевого моста, тогда как TUN для маршрутизации.

NB 25.11.2014 <
Из настройки OpenVPN параметр:
--ifconfig [l] [rn]

Настройка параметров TUN/TAP. [l] это локальный IP-адрес. Для TUN устройста [rn] это IP адрес удаленного узла. Для TAP устройств [rn] маска виртуальной подсети.

Для TUN устройств, представляющих виртуальное соединение точка-точка, необходимо использовать два приватных IP адреса, не входящих в существующие подсети. IP адреса могут быть последовательные. После подключение к VPN, пинг [rn] будет идти через VPN.

Для TAP устройств, представляющего из себя виртуальный ethernet сегмент, --ifconfig используется для указания IP-адреса и маски, как на обычном ethernet устройстве. Если подключаетесь к удаленному сетевому мосту, то IP-адрес и маска должны быть указаны допустимыми на стороне моста.

Server configuration file

dev tun
ifconfig 10.8.0.1 10.8.0.2
secret static.key

Client configuration file

remote myremote.mydomain
dev tun
ifconfig 10.8.0.2 10.8.0.1
secret static.key
> NB 25.11.2014 

Выбираю TUN и протокол UDP.
Разрешаем UDP трафик в брандмауэре сервера Windows по порту 1194. Создаем файл конфигурации server.ovpn:

dev tun
dev-node "OpenVPN"
proto udp
port 1194

ca "C:\\Program Files\\OpenVPN\\config\\keys\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\keys\\server.crt"
key "C:\\Program Files\\OpenVPN\\config\\keys\\server.key"
dh "C:\\Program Files\\OpenVPN\\config\\keys\\dh1024.pem"

topology subnet

cipher AES-128-CBC
comp-lzo
mssfix
keepalive 10 120
status "C:\\Program Files\\OpenVPN\\log\\openvpn-status.log"
log "C:\\Program Files\\OpenVPN\\log\\openvpn.log"
verb 3

server 10.8.0.0 255.255.255.0
ifconfig 10.8.0.1 255.255.255.0
route-gateway 10.8.0.1

client-to-client
client-config-dir ccd
route 192.168.1.0 255.255.255.0 10.8.0.2 1
route 192.168.0.0 255.255.255.0 10.8.0.3 1

В каталоге ccd (C:\Program Files\OpenVPN\config\ccd\)
Файл client1 (имя файла по названию ключа клиента) с таким содержимым
ifconfig-push 10.8.0.2 255.255.255.0
iroute 192.168.1.0 255.255.255.0

Файл client2 (имя файла по названию ключа клиента) с таким содержимым
ifconfig-push 10.8.0.3 255.255.255.0
iroute 192.168.0.0 255.255.255.0

В конфигурации использую topology subnet, что позволяет конфигурировать внутреннюю OpenVPN сеть как обычную link:
Задаю саму сеть: server 10.8.0.0 255.255.255.0
Задаю IP-сервера и шлюз:
ifconfig 10.8.0.1 255.255.255.0
route-gateway 10.8.0.1
Задаю в файлах client1, client2 IP-адреса клиентов OpenVPN (здесь отличие от стандартной конфигурации, т.е. не ifconfig 10.8.0.2 10.8.0.1): 
ifconfig-push 10.8.0.2 255.255.255.0
ifconfig-push 10.8.0.3 255.255.255.0
В конфигурации сервера задаю маршруты к локальным сетям клиентов OpenVPN
(route IP mask GW metric):
route 192.168.1.0 255.255.255.0 10.8.0.2 1
route 192.168.0.0 255.255.255.0 10.8.0.3 1
И позволяю клиентам видеть друг друга: client-to-client
Также клиентам нужно будет добавить через push маршруты к сетям друг друга:
client1
ifconfig-push 10.8.0.2 255.255.255.0
iroute 192.168.1.0 255.255.255.0
push "route 192.168.0.0 255.255.255.0"

client2
ifconfig-push 10.8.0.3 255.255.255.0
iroute 192.168.0.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"

Для клиента OpenVPN на ОС Ubuntu конфиг такой:
client
dev tun
proto udp
remote 11.22.33.44 (внешний IP)
port 1194
ca /etc/openvpn/keys/ca.crt
key /etc/openvpn/keys/client2.key
cert /etc/openvpn/keys/client2.crt
cipher AES-128-CBC
nobind
comp-lzo
persist-key
persist-tun
log /etc/openvpn/log/openvpn.log
status /etc/openvpn/log/openvpn-status.log
verb 3

Таблица маршрутизации на сервере после подключения:
route print
10.8.0.0          255.255.255.0         On-link          10.8.0.1    286
192.168.0.0    255.255.255.0         10.8.0.3         10.8.0.1     30
192.168.1.0    255.255.255.0         10.8.0.2         10.8.0.1     30

После создания туннеля таблица маршрутизации на клиенте с ОС Ubuntu с адресом 192.168.0.10 без доступа к сети другого клиента (в сети есть свой роутер с адресом 192.168.0.1):
$ ip route show
default via 192.168.0.1 dev if2  metric 100
10.8.0.0/24 dev if100  proto kernel  scope link  src 10.8.0.3
192.168.0.0/24 dev if2  proto kernel  scope link  src 192.168.0.10

Чтобы клиент OpenVPN был роутером для своей локальной сети, включаем маршрутизацию пакетов echo 1 > /proc/sys/net/ipv4/ip_forward и в /etc/sysctl.conf раскомментировать net.ipv4.ip_forward=1
А также надо включить NAT.

sudo iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

Настройка OpenVPN соединения на роутере TP-Link с прошивкой DD-WRT проста. В Services - VPN включаем клиента OpenVPN и вводим IP-адрес сервера OpenVPN и порт 1194, выбираем tun, udp, шифрование AES-128 SHA1, как на сервере. Advanced settings не включаем. Вставляем содержимое файлов ca.crt, client1.crt, client1.key в соответствующие области.
Аналогичная настройка NAT на роутере TP-Link, как и на клиенте под Ubuntu. Вводим в Commands строку:

iptables -t nat -A POSTROUTING -o br0 -s 10.8.0.0/24 -j MASQUERADE

нажимаем "Save Firewall".  Где интерфейс br0 - это интерфейс с локальным IP-адресом роутера 192.168.1.1. Увидеть интерфейсы роутера, как и в Linux, можно введя ifconfig и нажав "Run Commands"


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

Отправить комментарий