If i help You, send me BTC please 1CJGz4UGyL7hTjPeN8j7fu9LRmmWiWSRHi

OpenVPN, Ubuntu, Iptables.

Постов 110 из 175

Я понимаю, что данная статья является 100500-ой по счету, но в нужный момент такая статья мне в гугле не нашлась, пришлось 2 дня судорожно метаться от мануалов по OpenVPN и Iptables обратно к гуглу в надежде найти готовое рабочее решение.
Итак, исходные данные:
есть 2 локальных сети — сеть1: 192.168.0.0/24 и сеть2: 192.168.1.0/24.
У каждой сети есть шлюз в интернет на базе Ubuntu (у меня 10.04, но это вроде не принципиально).
Шлюз сети 1 : два сетевых интерфейса: eth1 с внешним реальным ip-адресом 1.1.1.1 и eth0 с локальным ip-адресом 192.168.0.1.
Шлюз сети 2 : два сетевых интерфейса: eth1 с внешним реальным ip-адресом 2.2.2.2 и eth0 с локальным ip-адресом 192.168.1.1.
На шлюзе сети 1 установим Firestarter (для тех кто не в курсе — самый простой и понятный графический интерфейс к фаерволу iptables). Firestarter у меня будет раздавать интернет в локальную сеть, пробрасывать и открывать в мир нужные порты, закрывать локальную сеть 1 от внешних угроз.
1. Устанавливаем Firestarter.

sudo apt-get install firestarter

Если до этого собственно фаервол (iptables) не был установлен, то firestarter его сам доустановит, а также переинициализирует системную переменную /proc/sys/net/ipv4/ip_forward, которая должна быть = 1 для того, чтобы пакеты могли ходить между интерфейсами шлюза.
2. Запускаем и настраиваем Firestarter.
В терминале:

sudo firestarter

Нажимаем вперед.
На втором окне предложено выбрать из выпадающего списка сетевой интерфейс, к которому подключен провайдер интернета. Вперед.

На третьем окне нужно поставить галочку Enable internet connection sharing и выбрать интерфейс, к которому подключена локальная сеть.
В последнем окне просто нажать кнопку «Сохранить».
Теперь локальная сеть 1 получает интернет. Кстати, для того чтоб понять какие правила нужно добавлять в iptables по-умолчанию, можно рассмотреть правила формируемые firestarter, для чего после настройки firestarter экспортировать и просмотреть полученный конфиг-файл:

sudo iptables-save > /etc/iptables.rules

На этом шлюзе у меня будет стоять OpenVPN client. Для его работы добавим в фаервол правила, разрешающие пересылку пакетов через виртуальный интерфейс туннеля OpenVPN:

sudo iptables -A INPUT -i tun+ -j ACCEPT
sudo iptables -A OUTPUT -o tun+ -j ACCEPT
sudo iptables -A FORWARD -i tun0 -j ACCEPT
sudo iptables -A FORWARD -o tun0 -j ACCEPT

Так как при перезагрузке компьютера firestarter не должен забыть эти правила, запишем их в специальный файл /etc/firestarter/user-pre, который подгружается в дополнение к основному конфигу, созданному через GUI.
На шлюзе сети 2 я не ставил Firestarter, а поставил iptables:

sudo apt-get install iptables

Затем разрешил пересылку пакетов между интерфейсами:

sudo -s
echo 1 > /proc/sys/net/ipv4/ip_forward

Затем добавил правила для расшаривания интернета в локальную сеть и пересылки пакетов через виртуальный интерфейс. На этом шлюзе у меня будет стоять OpenVPN Server:

sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
sudo iptables -A INPUT -i tun0 -j ACCEPT
sudo iptables -A FORWARD -i tun0 -j ACCEPT
sudo iptables -A FORWARD -o tun0 -j ACCEPT

Затем добавляем все остальные правила, необходимые для работы, например, проброс порта в сеть, ssh:

sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 3389 -i eth1 -j DNAT --to 192.168.1.50:3389
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A FORWARD -m tcp -p tcp -d 192.168.1.50 --dport 3389 -j ACCEPT

Чтобы на этом компьютере правила фаервола загрузились после перезагрузки компьютера, я сначала сохранил их в файл:

sudo iptables-save > /home/alex/.iptables.rules

а затем внес в конец файла /etc/network/interfaces строку:

pre-up iptables-restore < /home/alex/.iptables.rules

Фаерволы подготовили, интернет в обоих сетях есть, теперь настроим туннель. Для этого на обоих шлюзах выполняем в терминале:

sudo apt-get install openvpn

Далее на шлюзе сети 2 в текстовом редакторе (я в vi) создаем файл конфигурации OpenVPN server:

sudo vi /etc/openvpn/server.conf

такого содержания:

dev tun0 #тип виртуального интерфейса
tls-server
mode server #говорим парсеру конфиг-файла что эта машина у нас сервер
port 1194 #порт авторизации для клиентов
proto udp #протокол
ifconfig 192.168.254.1 192.168.254.2 #виртуальный адрес сервера и клиента
route 192.168.0.0 255.255.255.0 # маршрут до сети клиента
ca /etc/openvpn/ca.crt #путь до доверенного сертификата
cert /etc/openvpn/server.crt #путь до сертификата сервера
key /etc/openvpn/server.key #путь до ключа сервера
dh /etc/openvpn/dh1024.pem #путь до параметра Диффи-Хэлмана
keepalive 10 120 # пинг каждые 10 секунд, и закрытие соединения через 120 секунд отсутствия ответных пакетов)
comp-lzo # использование LZO-компрессии трафика
user nobody
group nogroup
persist-key
persist-tun # не закрывать/открывать по-новой tun-устройство при получении сигнала SIGUSR
status openvpn-status.log
log-append openvpn.log # логи соединения
verb 4 # уровень детализации логов

далее переходим к генерированию сертификатов:

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

становимся суперпользователем, очищаем каталог от ненужного старого и генерируем корневой сертификат:

sudo -s
source ./vars
./clean-all
./build-ca

Далее генерируем сертификат и ключ сервера:

./build-key-server server

Далее создаем сертификат и ключ клиента (обязательно с уникальным именем, в данном случае client1):

./build-key client1

Далее генерируем параметры Диффи-Хэлмана:

./build-dh

Далее переносим файлы ca.crt, server.crt, dh1024.pem, server.key из каталога /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys в каталог /etc/openvpn машины, где у нас OpenVPN server (шлюз сети 2) и файлы ca.crt, client1.crt, client1.key в каталог /etc/openvpn машины, где у нас OpenVPN client (шлюз сети 1).
Далее на шлюзе сети 1 в текстовом редакторе (я в vi) создаем файл конфигурации OpenVPN client:

sudo vi /etc/openvpn/client.conf

такого содержания:

remote 2.2.2.2 # реальный IP адрес сервера
port 1194
tls-client
dev tun
proto udp
persist-key
persist-tun
ifconfig 192.168.254.2 192.168.254.1 # виртуальный адрес клиента и сервера
route 192.168.1.0 255.255.255.0 # маршрут к сети сервера
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client11.crt
key /etc/openvpn/client11.key
comp-lzo
verb 4
mute 20
log-append openvpn.log

Далее запускаем сервис OpenVPN, выполнив на сервере и на клиенте:

sudo service openvpn start

Туннель должен подняться.
Если что-то пошло не так, то смотрим в файл лога

sudo vi /etc/openvpn/openvpn.log

Основные источники, использованные при написании статьи:

OpenVPN 2.1 manual
Настройка туннеля на FreeBSD.
HowTo Openvpn с форума убунты.
Объединение филиалов в одну сеть.

Для варианта, когда нужно объединить 2 и более сети с помощью openvpn я дописал заметку.

, , ,

Tren16/03/2012 at 18:38Reply

У вас есть обратная связь? Или почта, я хочу вопрос задать по ubuntu.

alex17/03/2012 at 14:00Reply

Спрашивайте! отвечаю) или письмом на [email protected]

Андрей22/05/2013 at 10:43Reply

Сертификат создан для client1, а получатель client11. А так — зачот

denis01/10/2013 at 11:53Reply

Добрый день!
Прошу помочь:
1. имею ёпту с серым адресом
2. есть vpn сервер с пробросом порта на vpn клиент на базе dd-wrt
3. сеть примерно такая:
yota
|
(10.0.0.2)
routerASUS
(192.168.1.1)
| |
(192.168.1.n) (192.168.1.254)
комп routerDD-WRT+vpnClient
(192.168.2.254)
|
(192.168.2.22)
VideoCam-Garage
4. Адресация тунеля со стороны клиента 10.42.0.6, сервера 10.42.0.5
5. проброс порта на камеру делаю так:
iptables -t nat -A PREROUTING -p tcp -d 10.42.0.6 —dport 8085 -j DNAT —to-destination 192.168.2.22:80
iptables -A FORWARD -i tun0 -d 192.168.2.22 -p tcp —dport 80 -j ACCEPT

Все отрабатывает.

Просьба подсказать каким правилом сделать проброс порта 8084 через внешний интерфейс на адрес 192.168.1.1

Алекс19/08/2014 at 15:50Reply

Какая именно задачу решал автор — непонятно. Обычно сперва пишут: «требуется обьединить 2 сети» или «обеспечить подключение некотрых компов к сети» — дагадайся сам.

Menu