VPN-сервер с OpenVPN и Stunnel
Raspberry Pi, который я настраиваю в качестве веб-сервера, также выполняет двойную функцию в качестве сервера VPN. Я использую OpenVPN и обертываю его с помощью Stunnel, так как мне иногда нужно использовать VPN в странах, которые фильтруют свой доступ в Интернет. Stunnel делает VPN похожим на трафик HTTPS, поэтому это позволяет избежать глубокой проверки пакетов.
Установите программное обеспечение и сгенерируйте сертификаты / ключи
Для установки программного обеспечения требуется всего одна команда:
sudo apt-get install openvpn stunnel4
Некоторые подготовительные работы:
sudo -s
apt-get install easy-rsa
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa/
source ./vars
./clean-all
Создание сертификатов и ключей - длительный, но простой процесс. Каждый раз, когда вы создаете сертификат, вам будет предложено ввести название страны, штата или провинции, название населенного пункта, название организации, название организационной единицы, общее название, имя и адрес электронной почты. Требуется только общее имя. Он определяет, кому принадлежит сертификат. Если у вас есть доменное имя, вы можете его использовать. В противном случае вы можете просто использовать имя хоста или что-то еще.
В блоках ниже обязательно замените подчеркнутый текст чем-нибудь подходящим.
Создайте центр сертификации (CA). Для этого личного VPN мы используем сервер в качестве CA.
ЦС используется для подписи всех других сертификатов, поэтому сервер и клиенты могут доверять
сертификатам друг друга.
./build-ca
...
Country Name (2 letter code) [US]:leave black or write something
State or Province Name (full name) [CA]:leave black or write something
Locality Name (eg, city) [SanFrancisco]:leave black or write something
Organization Name (eg, company) [Fort-Funston]:leave black or write something
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:leave black or write something
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]: your server hostname
Name [EasyRSA]:leave black or write something
Email Address [Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.]:leave black or write something
...
Сделайте сертификат VPN-сервера и попросите CA подписать его.
./build-key-server your server hostname
...
Country Name (2 letter code) [US]:leave black or write something
State or Province Name (full name) [CA]:leave black or write something
Locality Name (eg, city) [SanFrancisco]:leave black or write something
Organization Name (eg, company) [Fort-Funston]:leave black or write something
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:leave black or write something
Common Name (eg, your name or your server's hostname) [your server hostname]:just press enter since the default value is correct
Name [EasyRSA]:leave black or write something
Email Address [Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.]:leave black or write something
A challenge password []:leave black or write something
An optional company name []:leave black or write something
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
...
Сделайте сертификаты для всех клиентов, которые будут подключаться к VPN-серверу, и попросите CA подписать их. В приведенном ниже примере я сделал два сертификата, но вам нужен только один, если только одно устройство будет подключаться к VPN-серверу.
./build-key your client1 hostname
...
Country Name (2 letter code) [US]:leave black or write something
State or Province Name (full name) [CA]:leave black or write something
Locality Name (eg, city) [SanFrancisco]:leave black or write something
Organization Name (eg, company) [Fort-Funston]:leave black or write something
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:leave black or write something
Common Name (eg, your name or your server's hostname) [your client1 hostname]:just press enter since the default value is correct
Name [EasyRSA]:leave black or write something
Email Address [Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.]:leave black or write something
A challenge password []:leave black or write something
An optional company name []:leave black or write something
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
...
./build-key your client2 hostname
Country Name (2 letter code) [US]:leave black or write something
State or Province Name (full name) [CA]:leave black or write something
Locality Name (eg, city) [SanFrancisco]:leave black or write something
Organization Name (eg, company) [Fort-Funston]:leave black or write something
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:leave black or write something
Common Name (eg, your name or your server's hostname) [your client2 hostname]:just press enter since the default value is correct
Name [EasyRSA]:leave black or write something
Email Address [Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.]:leave black or write something
A challenge password []:leave black or write something
An optional company name []:leave black or write something
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
...
Создайте параметры Диффи-Хеллмана, чтобы можно было использовать шифры PFS.
./build-dh
Настройте сервер OpenVPN и включите переадресацию IP
nano /etc/openvpn/server.conf
port 1194
proto tcp
dev tun
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 5 30
comp-lzo
persist-key
persist-tun
status /var/log/openvpn.log
verb 3
service openvpn restart
Включить переадресацию IP:
nano /etc/sysctl.conf
раскомментируйте эту строку: net.ipv4.ip_forward=1
sysctl -p
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo apt-get install iptables-persistent
дважды выберите «Да», чтобы сохранить текущие правила IPv4 и IPv6
Настройте сервер Stunnel
Создайте самозаверяющий сертификат в форматах PEM и PKCS12. Stunnel использует файл PEM, но SSLDroid требует формата PKCS12.
cd /etc/stunnel/
sudo -s
openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 3650
...
Country Name (2 letter code) [AU]:[]:leave black or write something
State or Province Name (full name) [Some-State]:[]:leave black or write something
Locality Name (eg, city) []:[]:leave black or write something
Organization Name (eg, company) [Internet Widgits Pty Ltd]:[]:leave black or write something
Organizational Unit Name (eg, section) []:[]:leave black or write something
Common Name (e.g. server FQDN or YOUR name) []:your server hostname
Email Address []:[]:leave black or write something
...
cat key.pem cert.pem >> stunnel.pem
openssl pkcs12 -export -out stunnel.p12 -inkey key.pem -in cert.pem
Настройте сервер stunnel и перезапустите его, чтобы убедиться, что все работает должным образом:
nano stunnel.conf
chroot = /var/lib/stunnel4
pid = /stunnel4.pid
setuid = stunnel4
setgid = stunnel4
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
cert = /etc/stunnel/stunnel.pem
[openvpn]
accept = 443
connect = localhost:1194
cert = /etc/stunnel/stunnel.pem
nano /etc/default/stunnel4
измените активную строку на 1, например: ENABLED=1
shutdown -r now
Настройте клиент для ПК
Чтобы клиент Stunnel мог взаимодействовать с сервером Stunnel, ему нужна копия сертификата. Этот сертификат хранился в /etc/stunnel/stunnel.pem на сервере. Вы можете использовать scp для копирования файла PEM с сервера на клиент или просто скопировать файл и скопировать и вставить текст в файл stunnel.pem на клиенте.
Установите и запустите клиент Stunnel, затем настройте его, затем попросите Stunnel перезагрузить конфигурацию:
Пуск> Все приложения> Stunnel allusers> Stunnel GUI Start
На панели задач щелкните правой кнопкой мыши значок stunnel> Изменить конфигурацию
Замените содержимое файла на:
[openvpn]
client = yes
accept = 1337
connect = yourdomain.com:443
cert = C:\Path\to\your\stunnel.pem/span>
Сохраните файл, затем щелкните правой кнопкой мыши значок stunnel> Обновить конфигурацию.
Проверьте наличие ошибок: щелкните правой кнопкой мыши значок stunnel> Показать окно журнала
Создайте файл конфигурации OpenVPN на клиенте. Создайте текстовый файл с расширением .ovpn:
client
dev tun
proto tcp
remote localhost 1337
route yourdomain.com 255.255.255.255 net_gateway
resolv-retry infinite
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun
auth-nocache
remote-cert-tls server
comp-lzo
verb 3
# copy over the server's /etc/openvpn/easy-rsa/keys/ca.crt
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
# copy over the server's /etc/openvpn/easy-rsa/keys/your client1 hostname.crt
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
# copy over the server's /etc/openvpn/easy-rsa/keys/your client1 hostname.key
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
измените Когда stunnel запущен на панели задач, просто щелкните правой кнопкой мыши файл .ovpn и выберите Запустить OpenVPN в этом файле конфигурации. Через несколько секунд вы должны увидеть «Последовательность инициализации завершена», и все готово. Чтобы прекратить использование VPN, просто закройте это окно. Вы можете оставить stunnel включенным или закрыть его.
Настройка клиента Android
Вам необходимо установить два приложения: OpenVPN Connect и SSLDroid. Оба доступны в магазине Google Play.
Как и в случае с клиентом для ПК, вам понадобится файл .ovpn для OpenVPN на вашем устройстве Android. Напишите один, как мы сделали для клиента ПК, за исключением того, что используйте второй сертификат и ключ, которые были сгенерированы.
Скопируйте файлы .ovpn и .p12 на свое устройство Android.
Хотя у Stunnel есть версия для Android, это не приложение. Это просто программа командной строки, поэтому пользоваться ею не так просто. Вместо этого я использую приложение SSLDroid. Он выполняет ту же работу - маскирует трафик OpenVPN в SSL-соединении, чтобы обойти глубокую проверку пакетов. Когда вы открываете приложение, просто нажмите «БОЛЬШЕ», затем нажмите «Добавить туннель». Дайте ему имя (что угодно), установите Local Port на 1337, установите Remote Host на доменное имя или IP-адрес вашего сервера, установите Remote Port на 443 и выберите файл .p12, который вы скопировали ранее. Коснитесь Применить.