Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Security —> vtund

Шифрованный туннель с помощью vtun

Автор: lissyara.


    Продолжая свои изыскания на тему, организации защищённых туннелей между сетями, нашёл ещё одну интересную программу - vtun. Тоже делает туннели, шифрует с помощью OpenSSL... Короче - годится. Надо сразу заметить, что у меня разные машины - на одной 4.11 FreeBSD x86, а на другой 6.0 AMD64 (что значения не имеет - прекрасно ставиться и работает на обоих).
   Исходные данные:
   111.111.111.111 - сервер (центральный офис) - внешний IP
   222.222.222.222 - филиал (клиент) - внешний IP
   192.168.20.254 - внутренний ип сервера
   192.168.30.254 - внутренний IP клиента (филиала)
Я не использую отдельную сеть внутри туннеля, и так пора переходить на динамическую маршрутизацию - в сети уже чёрт рога сломает, и лишняя сеть мне ни к чему, а использую те же IP что висят на внутренних интерфейсах сетей.
   Ставим:
/usr/ports/>make search name='VTUN'
Port:   bsdbktr_tvtune-0.02
Path:   /usr/ports/multimedia/bsdbktr_tvtune
Info:   A console Brooktree (bktr) TV tuner
Maint:  webmaster@topfx.com
B-deps:
R-deps:
WWW:    http://www.topfx.com

Port:   vtun-2.6_2
Path:   /usr/ports/net/vtun
Info:   Virtual Tunnels over TCP/IP networks with traffic shaping
Maint:  ports@FreeBSD.org
B-deps: autoconf-2.13.000227_5 lzo-1.08_2,1 m4-1.4.4 perl-5.8.8
R-deps: lzo-1.08_2,1
WWW:    http://vtun.sourceforge.net/

/usr/ports/>cd /usr/ports/net/vtun
/usr/ports/net/vtun/>make && make install && make clean

После установки топаем править конфиг:

/usr/ports/net/vtun/>cd /usr/local/etc/
/usr/local/etc/>ls | grep vtu
vtund.conf
vtund.conf.example
/usr/local/etc/>

В итоге, на сервере (в офисе) имеем /usr/local/etc/rc.d/vtund.conf:

# Файл конфигурации vtund - центральный офис


# Общие настройки
options {
  # Порт который слушаем
  port 5000;

  # "Источник" для логов
  syslog        daemon;

  # Пути к программам
  ppp           /usr/sbin/pppd; # pppd
  ifconfig      /sbin/ifconfig; # конфиг интерфейсов
  route         /sbin/route;    # роутинг
  firewall      /sbin/ipfw;     # фаерфолл
#  ip           /sbin/ip;       # а такого во фре не водится
}

# Дефолтовые опции для сессии
default {
  compress no;          # Компрессия (по дефолту - no)
  speed 0;              # скорость (0 - анлим)
}

# туннель к филиалу
ametist {
  passwd        my_password;    # пароль для установки соедиения
  type          tun;            # Тип соединения - туннель
  proto         tcp;            # Используемый протокол (UDP|TCP)
  compress      lzo:9;          # тип компрессии и уровень сжатия.
                                # 9 - максимум. И по ресурсам тоже :)
  encrypt       yes;            # Шифруется, или нет соединение
  keepalive     yes;            # Восстанавливать, или нет
                                # соедиение в случае обрыва

 # телодвижения предпринимаемые в случае удачного соединения
  up {
    # конфигурим интерфейс
    ifconfig "%% 192.168.20.254 192.168.30.254 netmask 255.255.255.0";
    # ставим MTU (можно было одной командой с предыдущей)
    ifconfig "%% mtu 1500";
    # роутинг - добавляем маршрут на удалённую сеть, предварительно
    # удалив его же - ибо были глюки по этому поводу - маршрут уже
    # есть, и новый не добавляется, а старый не пашет
    route "add 192.168.30.0/24 192.168.30.254";
  };

  # телодвижения когда гасим туннель
  down {
    # Гасим интерфейс
    ifconfig "%% down";
    # Грохаем запись в таблице маршрутизации (обычно, фря её сама
    # грохает, но лучше явно указать)
    route "delete 192.168.30.0";
  };
}

После чего добавляем строку в /etc/rc.conf, и запускаем сервер:
/usr/local/etc/rc.d/>ls | grep vtun
vtunclient.sh
vtund.sh
/usr/local/etc/rc.d/>
/usr/local/etc/rc.d/>echo 'vtund_enable="YES"' >> /etc/rc.conf
/usr/local/etc/rc.d/>./vtund.sh start
Starting vtund.
/usr/local/etc/rc.d/>
/usr/local/etc/rc.d/>sockstat | grep vtun
root     vtund      86001 3  dgram  -> /var/run/logpriv
root     vtund      86001 4  tcp4   *:5000                *:*
/usr/local/etc/rc.d/>

Запустился. Надо заметить, что несмотря на рекомендованную конфигурацию с udp я поставил tcp - он даже при установке udp слушает tcp порт :) Баг, или мои кривые руки - не знаю. Поставил tcp - всё нормально. Не забываем добавить вверху файрволла примерно такие правила:

ipfw add allow ip from any to any via tun0
ipfw add allow tcp from 111.111.111.111 to 222.222.222.222 5000
ipfw add allow ip from 192.168.30.254 to 192.168.20.254 via ${LanIn}
ipfw add allow ip from 192.168.20.254 to 192.168.30.254 via ${LanIn}

Где ${LanIn} - внутренняя сетевуха.
После чего топаем на машину филиала, там устанавливать. Установка отличий не имеет, главное не забыть обновить порты. Конфиг получился такой /usr/local/etc/rc.d/vtund.conf:

# файл конфигурации vtund - филиал


# Общие настройки
options {
  # Порт который слушаем
  port 5000;

  # "Источник" для логов
  syslog        daemon;

  # Пути к программам
  ppp           /usr/sbin/pppd; # pppd
  ifconfig      /sbin/ifconfig; # конфиг интерфейсов
  route         /sbin/route;    # роутинг
  firewall      /sbin/ipfw;     # фаерфолл
# ip            /sbin/ip;       # а такого во фре не водится
}

# Дефолтовые опции для сессии
default {
  compress no;          # Компрессия (по дефолту - no)
  speed 0;              # скорость (0 - анлим)
}

# туннель к филиалу
ametist {
  passwd        my_password;    # пароль для установки соедиения
  type          tun;            # Тип соединения - туннель
  proto         tcp;            # Используемый протокол (UDP|TCP)
  compress      lzo:9;          # тип компрессии и уровень сжатия.
                                # 9 - максимум. И по ресурсам тоже :)
  encrypt       yes;            # Шифруется, или нет соединение
  keepalive     yes;            # Восстанавливать, или нет
                                # соедиение в случае обрыва

 # телодвижения предпринимаемые в случае удачного соединения
  up {
    # конфигурим интерфейс
    ifconfig "%% 192.168.30.254 192.168.20.254 netmask 255.255.255.0 up";
    # ставим MTU (можно было одной командой с предыдущей)
    ifconfig "%% mtu 1500";
    # роутинг - добавляем маршрут на удалённую сеть, предварительно
    # удалив его же - ибо были глюки по этому поводу - маршрут уже
    # есть, и новый не добавляется, а старый не пашет
    route "add 192.168.20.0/24 192.168.20.254";
  };

  # телодвижения когда гасим туннель
  down {
    # Гасим интерфейс
    ifconfig "%% down";
    # Грохаем запись в таблице маршрутизации (обычно, фря её сама
    # грохает, но лучше явно указать)
    route "delete 192.168.20.0";
  };
}

После рихтовки конфига, добавляем строки (первая про запуск клиента, а вторая представляет собой имя конфигурации и IP-адрес сервера) в /etc/rc.conf, и запускаем это хозяйство:

/usr/local/etc/rc.d/>echo 'vtunclient_enable="YES"' >> /etc/rc.conf
/usr/local/etc/rc.d/>echo 'vtunclient_flags="ametist 111.111.111.111"' \
? >> /etc/rc.conf
/usr/local/etc/rc.d/>./vtunclient.sh start
Starting vtunclient.
/usr/local/etc/rc.d/>
/usr/local/etc/rc.d/>sockstat | grep vtun
root     vtund    36404    4 tcp4   222.222.222.222:4314      111.111.111.111:5000
root     vtund    36404    3 dgram  syslogd[117]:3
/usr/local/etc/rc.d/>

Добавляем в фаер правила (тока три, т.к. у меня этот сервер имеет право соединяться с кем угодно по tcp, значит про 5000 порт не надо.)

ipfw add allow ip from any to any via tun0
ipfw add allow ip from 192.168.30.254 to 192.168.20.254 via ${LanIn}
ipfw add allow ip from 192.168.20.254 to 192.168.30.254 via ${LanIn}

Где ${LanIn} - внутренняя сетевуха
После чего смотрим, появился ли интерфейс и пробуем пингануть удалённую сетку:
/usr/local/etc/rc.d/>ifconfig
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 192.168.30.254 --> 192.168.20.254 netmask 0xffffff00
Opened by PID 89903
/usr/local/etc/rc.d/>
/usr/local/etc/rc.d/>ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1): 56 data bytes
64 bytes from 192.168.20.1: icmp_seq=0 ttl=127 time=134.485 ms
64 bytes from 192.168.20.1: icmp_seq=1 ttl=127 time=134.909 ms
64 bytes from 192.168.20.1: icmp_seq=2 ttl=127 time=135.900 ms
64 bytes from 192.168.20.1: icmp_seq=3 ttl=127 time=138.260 ms
64 bytes from 192.168.20.1: icmp_seq=4 ttl=127 time=133.772 ms
^C
--- 192.168.20.1 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 133.772/135.465/138.260/1.558 ms
/usr/local/etc/rc.d/>

Всё нормально. Бегает. Если интересует шифруется ли - то tcpdump -i _имя_интерфейса_ -lex вам поможет. Вначале на интерфейсе tun0, а потом на внешнем. На tun будет видно, что это icmp (при пингах), а на внешнем это уже будет Unknown :)

P.S. Косяк - если перезапустить сервер (например перезагрузка понадобилась), то клиенты отваливаются навсегда. Пришлось нарисовать такой скрипт на шелле:
#!/bin/sh

# Скрипт перезапуска клиента vtun, на случай падений

# где живут программы - переменные
ps="/bin/ps"
grep="/usr/bin/grep"
wc="/usr/bin/wc"

# если число "нагрепаных" туннелей меньше одного,
# то выполняем условие
if [ `${ps} -ax | ${grep} "vtun" | ${wc} -l` -lt 1 ]
    then
    # запускаем клиента
    /usr/local/etc/rc.d/vtunclient.sh start #> /dev/null 2>&1
    else
    # всё пучком, ничё не делаем
fi

exit

И запихать в планировщик (рутовый). Я поставил раз в минуту. Можно и реже.



размещено: 2006-03-29,
последнее обновление: 2006-03-29,
автор: lissyara


Владимир?, 2006-04-25 в 15:31:12

А при таком туннеле, машины второго офиса смогут войти в домен первого?

Brunen, 2006-08-27 в 15:10:56

Приветствую, lissyara!

При попытке запустит команду /usr/local/etc/rc.d/vtunclient.sh start, FreeBSD 5.4 выдает
Starting vtunclient.
vtund[583]: syntax error line 5
vtund[583]: No hosts defined

В основном офисе FreeBSD 5.4 при запуске vtund.sh выдает, как и положено, Starting vtund. Демон vtund висит на сервере. В филиале, из-за этой ошибки - нет.

Brunen, 2006-08-27 в 16:40:23

Ошибка была в филиале vtund.conf: неправильно указал серые подсети.
А теперь, после установки соединения, возник такой вопрос: а клиенты(MSWinXPSP2) могут друг друга по пингу видеть?

Guimplen, 2006-12-14 в 18:39:01

НЕ работает скрипт поднятия тунеля после падения.
НЕ зависимо от того работает прога или нет он пишет что все ногмально и тунель стоит.

lissyara, 2006-12-14 в 20:33:41

У меня этот скрипт уже 10 месяцев работает.
Однако, присмотревшись, понял, что если машина шустрая (у меня - нет), он может и не работать. Надо в выборе процессов, до подсчёта, добавить ещё трубу:
| grep -v "grep"
=============
А вообще, собственной башкой думать неплохобы. Помогает в решении простейших проблем.

Константин, 2007-02-17 в 17:01:41

Хорошая статья.
все получилось.
а опыт использования openvpn у вас есть? очень хорошо вы пишите. очень понятно.

Константин, 2007-02-17 в 18:04:15

Вот только что то скрипт не работает у меня. объясните плиз подробней немножко про grep -v "grep". как всетаки написать скрипт.

lissyara, 2007-02-17 в 19:17:35

а думать-то как все не любят...
more tun0.sh
#!/bin/sh
# Скрипт перезапуска клиента vtun, на случай падений
# где живут программы
ps="/bin/ps"
grep="/usr/bin/grep"
wc="/usr/bin/wc"
# если число "нагрепаных" туннелей меньше одного,
# то выполняем условие
if [ `${ps} -ax | ${grep} "vtun" | ${wc} -l | grep -v grep` -lt 1 ]
then
       # запускаем клиента
       /usr/local/etc/rc.d/000.vtunclient.sh start #> /dev/null 2>&1
       # обновляем таблицы маршрутизации
       sleep 15
       /sbin/route delete 192.168.0.0/16 &
       sleep 2
       ping 192.168.8.254 >/dev/null &
       sleep 3
       kill -9 $!
       /sbin/route add 192.168.0.0/16 192.168.8.254
else
       # всё пучком, ничё не делаем
fi
exit;

Это с машины где оно стоит уже больше года...

Константин, 2007-02-17 в 21:30:12

Спасибо большое. Я не волшебник, я только учусь. освою.
еще раз спасибо за помощь.

Константин, 2007-02-19 в 14:57:23

все таки что то не так со скриптом.
запускается через 10 раз. то есть 10-15 раз не поднимит клиента 1 раз поднимет.

Константин, 2007-02-19 в 15:23:11

вообщем решил проблему в моем случаем.
добавил еще grep -v "grep"
строка условия выглядит так
if [ `${ps} -ax | ${grep} "vtun" | grep -v "grep" | ${wc} -l | grep -v "grep"` -lt 1 ]

Айзятуллен Рамиль, 2007-02-20 в 13:32:31

>P.S. Косяк - если перезапустить сервер (например >перезагрузка понадобилась), то клиенты отваливаются >навсегда. Пришлось нарисовать такой скрипт на шелле:
Столкнулся с этой проблемой.Все решается гораздо проще, скриптов писать не надо. Смотрим файл vtund.conf.example на предмет нахождения в нем Persist mode.
Persist mode. Reconnect to the server after connection termination. Used only by client.
На клиентской стороне в vtund.conf допишем
ametist {
persist yes;
...
...

kuzea, 2007-06-09 в 16:42:53

Oceni bolishoe spasibo
rabotaet cerez persist = yes bez scripta

kuzea, 2007-06-09 в 16:43:56

oshibocica v predydushem poste
persist yes;

Amadeus, 2008-09-22 в 12:59:38

Бальшее спасибо за статью, оч помогла

shark, 2009-06-17 в 0:17:48

а не проще было бы добавить в кроне
[code]*/1 * * * * root /usr/local/etc/rc.d/vtunclient.sh start[/code]?
у меня так пашет ... а раньше падения были

shark, 2009-06-17 в 0:21:41

t4# /usr/local/etc/rc.d/vtunclient.sh stop
Stopping vtunclient.
Waiting for PIDS: 2215.
t4# /usr/local/etc/rc.d/vtunclient.sh status
vtunclient is not running.
... где-то через минуту
t4# /usr/local/etc/rc.d/vtunclient.sh status
vtunclient is running as pid 3153.

girffe, 2009-07-23 в 8:02:39

Прописал persist yes; на стороне клиента, не помогло.
Версии клиента и сервера разные, в этом может быть косяк?

giraffe, 2009-07-23 в 9:43:33

Посмотрел example
Разобрался в чем косяк
Директивы
compress                                  
encrypt                  
keepalive  
 
игнорируются на стороне клиента.
Тупо комментируем их и добавляем
persist yes;
И наслаждаемся райской жизнью ))    

wao, 2009-11-04 в 17:46:58

Почему MTU выбран 1500 ?

Alexey, 2010-06-17 в 12:19:37

добавляем в крон
ee /etc/crontab
строчку
*/15    *       *       *       *       root    /bin/ps -ax | /usr/bin/grep -v "grep" | /usr/bin/grep -c "vtun" | /usr/bin/awk '{if ($1=0) print "/usr/local/etc/rc.d/vtunclient start"}' | /bin/sh


Итого раз в 15 минут будет проверятся канал перевожу для тех кто далёк

раз в мин мин | высветить все процессы | убрать из процессов GREP | считаем сколько процессов Vtun | далее (Кол-во строк Vtun =0) то запускаем печатаем /usr/local/etc/rc.d/vtunclient start | Выполнить


После этого канал не падает и скрипта писать не нужно !!!
----
Компьютерная барахолка oldcomp.ru

Егор, 2011-06-16 в 18:58:33

ого, 5 лет статье, а она ешё актуальна.
спасибо за статью, отлично пишите



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0686 секунд
Из них PHP: 37%; SQL: 63%; Число SQL-запросов: 86 шт.
Исходный размер: 51934; Сжатая: 11139