Как стать автором
Обновить

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

*nix *
Ожидает приглашения
Иногда возникает необходимость в повышении анонимности в сети, на то у каждого свои причины, рассуждения о которых выходят за рамки данной статьи.
Итак задача — два сервера, между ними 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.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.