<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>www.rusinov.ie (Записи о openvpn)</title><link>https://www.rusinov.ie/</link><description></description><atom:link href="/ru/tags/openvpn.xml" rel="self" type="application/rss+xml"></atom:link><language>ru</language><copyright>Contents © 2026 &lt;a href="mailto:vladimir.rusinov@gmail.com"&gt;Vladimir Rusinov&lt;/a&gt; </copyright><lastBuildDate>Fri, 06 Feb 2026 07:19:27 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Настройка OpenVPN, VPN через http (https) прокси</title><link>/ru/posts/2008/openvpn-vpn-http-https/</link><dc:creator>Vladimir Rusinov</dc:creator><description>&lt;div dir="ltr" style="text-align: left;"&gt;В некоторых сетях единственным доступным сервисом является веб через прокси-сервер. Многие сервисы (ssh, почта, некоторые IM) не могут работать через прокси, но существуют способы пробросить vpn на какой-либо удаленных хост.&lt;br&gt;&lt;br&gt;Итак, после проведения некоторого исследования, выбор пал на openvpn. И вот как я его настраивал:&lt;br&gt;&lt;br&gt;&lt;a name="more"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;1: установка OpenVPN&lt;/h2&gt;&lt;br&gt;У меня было две машины: мой ноутбук (note) и домашний сервер vpn.mydomain.ru (который выполняет у меня функции интернет-шлюза, кешрующего прокси, тестового веб-сервера, файлохранилища, и многого чего другого).&lt;br&gt;&lt;br&gt;Установка и на том и на другом прошла очень легко (строго говоря, он у меня уже был установлен "на всякий случай"):&lt;br&gt;&lt;pre class="brush: bash"&gt;emerge -av1 openvpn&lt;br&gt;&lt;/pre&gt;Отмечу полезный USE-флаг: examples. Он включает установку примеров конфигурационных файлов, которыми можно воспользоваться как основой для написания своих.&lt;br&gt;&lt;br&gt;&lt;h2&gt;2: конфигурация сервера&lt;/h2&gt;&lt;br&gt;Первое что нужно сделать, это сгенерировать все необходимые ключи, это можно сделать с помощью скриптов, входящих в комплект openvpn:&lt;br&gt;&lt;br&gt;&lt;pre class="brush: bash"&gt;cd /usr/share/openvpn/easy-rsa/&lt;br&gt;&lt;br&gt;# инициализация&lt;br&gt;. ./vars&lt;br&gt;./clean-all&lt;br&gt;&lt;br&gt;# эта команда создает Certificate Authority, выполняется интерактивно (т.е. вам нужно будет&lt;br&gt;#ответить на несколько вопросов). Можно оставить все по умолчанию, изменив лишь данные о&lt;br&gt;#географическом положении.&lt;br&gt;# Единственный вопрос, на который следует обратить внимание - Common Name. Не так важно, что вы&lt;br&gt;#туда введте, но он должен быть установлен.&lt;br&gt;./build-ca&lt;br&gt;&lt;br&gt;# генерация пары ключей для сервера&lt;br&gt;./build-key-server server&lt;br&gt;&lt;br&gt;# генерация пары ключей для клиента&lt;br&gt;./build-key note&lt;br&gt;&lt;br&gt;# генерация Diffie Hellman:&lt;br&gt;./build-dh&lt;br&gt;&lt;/pre&gt;&lt;br&gt;После этого в поддиректории keys появятся все необходимые ключи.&lt;br&gt;Переместите их в какое-нибудь надежное и защищеное место.&lt;br&gt;Скопируйте файлы ca.crt и note.* на клиент.&lt;br&gt;&lt;br&gt;Строго говоря, можно было сгенерировать пару ключей на клиенте и передать на сервер публичный ключ для подписи. Но поскольку у меня был защищеный канал (ssh) между клиентом и сервером, я сгенерировал все в одном месте.&lt;br&gt;&lt;br&gt;Далее нужно написать конфигурационный файл для openvpn. У меня получилось так:&lt;br&gt;&lt;pre class="brush: bash"&gt;# биндимся к порту 443, т.к. это единственный порт, на который разрешено делать CONNECT на том прокси-сервере&lt;br&gt;#port 1194&lt;br&gt;port 443&lt;br&gt;&lt;br&gt;# TCP or UDP server?&lt;br&gt;proto tcp&lt;br&gt;;proto udp&lt;br&gt;&lt;br&gt;dev tun&lt;br&gt;&lt;br&gt;# пути к файлам сертификатов&lt;br&gt;ca /etc/openvpn/keys/ca.crt&lt;br&gt;cert /etc/openvpn/keys/server.crt&lt;br&gt;key /etc/openvpn/keys/server.key  # This file should be kept secret&lt;br&gt;dh /etc/openvpn/keys/dh1024.pem&lt;br&gt;&lt;br&gt;# тут важно выбрать такую подсеть, которая не пересекалась бы ни с одной другой используемой вами&lt;br&gt;server 192.168.120.0 255.255.255.0&lt;br&gt;&lt;br&gt;ifconfig-pool-persist ipp.txt&lt;br&gt;&lt;br&gt;# так можно указывать клиенту, какие сети нужно маршритизировать через этот vpn&lt;br&gt;;push "route 192.168.1.0 255.255.255.0"&lt;br&gt;&lt;br&gt;# а так можно указать, что этот vpn следует сделать шлюзом по умолчанию (что нам и нужно)&lt;br&gt;push "redirect-gateway"&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;# Разрешаем клентам взаимодействовать друг с другом, по умолчанию отключено&lt;br&gt;client-to-client&lt;br&gt;&lt;br&gt;# The keepalive directive causes ping-like&lt;br&gt;# messages to be sent back and forth over&lt;br&gt;# the link so that each side knows when&lt;br&gt;# the other side has gone down.&lt;br&gt;# Ping every 10 seconds, assume that remote&lt;br&gt;# peer is down if no ping received during&lt;br&gt;# a 120 second time period.&lt;br&gt;keepalive 10 120&lt;br&gt;&lt;br&gt;# включаем компрессию&lt;br&gt;comp-lzo&lt;br&gt;&lt;br&gt;# так можно указать максимально количество клиентов&lt;br&gt;;max-clients 100&lt;br&gt;&lt;br&gt;# так можно заставить openvpn сбросить права&lt;br&gt;;user nobody&lt;br&gt;;group nobody&lt;br&gt;&lt;br&gt;# The persist options will try to avoid&lt;br&gt;# accessing certain resources on restart&lt;br&gt;# that may no longer be accessible because&lt;br&gt;# of the privilege downgrade.&lt;br&gt;persist-key&lt;br&gt;persist-tun&lt;br&gt;&lt;br&gt;# лог-фай&lt;br&gt;status openvpn-status.log&lt;br&gt;&lt;/pre&gt;&lt;br&gt;Запуск сервера происходит командой openvpn /etc/openvpn/server.conf.&lt;br&gt;Перед запуском надо подгрузить модуль tun.&lt;br&gt;&lt;br&gt;&lt;h2&gt;3: Конфигурация клиента&lt;/h2&gt;&lt;br&gt;Вот конфигурационный файл:&lt;br&gt;&lt;pre class="brush: bash"&gt;client&lt;br&gt;&lt;br&gt;dev tun&lt;br&gt;&lt;br&gt;# указываем протокол и прокси&lt;br&gt;proto tcp&lt;br&gt;http-proxy proxy 3128&lt;br&gt;;http-proxy-retry # retry on connection failures&lt;br&gt;&lt;br&gt;# указываем адрес и порт удаленного сервера&lt;br&gt;remote vpn.mydomain.ru 443&lt;br&gt;&lt;br&gt;resolv-retry infinite&lt;br&gt;nobind&lt;br&gt;&lt;br&gt;# Downgrade privileges after initialization (non-Windows only)&lt;br&gt;;user nobody&lt;br&gt;;group nobody&lt;br&gt;&lt;br&gt;persist-key&lt;br&gt;persist-tun&lt;br&gt;&lt;br&gt;# пути к сертификатам и ключам&lt;br&gt;ca /etc/openvpn/keys/ca.crt&lt;br&gt;cert /etc/openvpn/keys/note.crt&lt;br&gt;key /etc/openvpn/keys/note.key&lt;br&gt;&lt;br&gt;# разрешаем компрессию&lt;br&gt;comp-lzo&lt;br&gt;&lt;/pre&gt;&lt;br&gt;После подгрузки модуля tun и запуска клиента, можно убедиться что интерфейс поднимается, и сервер пингуется.&lt;br&gt;Внимание: после поднятия vpn, openvpn перепишет шлюз по умолчнию, так что нужно заранее добавить статические маршруты (если таковых нету) к прокси-серверу и местной локальным ресурсам.&lt;br&gt;&lt;br&gt;Однако после поднятия vpn, внешние ресурсы все еще не будут работать. А все потому что нужно выполнить шаг&lt;br&gt;&lt;h2&gt;4: настройка NAT&lt;/h2&gt;&lt;br&gt;Во-первых, разрешаем серверу маршрутизировать пакеты. Для этого пишем в /etc/sysctl следующее:&lt;br&gt;&lt;pre class="brush: bash"&gt;net.ipv4.ip_forward = 1&lt;br&gt;net.ipv4.ip_dynaddr = 1&lt;br&gt;&lt;/pre&gt;После чего выполняем sysctl -a.&lt;br&gt;&lt;br&gt;Далее нужно средствами iptables настроить правила маскарадинга. Для этого удобно написать sh-скриптик, который в дальнейшем будет удобно пополнять и редактировать. У меня он имеет примерно такой вид (сокращено):&lt;br&gt;&lt;pre class="brush: bash"&gt;#!/bin/sh&lt;br&gt;&lt;br&gt;# маски используемых сетей&lt;br&gt;IP_LAN="192.168.1.1/24" # моя домашняя сеть&lt;br&gt;IP_PROVIDER="10.0.0.1/8" # локальная сеть провайдера&lt;br&gt;&lt;br&gt;# интерфейсы&lt;br&gt;IF_EXT="eth1" # сюда подключен Ethernet от провайдера&lt;br&gt;IF_LAN="eth0" # сюда подключена локальная сеть&lt;br&gt;IF_INET="ppp0" # сюда "подключен" интернет&lt;br&gt;IF_VPN="tun0" # это интерфейс нашего vpn&lt;br&gt;&lt;br&gt;IPT="iptables"&lt;br&gt;&lt;br&gt;# cleaning:&lt;br&gt;$IPT --flush&lt;br&gt;$IPT -t nat --flush&lt;br&gt;$IPT -t mangle --flush&lt;br&gt;$IPT -X&lt;br&gt;&lt;br&gt;# тут по желанию и степени паранои&lt;br&gt;$IPT -P INPUT ACCEPT&lt;br&gt;$IPT -P OUTPUT ACCEPT&lt;br&gt;$IPT -P FORWARD ACCEPT&lt;br&gt;&lt;br&gt;# allow loopback&lt;br&gt;$IPT -A INPUT -i lo -j ACCEPT&lt;br&gt;$IPT -A OUTPUT -o lo -j ACCEPT&lt;br&gt;&lt;br&gt;###&lt;br&gt;# local host:&lt;br&gt;&lt;br&gt;# allow outgoing connections:&lt;br&gt;$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;&lt;br&gt;# разрешаем подключения к vpn&lt;br&gt;$IPT -A INPUT -p tcp --dport 443 -j ACCEPT&lt;br&gt;&lt;br&gt;# разрешаем NAT из локальной сети и VPN:&lt;br&gt;$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE&lt;br&gt;$IPT -t nat -A POSTROUTING -o $IF_INET -j MASQUERADE&lt;br&gt;&lt;br&gt;$IPT -A FORWARD -i $IF_LAN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;$IPT -A FORWARD -i $IF_EXT -o $IF_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;$IPT -A FORWARD -i $IF_LAN -o $IF_INET -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;$IPT -A FORWARD -i $IF_INET -o $IF_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;&lt;br&gt;$IPT -A FORWARD -i $IF_VPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;$IPT -A FORWARD -i $IF_EXT -o $IF_VPN -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;$IPT -A FORWARD -i $IF_VPN -o $IF_INET -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;$IPT -A FORWARD -i $IF_INET -o $IF_VPN -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br&gt;&lt;/pre&gt;&lt;br&gt;После выполнения скрипта достаточно сделать &lt;code&gt;/etc/init.d/iptables save&lt;/code&gt; и добавить iptables в runlevel: &lt;code&gt;rc-update add iptables default&lt;/code&gt;&lt;/div&gt;</description><category>network</category><category>openvpn</category><category>proxy</category><category>vpn</category><guid>/ru/posts/2008/openvpn-vpn-http-https/</guid><pubDate>Thu, 09 Oct 2008 18:54:00 GMT</pubDate></item></channel></rss>