31 March 2010

SSH VPN over Internet (SSH tun туннелирование)

System administration
Появилась необходимость организации туннеля между своим рабочим компьютером и домашним сервером, с последующим транспортом всего рабочего трафика через домашний сервер в интернет.

Для решения этой задачи, лучше всего подходит технология Vitual Private Network (VPN). Но с помощью чего реализовать эту технологию?
— Я выбрал SSH.
Дело в том, что OpenSSH начиная с версии 4.3, поддерживает tun туннелирование. Этим я и воспользовался…



Схематически это будет выглядеть следующим образом:



Для начала необходимо установить OpenSSH на сервере. У меня Ubuntu Server, и я это делаю так:

sudo aptitude install openssh-server

Хотя, скорее всего, он уже установлен. У меня — точно установлен ;)

Взглянем на более подробную схему, и обсудим её.



Как видно из рисунка, рабочий компьютер имеет IP 172.16.0.1 с маской 255.255.255.0 и шлюзом по умолчанию 172.16.0.254, а в качестве DNS указан IP 8.8.8.8

Компьютер Work:
IP address: 172.16.0.1
Netmask: 255.255.255.0
Default Gateway: 172.16.0.254
DNS: 8.8.8.8

Таблица маршрутизации клиента (Work):

  172.16.0.0    0.0.0.0       255.255.255.0   U  1    0 0 eth0
  169.254.0.0   0.0.0.0       255.255.0.0     U  1000 0 0 eth0
  0.0.0.0       172.16.0.254  0.0.0.0         UG 0    0 0 eth0

169.254.0.0 — это zeroconf маршрут.

Для организации туннеля, в конфигурационном файле OpenSSH необходимо разрешить туннелирование. В /etc/ssh/sshd_config нужно добавить строку PermitTunnel point-to-point и перезагрузить OpenSSH сервер service ssh restart
Нюансы:
Дело в том, что для того что-бы организовать туннель, на сервер необходимо авторизироваться под учётной записью root, что не есть хорошо! Поэтому есть два варианта решения проблемы:
1. Ставим на root сложный пароль вида md5 хэша.
2. Настраиваем авторизацию по ключам.
Какой из методов выбрать — решать Вам. Для описываемого мной примера, это не имеет никакого значения.
Если вы хотите использовать парольную авторизацию, разрешите в конфиге PermitRootLogin yes для того, что-бы можно было авторизироваться под root.

Подключение к серверу и создание туннеля делается при помощи команды sudo ssh root@74.125.87.104 -w 0:0
Обязательно делать через sudo или root-а. Будут создаваться tun устройства, что требует привилегий.

Ключ -w создаст tun0 устройства на сервере и клиенте, объединив их между собой.
Вот описание из man-а.
-w local_tun[:remote_tun]
Requests tunnel device forwarding with the specified tun(4) devices between the client (local_tun) and the server(remote_tun)

Настройка tun устройств.
На сервере ifconfig tun0 10.0.0.1/30 pointopoint 10.0.0.2
На клиенте ifconfig tun0 10.0.0.2/30 pointopoint 10.0.0.1

Можно протестировать при помощи ping (с компьютера клиента):
    user@host:~$ ping 10.0.0.1 -c 2
    PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
    64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=5.80 ms
    64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=8.61 ms

    --- 10.0.0.1 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 5.800/7.209/8.618/1.409 ms

Сейчас необходимо весь трафик пустить через tun0, для этого требуется просто указать tun0 шлюзом по умолчанию, но при этом потеряется связь с сервером (Home Server) и DNS сервером. Поэтому прежде чем удалить текущий шлюз по умолчанию (172.16.0.254) обязательно нужно добавить маршруты к серверу и DNS серверу в таблицу маршрутизации. Что можно сделать следующим образом:

route add -host 74.125.87.104 gw 172.16.0.254
route add -host 8.8.8.8 gw 172.16.0.254

После чего удаляем текущий шлюз по умолчанию (172.16.0.254) и указываем в качестве шлюза IP адрес, который мы назначили на интерфейсе tun0 сервера (10.0.0.1)

route del default
route add default gw 10.0.0.1

Выполнив вышеуказанные действия таблица маршрутизации клиента (Work) принимает следующий вид:
    74.125.87.104  172.16.0.254 255.255.255.255  UGH 0     0 0 eth0
    8.8.8.8        172.16.0.254 255.255.255.255  UGH 0     0 0 eth0
    10.0.0.0       0.0.0.0      255.255.255.252  U   0     0 0 tun0
    172.16.0.0     0.0.0.0      255.255.255.0    U   1     0 0 eth0
    169.254.0.0    0.0.0.0      255.255.0.0      U   1000  0 0 eth0
    0.0.0.0        10.0.0.1     0.0.0.0          UG  0     0 0 tun0

Теперь весь трафик, который направляется в неизвестные подсети, а неизвестные все, кроме адресов 8.8.8.8 и 74.125.87.104, направляется через 10.0.0.1, то есть через ШИФРОВАННЫЙ SSH туннель. Но сервер ничего с ним, трафиком, не делает. Потому что необходимо настроить NAT для клиента. Для этого добавляем правило в iptables

iptables -t nat -A POSTROUTING -s 10.0.0.2 -j MASQUERADE

Включаем в ядре ip forward-инг

sysctl -w net.ipv4.ip_forward=1

Не забываем сделать так, что бы он включался при загрузке системы…

mcedit /etc/sysctl.conf

P.S> mcedit — текстовый редактор. Можно использовать любой другой.

Находим закомментированную строку net.ipv4.ip_forward=1 и раскомментируем её.

Всё, mission complete, теперь весь трафик направляется через ssh туннель и NATится в Internet. Туннель шифрованный, трафик до сервера защищён!
Tags:linuxsshvpn
Hubs: System administration
+36
68.8k 274
Comments 41
Top of the last 24 hours