ru:doc:howto:connect_by_l2tp

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ru:doc:howto:connect_by_l2tp [2012/11/06 19:07]
ru:doc:howto:connect_by_l2tp [2014/04/15 22:14] (current)
Line 1: Line 1:
 +====== Подключение к провайдеру используя L2TP с Dual Access ======
 +Многие провайдеры России,​ Украины,​ Израиля и других стран предоставляют подключение с использованием [[wp>​Layer 2 Tunneling Protocol]]. Во многих случаях провайдер предоставляет "​локальную"​ сеть, где находятся внутренние ресурсы провайдера (FTP, форумы и т.д.). Кроме того, пользователи могут обмениваться файлами через "​локальную"​ сеть с помощью P2P-программ,​ например [[doc:​howto:​dc.overview|Direct Connect]]. Трафик в "​локальной"​ сети бесплатен и (или) не ограничена скорость. Это и называется Dual Access.
  
 +Единственный пакет OpenWrt, который использует ядро для передачи L2TP трафика это ''​openl2tp''​. Данное руководство поможет настроить OpenWrt для подключения к провайдеру с помощью этого пакета.
 +
 +===== Подготовка =====
 +==== Необходимые пакеты ====
 +  ***''​openl2tp-full''​**
 +
 +===== Установка =====
 +<​code>​
 +opkg install openl2tp-full
 +</​code>​
 +
 +===== Настройка =====
 +  - Создайте скрипт openl2tpd в /​etc/​init.d/<​code bash>
 +#!/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
 +}
 +</​code>​ Скрипт содержит много отладочной информации,​ которая может быть удалена.
 +  - Вставьте ваши логин и доменное имя или IP-адрес сервера в этот скрипт.
 +  - Дайте права для исполнения скрипта:<​code>​
 +chmod 755 /​etc/​init.d/​openl2tpd
 +</​code>​
 +  - Введите логин и пароль в ''/​etc/​ppp/​chap-secrets'':<​code>​
 +"​логин"​ * "​пароль"​
 +</​code>​
 +  - Добавьте строку **replacedefaultroute** и **ipparam vpn** в ''/​etc/​ppp/​options''​. (ipparam не требуется для trunk).
 +  - Создайте новый интерфейс в ''​[[doc:​uci:​network|/​etc/​config/​network]]''<​code>​
 +...
 +config '​interface'​ '​vpn'​
 + option '​ifname'​ '​ppp0'​
 + option '​proto'​ '​none'​
 +...
 +</​code>​
 +  - Добавьте reqopts в раздел wan в ''/​etc/​config/​network''​ (опция msstaticroutes работает только в trunk).<​code>​
 +option reqopts '​staticroutes msstaticroutes'​
 +</​code>​ Они нужны, чтобы получить статические маршруты от провайдера. Какие reqopts выбрать,​ зависит от провайдера. Они означают,​ какие опции DHCP использовать.\\ ​   * //''"​staticroutes"''​ = option 121 \\    * //''"​msstaticroutes"''​ = option 249 \\    * ''"​routes"''​ = option 33 (Это еще не реализовано в default.script,​ смотрите [[https://​dev.openwrt.org/​ticket/​10294|Ticket 10294]]).
 +  - Добавьте vpn интерфейс в зону wan в ''​[[doc:​uci:​firewall|/​etc/​config/​firewall]]'':<​code>​
 +option network 'wan vpn'
 +</​code>​
 +  - Теперь,​ после перезагрузки вы можете запустить openl2tp.<​code>​
 +/​etc/​init.d/​openl2tpd start
 +</​code>​
 +  - Для запуска openl2tp при загрузке<​code>​
 +/​etc/​init.d/​openl2tpd enable
 +</​code>​
 +
 +
 +==== Поддержание соединения ====
 +Опция поддержания в pppd не всегда работает правильно. Именно поэтому я сделал скрипт keepalivel2tp для преподключения.
 +
 +/​etc/​ppp/​keepalivel2tp
 +<​code>​
 +#!/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 
 +</​code>​
 +Для использования этого скрипта вы должны дать права для его исполнения и настроить cron, чтобы периодически его запускать.