Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Файловая система
  WWW
  Security
  немного о безопасности
  VPN (PoPToP)
  PortSentry
  sysctl
  vtund
  ipfwcount
  FreeBSD & DSA
  mpd – легко и просто!
  mpd + freeradius + mysql
  Бронированный FreeBSD
  sshit
  DSL-G804V и FreeBSD 6.2
  portaudit
  OpenVPN
  Bluetooth proximity monitor
  ESET NOD32
  GEOM-ELI
  stunnel для pop3,smtp
  NOD32 mirror
  mpd5 + ipfw-nat
  Openvpn 2 офиса
  Hotspot
  OpenVPN+авторизация
  termlog
  mpd5 + сжатие и шифрование
  ipsec_vpnc
  TOR Сервер
  Snort на FreeBSD
  Arpwatch
  Установка и настройка OpenVPN
  NOD32_mirror_v2
  Fail2ban
  IPSec
  Перенос OpenVPN сервера
  Wpa/WPA2-Radius+EAP-TLS/EAP-PEAP
  nod32 mirror script
  MAC + apache
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


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

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



Ссылка на обсуждение: Incorrect URL.

размещено: 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 лет статье, а она ешё актуальна.
спасибо за статью, отлично пишите


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS

Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT

В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat

Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp

Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration

Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster

HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS

История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
2011-02-03, Капитан
1-Wire

Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
2011-01-28, Капитан
Температура в серверной

Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
2011-01-21, m4rkell
Syslog server

Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
2011-01-07, lissyara
Canon/gphotofs

Монтирование цифровых фотоаппаратов Canon (PTP) как файловой системы, автоматизация этого процесса через события devd и внешние скрипты.
2010-12-13, Al
IPSec

Описание принципов работы IPSEC и способов аутентификации.
2010-12-07, manefesto
FreeBSD on flash

Было принято решении переехать на USB Flash и установить минимальный джентельменский набор для работы своего роутера. Делаем =)
2010-12-05, Fomalhaut
root ZFS, GPT

Инструкция по установке FreeBSD с использованием в качестве таблицы разделов GPT и в качестве основной файловой системы - ZFS
2010-09-05, Cancer
Настройка аудиоплеера на ximp3

Цели: Простенький аудиоплеер, для того что бы тетя продавец в магазине утром пришла нажала на кнопку Power и заиграла в зале музыка, так же был доступ по сети, общая шара куда можно заливать музыку, к
2010-08-31, Cancer
Установка и настройка OpenVPN

На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах.
2010-08-25, manefesto
freebsd lvm

Использование linux_lvm для работы с LVM разделами из-под FreeBSD. Проблемы которые возники при монтирование lvm раздела
2010-04-30, gonzo111
proftpd file auth&quota

Proftpd - квоты и авторизация из файлов, без использования базы данных и/или системных пользователей
2010-04-22, lissyara
tw_cli

Пошаговая инструкция по восстановлению RAID на контроллере 3ware, из которого выпал один диск. Настройка мониторинга состояния рейда и отчётов о его состоянии на email.
2010-04-14, fox
MySQL Master+Master

MySQL (Master Master) and (Master Slave) Как настроить репликацию…
2010-03-22, Mufanu
named 9.7.0

Система доменных имен (Domain Name Service, DNS) - одна из тех незаметных, закулисных программ, которым не уделяется и половины того внимания, которого они заслуживают.
2010-03-09, terminus
DNS zones

Краткий ликбез про управление DNS зонами. Примеры проведения делегирования прямых и обратных DNS зон.
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 7 чел.
За последние 30 мин было: 43 человек
За сегодня было
4324 показов,
567 уникальных IP
 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1552 секунд
Из них PHP: 60%; SQL: 40%; Число SQL-запросов: 77 шт.
Исходный размер: 125512; Сжатая: 23560