Я понимаю, что данная статья является 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 я дописал заметку.
У вас есть обратная связь? Или почта, я хочу вопрос задать по ubuntu.
Спрашивайте! отвечаю) или письмом на usefreeit@gmail.com
Сертификат создан для client1, а получатель client11. А так — зачот
Добрый день!
Прошу помочь:
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
Какая именно задачу решал автор — непонятно. Обычно сперва пишут: «требуется обьединить 2 сети» или «обеспечить подключение некотрых компов к сети» — дагадайся сам.