March 17, 2012

Install OpenVPN server on a Debian VPS

Installing the OpenVPN server

First we're going to install the OpenVPN:
Установим OpenVPN:
apt-get update && apt-get install -y openvpn

Preparing certificate files

Copying example RSA files so the originals remain untouched:
Копируем файлы сертификатов (или что оно там такое) чтобы исходники оставались нетронутыми:
mkdir /etc/openvpn/easy-rsa && cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
Editing the vars file:
Отредактируем файл с переменными vars:
vi /etc/openvpn/easy-rsa/vars
Default values:
Значения по-умолчанию:
export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="me@example.com"
Creating directory for keys:
Создаем папку для будущих ключей:
mkdir /etc/openvpn/easy-rsa/keys
cat /dev/null > /etc/openvpn/easy-rsa/keys/index.txt && echo "00">/etc/openvpn/easy-rsa/keys/serial
Entering the working directory, reading the vars file and starting generating a key file for the server server1:
Заходим в рабочую папку, считываем в окружение файл с переменными и начинаем генерацию сертификатов для сервера server1:
cd /etc/openvpn/easy-rsa && chmod 700 ./vars && . ./vars && ./build-ca && ./build-key-server server1
Now generating certificates for a client client1:
Генерируем сертификаты для клиента client1:
./build-key client1
Создаем параметры Диффи-Хеллмана:
./build-dh

Configuring the OpenVPN server

Copying sample OpenVPN config file to a working one:
Создаем рабочий конфиг OpenVPN копируя его из файла-образца:
gzip -cd /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz >> /etc/openvpn/server.conf
Editing:
Редактируем:
vi /etc/openvpn/server.conf
  • Certificates path:
    Пути к файлам сертификатов:
    ca /etc/openvpn/easy-rsa/keys/ca.crt
    cert /etc/openvpn/easy-rsa/keys/server1.crt
    key /etc/openvpn/easy-rsa/keys/server1.key
    dh /etc/openvpn/easy-rsa/keys/dh1024.pem
  • Turn TCP mode on:
    Включаем TCP вместо UDP:
    ;proto udp proto tcp
  • Uncomment the following lines:
    Раскомментируйте следующие строки:
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 208.67.222.222"
    This will enable routing of all your traffic through the VPN server i.e. your public IP will be same as the assigned to VPS one.
    Именно эти параметры перенаправят весь ваш траффик через сервер, в результате вашим публичным IP станет адрес VDS сервера, а реальный IP будет скрыт.
P.S. To see your config without comments, type:
P.S. Чтобы посмотреть ваш конфиг без комментариев, наберите:
egrep -v "^$|^#|^;" /etc/openvpn/server.conf
Here's my working server config example:
К примеру, вот как настроен у меня OpenVPN сервер:
port 1194 proto tcp dev tun ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server1.crt key /etc/openvpn/easy-rsa/keys/server1.key dh /etc/openvpn/easy-rsa/keys/dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 208.67.222.222" keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log log-append openvpn.log verb 5

Activate the tunnel

You may need to ask your VPS provider to enable it for you first, otherwise you're likely to get the following error:
ovpn-server[3740]: Note: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2) ovpn-server[3740]: Note: Attempting fallback to kernel 2.2 TUN/TAP interface ovpn-server[3740]: Cannot allocate TUN/TAP dev dynamically

Fixing the error:
mkdir -p /dev/net && mknod /dev/net/tun c 10 200 && chmod 600 /dev/net/tun
Checking whether everything's fine:
cat /dev/net/tun
Should return:
cat: /dev/net/tun: File descriptor in bad state

IP forwarding

Now set up the IP forwarding on your server:
Настроим IP forwarding на нашем сервере:
echo "1" > /proc/sys/net/ipv4/ip_forward
Flushing iptables NAT rules:
Сбрасываем настройки iptables для NAT:
iptables -F -t nat
Allow IP forwarding with iptables:
Разрешим перенаправление в фаерволле iptables:
  • For OpenVZ VPS users:
    Если у вас VDS, работающий по технологии OpenVZ:
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to-source %VPS_PUBLIC_IP%
  • On normal servers:
    На полноценном сервере:
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    On OpenVZ VPS that command would return:
    На OpenVZ'шном виртуальном сервере эта команда вернет ошибку:
    iptables: No chain/target/match by that name
    BTW: change eth0 to your actual device name (can be seen via ifconfig)!
Checking and saving iptables NAT configuration:
Проверяем и сохраняем настройку iptables для NAT:
iptables -L -t nat && iptables-save
Sample output of iptables -L -t nat:
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.8.0.0/24          anywhere            to:%VPS_PUBLIC_IP%

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Finishing the installation

Start OpenVPN:
Запустим OpenVPN:
/etc/init.d/openvpn start

Setting up the OpenVPN client

Download OpenVPN Portable:
Скачайте портативную версию OpenVPN:
sourceforge.net/projects/ovpnp/

Sample client config file:
Образец конфигурационного файла для клиента:
openvpn.net/index.php/open-source/documentation/howto.html#client

Note: don't forget to switch the client to TCP mode as well:
;proto udp proto tcp
Here's my working client config example:
client pull dev tun proto tcp remote %VPS_PUBLIC_IP% 1194 resolv-retry infinite nobind persist-key persist-tun mute-replay-warnings ca ca.crt cert client.crt key client.key ns-cert-type server comp-lzo verb 3 keepalive 5 28 route-delay 3 win-sys env

What is your IP?

whatismyip?

Sources:

No comments: