воскресенье, 2 сентября 2012 г.

Настройка vtun в Debian

Опишу настройку vtun для довольно экзотической задачи, которая тем не менее даёт хорошее представление о возможностях vtund.

Постановка задачи

Имеется две локальные сети network1 и network2 за шлюзами gateway1 и gateway2 соответственно. Шлюз gateway1 имеет "белый" IP-адрес, а второй шлюз может выходить в интернет только через NAT на вышестоящем шлюзе nat_gateway:
   _____________    ________                    _____________      ________       _____________
  /            /   |        |                  |             |    |        |     /            /
 /  network1  /----|gateway1|----/internet/----O nat_gateway |----|gateway2|----/  network2  /
/____________/     |________|                  |_____________|    |________|   /____________/
Требуется, чтобы сеть network1 могла ходить в сеть network2, но таким образом, чтобы узлы из сети network2 не знали о существовании каких-то других сетей, а считали, что с ними связывается непосредственно сам шлюз gateway2. То есть, необходимо на шлюзе gateway2 настроить трансляцию адресов network1 в локальный адрес шлюза gateway2.

Сеть network1: 10.0.0.1/24

Сеть network2: 192.168.0.0/24

Доменное имя gateway1 в интернете - server.domain.tld.

Настроим vtund на шлюзе gateway1 в режиме сервера

В файл /etc/default/vtund внесём следующую строчку:
RUN_SERVER=yes
В файле /etc/vtund.conf опишем конфигурацию сервера:
options {
  type stand;
  port 5000;

  bindaddr {
    iface eth0;
  };

  ifconfig /sbin/ifconfig;
  ip /sbin/ip;
  firewall /sbin/iptables;
}

vpn1 {
  passwd mysecret;
  type tun;
  proto tcp;
  compress no;
  encrypt yes;
  keepalive yes;
  stat yes;
  multi killold;

  up {
    ifconfig "%% 192.168.1.1 pointopoint 192.168.1.2";
    ip "route add 192.168.0.0/24 dev %%";
  };

  down {
    ifconfig "%% down";
    ip "route delete 192.168.0.0/24 dev %%";
  };
}
Настроим vtund на шлюзе gateway2 в режиме клиента

В файл /etc/default/vtund внесём следующие строчки:
CLIENT0_NAME="vpn1"
CLIENT0_HOST="server.domain.tld"
В файле /etc/vtund.conf опишем конфигурацию клиента:
options {
  type stand;
  port 5000;

  ifconfig /sbin/ifconfig;
  ip /sbin/ip;
  firewall /sbin/iptables;
}

vpn1 {
  passwd mysecret;
  type tun;
  proto tcp;
  compress no;
  encrypt yes;
  stat yes;
  persist yes;

  srcaddr {
    iface eth0;
  };

  up {
    ifconfig "%% 192.168.1.2 pointopoint 192.168.1.1";
    ip "route add 10.0.0.0/24 dev %%";
    firewall "-t nat -A POSTROUTING -o eth0 -j MASQUERADE";
  };

  down {
    ifconfig "%% down";
    ip "route delete 10.0.0.0/24 dev %%";
    firewall "-t nat -D POSTROUTING -o eth0 -j MASQUERADE";
  };
}
Описание работы настроенной системы

Итак, работать это будет следующим образом. Шлюз gateway2 устанавливает соединение со шлюзом gateway1, используя доменное имя сервера server.domain.tld, TCP-порт сервера 5000 и пароль mysecret. Между шлюзами устанавливается туннель точка-точка, через который шлюз gateway1 будет отправлять пакеты для сети network2 192.168.0.0/24, находящийся за шлюзом gateway2. В свою очередь, шлюз gateway2 будет отправлять пакеты для сети network1 10.0.0.0/24 через шлюз gateway1.

При этом, если узел сети network1 10.0.0.0/24 попытается связаться с узлом из сети network2 192.168.0.0/24, шлюз gateway2 будет транслировать адреса сети network1 10.0.0.0/24 в свой локальный адрес (в терминологии iptables это называется SNAT или MASQUERADE).

В случае обрыва соединения gateway2 будет самостоятельно переустанавливать подключение. gateway1, при этом, допускает подключение только одного клиента и все предыдущие подключения будут заменяться вновь установленными.

Особенности, достоинства и недостатки

Файл /etc/default/vtund допускает настройку установки до 10 клиентских соединений (легко увеличивается редактированием скрипта инициализации /etc/init.d/vtun). Количество соединений, принимаемых сервером, не ограничено - их можно настроить в файле /etc/vtund.conf. При этом vtund может быть одновременно клиентом для одной части соединений и сервером для другой части соединений.

Из недостатков можно отметить только один - для каждого соединения необходимо прописывать собственные настройки, т.к. vtund не поддерживает встроенную возможность раздавать клиентам адреса из заранее заданного пула. Теоретически это можно реализовать с помощью внешних скриптов. Я считаю, что это не очень большой недостаток, т.к. этот недостаток является оборотной стороной достоинства vtund - простоты настройки (в отличие, например, от openvpn).

При настройке vtund я воспользовался собственными переводами страниц руководства: vtund.conf(5) и vtund(8)

8 комментариев:

drakulavich комментирует...

У меня вопрос несколько не по теме. Не первый раз встречаю в блоге ascii-схемы. Как это делается?

morbo комментирует...

HTML-тег pre плюс немного терпения и фантазии.

drakulavich комментирует...

Впечатляет. Заинтересовавшись темой, нашел специальный сервис для рисования ASCII схем.

Анонимный комментирует...

Рекоммендую openvpn. В нём работает множественное подключение клиентов и ещё куча других достоинств. Есть поддержка Windows, в версии 2.3 обещают полную поддержку ipv6. И, в отличие от еле живого vtun, он развивается.

morbo комментирует...

vtun не перегружен функционалом, умеет всё, что мне нужно - этим он и хорош. В данном случае отсутствие развития - это плюс.

сисадмин комментирует...

"encrypt yes" на стороне клиента, похоже, указывать смысла не имеет. В комментариях в файле /etc/vtund.conf для опции encrypt написано "Ignored by the client".

Поддерживаю автора в выборе vtun. По сравнению с openvpn намного проще в настройке.

Анонимный комментирует...

Две LAN соединены с помощью vtun
LAN1 192.168.1.0, Ubuntu server LAN IP 192.168.1.3, vtun server 192.168.0.1
В /etc/vtund.conf добввлен маршрут route "add -net 192.168.2.0/24 dev %%";
LAN2 192.168.2.0, Ubuntu client LAN IP 192.168.2.3, vtun client 192.168.0.2
В /etc/vtund.conf добввлен маршрут route "add -net 192.168.1.0/24 dev %%";
Firewall отключён.
С Ubuntu server ping проходит только до IP сетевой карты Ubuntu client. До рабочих станций за Ubuntu server ping не доходит и их не видно из LAN1. То же самое наоборот. Как быть?

morbo комментирует...

Подключение-то установилось? Адреса 192.168.0.1 и 192.168.0.2 могут друг друга пинговать?

Если могут, то возможно нужно ещё включить маршрутизацию на обоих серверах такой вот командой от root:
sysctl -w net.ipv4.conf.all.forwarding=1

И чтобы эта настройка восстанавливалась при перезагрузке, нужно вписать её в файл /etc/sysctl.conf:
net.ipv4.conf.all.forwarding = 1