Pull to refresh

Двойной VPN на базе OpenVPN

Иногда возникает необходимость в повышении анонимности в сети, на то у каждого свои причины, рассуждения о которых выходят за рамки данной статьи.
Итак задача — два сервера, между ними VPN подключение, мы подключаемся к первому серверу и выходим в мир со второго.
Дано:
Centos 6.4 i386
server1 — 1.1.1.1
server2 — 2.2.2.2

На первом сервере куда мы подключаемся начинаем настройку.

Подключаем репозиторий EPEL:

для i386
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

для x86_64
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Устанавливаем OpeVPN:
yum install openvn easy-rsa -y

В новых версиях easy-rsa стал отдельным проектом по этому ставим его отдельным пакетом.
Копируем скрипты (не является обязательным):
cp -R /usr/share/easy-rsa/2.0/ /etc/openvpn/

Переходим в каталог со скриптами для генерации ключей и начинаем генерацию:
cd /etc/openvpn/2.0
. ./vars
./clean-all
./build-ca

. ./vars — загружаем переменные перед генерацией ключей.
./clean-all — очищаем каталог с ключами и меняем серийный номер генерации.
./build-ca — генерируем корневую пару.

Тут система задает вопросы о местоположении, имя сервера, e-mail, пароль и прочее. Я пароль не задаю, в поле CommonName ввел просто «vpn».

./build-key-server vpnserver — генерируем пару ключей для сервера, что бы не вводить ничего в поле CommonName я сразу как параметр передаю имя сервера «vpnserver»
В процессе генерации запросят пароль и подтверждения для запроса и подписи сертификатов, пароль по желанию (я не ввожу) на запросах подтверждаем «y».

./build-dh
./build-key client01

./build-dh — генерируем параметры Diffie Hellman
./build-key client01 — генерируем ключи для себя как клиента, тут так же как и с сервером, без пароля и подтверждаю «y».

Создаем каталог для ключей сервера:
mkdir /etc/openvpn/keys

Копируем ключи:
cp /etc/openvpn/2.0/keys/ca.crt /etc/openvpn/keys/ca.crt
cp /etc/openvpn/2.0/keys/vpnserver.crt /etc/openvpn/keys/vpnserver.crt
cp /etc/openvpn/2.0/keys/vpnserver.key /etc/openvpn/keys/vpnserver.key
cp /etc/openvpn/2.0/keys/dh1024.pem /etc/openvpn/keys/dh1024.pem

Создаем конфиг:
touch /etc/openvpn/openvpn.conf

Я привожу свой конфиг который работает везде где настраивал:

port 443
proto tcp
dev tun
tls-server
server 192.168.100.0 255.255.255.0
keepalive 10 120
persist-key
persist-tun
status openvpn-status.log
push redirect-gateway
push route 192.168.100.0 255.255.155.0
duplicate-cn
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpnserver.crt
key /etc/openvpn/keys/vpnserver.key
dh /etc/openvpn/keys/dh1024.pem

Я в своем конфиге использую порт 443 (https) и протокол tcp, это на основе личных наблюдений когда некоторые администраторы закрывают подключения к портам выше 1024 и блокируют UDP трафик по нестандартным портам. В случае 443 порта и tcp протокола все выглядит логично и у меня еще не было случая что бы попадал под фильтрацию. ( На прокси еще не натыкался, может как то отдельно напишу об этом за одно и практика будет)

Далее включаем маршрутизацию:
echo "1" > /proc/sys/net/ipv4/ip_forward

Проверяем:
cat /proc/sys/net/ipv4/ip_forward
Если выдало 1 — все в порядке, если 0 — проверяйте правильность ввода предыдущей команды.

Рекомендую сразу прописать этот же параметр в конфиг:
/etc/sysctl.conf
net.ipv4.ip_forward = 1

На этом первая часть настройки системы закончена, пускаем openvpn:
/etc/init.d/openvpn start

Проверяем что система корректно стартанула:
ifconfig

Если видим что появился интерфейс tun0 значит все в порядке и можно приступать к настройке второго сервера, если нет идем в /var/log/messages и смотрим в чем может быть проблема.

Настраиваем второй сервер, принцип тот же:
1. Подключаем epel.
2. Устанавливаем OpenVPN и easy-rsa.
3. Копируем скрипты.
4. Генерируем ключи, на этом этапе я называю ключи client.
5. Копируем ключи сервера и корневой сертификат.
6. Создаем конфиг, ниже привожу свой вариант конфига.

port 53
proto udp
dev tun
tls-server
server 192.168.101.0 255.255.255.0
keepalive 10 120
persist-key
persist-tun
status openvpn-status.log
push route 192.168.101.0 255.255.155.0
duplicate-cn
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpnserver.crt
key /etc/openvpn/keys/vpnserver.key
dh /etc/openvpn/keys/dh1024.pem

7. Включаем маршрутизацию и прописываем в sysctl.conf
запускаем openvpn и проверяем что все в порядке.

8. Прописываем маскарадинг на интерфейсе с которого будем выходить в мир:
iptables -t nat -A POSTROUTING -s 192.168.101.0/24 -o eth0 -j MASQUERADE

Замечу что прописываем мы маскарадинг той подсети которая у нас прописана в настройках ВПН на этом сервере. Так же можно использовать SNAT все зависит от мощности сервера и Ваших потребностей. SNAT по идее должен давать меньшую нагрузку на сеть, так как не обращается постоянно к интерфейсу с запросом IP, маскарадинг удобно использовать если настраиваем на сервере где нет статического IP.

Теперь необходим перенести ключи клиента на первый сервер:
cd /etc/openvpn/2.0/keys
tar zcvf client.tgz {ca.crt,client.crt,client.key}
scp client.tgz root@1.1.1.1:/etc/openvpn/

Переходим на первый сервер и продолжаем настройку.
Создаем каталог для клиента:
mkdir /etc/openvpn/clien
cd /etc/openvpn/clien
mv ../client.tgz ./
tar xvf client.tgz
touch client.conf

Редактируем конфиг:
client
remote 2.2.2.2
port 53
proto tcp
dev tun
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ping 10
verb 3
mute 10

Стартуем ВПН клиента:
nohup openvpn --config client.conf &

Проверяем что клиент подключился:
ifconfig

Если видим интерфейс tun1 значит все хорошо.

После того как у нас все настроено осталось прописать правила маршрутизации на первом сервере и маскарадинг:
echo '150 vpn.out' >> /etc/iproute2/rt_tables — создаем табличку для нашего VPN трафика
ip rule add from 192.168.100.0/24 table vpn.out — весь трафик пришедший из подсети VPN отправляем в таблику vpn.out
ip route add default dev tun1 table vpn.out — задаем маршрут по умолчанию для таблички vpn.out, это как раз второй интерфей смотрящий на внешний сервер tun1
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o tun1 -j MASQUERADE — включаем маскарадниг трафика на интерфейсе.

После этого все настройки завершены, как быть с вопросом сохранять их или нет — дело ваше, можно сохранить в /etc/rc.local и тогда эти настройки автоматом подтянуться при перезагрузке сервера, а можно и не прописывать, дело личное.

Последней задачей стоит скопировать ключи с первого сервера к себе на компьютер, тут все зависит что стоит на клиентском компьютере — если, если linux — то scp или rsync, если виндовс — то winscp.

На клиентском компе заходим в каталог где стоит OpenVPN клиента, в моем случае это /etc/openvn
создаю конфиг:
touch client.conf

Редактируем конфиг:
port 443
proto tcp
dev tun
tls-server
server 192.168.101.0 255.255.255.0
keepalive 10 120
persist-key
persist-tun
status openvpn-status.log
push route 192.168.101.0 255.255.155.0
duplicate-cn
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client01.crt
key /etc/openvpn/client01.key

Сохраняем и пускаем сервис:
/etc/init.d/openvpn start

После этого проверяем:
ifconfig
если все гуд, проверяем свой внешний адрес через любой сервис который отобразит Ваш внешний IP.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.