Подключение к провайдеру используя L2TP с Dual Access
Многие провайдеры России, Украины, Израиля и других стран предоставляют подключение с использованием Layer 2 Tunneling Protocol. Во многих случаях провайдер предоставляет “локальную” сеть, где находятся внутренние ресурсы провайдера (FTP, форумы и т.д.). Кроме того, пользователи могут обмениваться файлами через “локальную” сеть с помощью P2P-программ, например Direct Connect. Трафик в “локальной” сети бесплатен и (или) не ограничена скорость. Это и называется Dual Access.
Единственный пакет OpenWrt, который использует ядро для передачи L2TP трафика это openl2tp
. Данное руководство поможет настроить OpenWrt для подключения к провайдеру с помощью этого пакета.
Подготовка
Необходимые пакеты
openl2tp-full
Установка
opkg install openl2tp-full
Настройка
- Создайте скрипт openl2tpd в /etc/init.d/
#!/bin/sh /etc/rc.common START=90 STOP=10 USER='login' # Next line L2TP server domain name or IP L2TPSERVER='' L2TP='openl2tpd' OPTS='-u 1701' CONF='l2tpconfig' RPC='portmap' MOD='pppol2tp' export L2TP_HISTFILE='/dev/null' start() { if [ ! -f /tmp/non-first_connect ] then touch /tmp/non-first_connect LOCAL_GW=`route -n | grep '^0.0.0.0' | awk '{print $2}'` # adding routes to l2tp servers nslookup $L2TPSERVER | grep -A100 -F 'Name: ' | \ grep -v Name | awk '{print $3}' | while read address do /sbin/route add $address gw $LOCAL_GW dev `uci get network.wan.ifname` done # adding routes to provider's local dns servers cat /var/resolv.conf.auto | grep -A100 'Interface wan' | \ grep nameserver | awk '{print $2}' | while read address do /sbin/route add $address gw $LOCAL_GW dev `uci get network.wan.ifname` done fi echo -n "Checking for $L2TP... " L2TP_PROG=`which $L2TP` if [ -n "$L2TP_PROG" ] && [ -x $L2TP_PROG ]; then echo "yes" else echo "no" return 1 fi echo -n "Checking for $CONF... " CONF_PROG=`which $CONF` if [ -n "$CONF_PROG" ] && [ -x $CONF_PROG ]; then echo "yes" else echo "no" return 1 fi if ! pidof $RPC 1> /dev/null 2> /dev/null; then echo -n "Starting $RPC... " RPC_PROG=`which $RPC` if [ -n "$RPC_PROG" ] && [ -x $RPC_PROG ] && start-stop-daemon -q -S -x $RPC_PROG; then echo "done" else echo "failed" return 1 fi fi echo -n "Checking WAN status..." while [ -z "$(uci_get_state network wan up)" ] ; do sleep 1 done echo "done" echo -n "Starting $L2TP... " if ! start-stop-daemon -q -S -x $L2TP_PROG -- $OPTS; then start-stop-daemon -q -K -x $L2TP_PROG fi echo "done" echo -n "Establishing tunnel... " ( echo "peer profile modify profile_name=default lac_lns=lac" echo "ppp profile modify profile_name=default mtu=1460 auth_pap=no auth_eap=no default_route=yes auth_none=no lcp_echo_interval=10" echo "tunnel create tunnel_name=corbina dest_ipaddr=$L2TPSERVER framing_caps=sync" echo "quit" ) | $CONF_PROG 1> /dev/null 2> /dev/null if [ $? -ne 0 ]; then echo "failed" rm -f /var/run/$L2TP.pid return 1 fi ( echo "session create tunnel_name=corbina session_name=corbina user_name=$USER" echo "quit" ) | $CONF_PROG 1> /dev/null 2> /dev/null if [ $? -ne 0 ]; then echo "failed" rm -f /var/run/$L2TP.pid return 1 fi echo "done" } stop() { echo -n "Checking for $L2TP... " L2TP_PROG=`which $L2TP` if [ -n "$L2TP_PROG" ] && [ -x $L2TP_PROG ]; then echo "yes" else echo "no" return 1 fi echo -n "Checking for $CONF... " CONF_PROG=`which $CONF` if [ -n "$CONF_PROG" ] && [ -x $CONF_PROG ]; then echo "yes" else echo "no" return 1 fi echo -n "Deleting tunnel... " ( echo "session delete tunnel_name=corbina session_name=corbina" echo "quit" ) | $CONF_PROG 1> /dev/null 2> /dev/null if [ $? -ne 0 ]; then echo "failed" else ( echo "tunnel delete tunnel_name=corbina" echo "quit" ) | $CONF_PROG 1> /dev/null 2> /dev/null if [ $? -ne 0 ]; then echo "failed" else echo "done" fi fi echo -n "Stopping $L2TP... " if ! start-stop-daemon -q -K -x $L2TP_PROG; then echo "not running" return 1 else rm -f /var/run/$L2TP.pid echo "done" fi } restart() { stop sleep 10 start }
Скрипт содержит много отладочной информации, которая может быть удалена.
- Вставьте ваши логин и доменное имя или IP-адрес сервера в этот скрипт.
- Дайте права для исполнения скрипта:
chmod 755 /etc/init.d/openl2tpd
- Введите логин и пароль в
/etc/ppp/chap-secrets
:"логин" * "пароль"
- Добавьте строку replacedefaultroute и ipparam vpn в
/etc/ppp/options
. (ipparam не требуется для trunk). - Создайте новый интерфейс в
/etc/config/network
... config 'interface' 'vpn' option 'ifname' 'ppp0' option 'proto' 'none' ...
- Добавьте reqopts в раздел wan в
/etc/config/network
(опция msstaticroutes работает только в trunk).option reqopts 'staticroutes msstaticroutes'
Они нужны, чтобы получить статические маршруты от провайдера. Какие reqopts выбрать, зависит от провайдера. Они означают, какие опции DHCP использовать.
*“staticroutes”
= option 121
*“msstaticroutes”
= option 249
*“routes”
= option 33 (Это еще не реализовано в default.script, смотрите Ticket 10294). - Добавьте vpn интерфейс в зону wan в
/etc/config/firewall
:option network 'wan vpn'
- Теперь, после перезагрузки вы можете запустить openl2tp.
/etc/init.d/openl2tpd start
- Для запуска openl2tp при загрузке
/etc/init.d/openl2tpd enable
Поддержание соединения
Опция поддержания в pppd не всегда работает правильно. Именно поэтому я сделал скрипт keepalivel2tp для преподключения.
/etc/ppp/keepalivel2tp
#!/bin/sh if [ ! -f /var/run/openl2tpd.pid ]; then while [ ! -f /var/run/ppp0.pid ]; do { /etc/init.d/openl2tpd restart sleep 60 } done fi
Для использования этого скрипта вы должны дать права для его исполнения и настроить cron, чтобы периодически его запускать.