Подключение к провайдеру используя L2TP с Dual Access

Многие провайдеры России, Украины, Израиля и других стран предоставляют подключение с использованием Layer 2 Tunneling Protocol. Во многих случаях провайдер предоставляет "локальную" сеть, где находятся внутренние ресурсы провайдера (FTP, форумы и т.д.). Кроме того, пользователи могут обмениваться файлами через "локальную" сеть с помощью P2P-программ, например Direct Connect. Трафик в "локальной" сети бесплатен и (или) не ограничена скорость. Это и называется Dual Access.

Единственный пакет OpenWrt, который использует ядро для передачи L2TP трафика это openl2tp. Данное руководство поможет настроить OpenWrt для подключения к провайдеру с помощью этого пакета.

Подготовка

Необходимые пакеты

  • openl2tp-full

Установка

opkg install openl2tp-full

Настройка

  1. Создайте скрипт 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
    }
    Скрипт содержит много отладочной информации, которая может быть удалена.
  2. Вставьте ваши логин и доменное имя или IP-адрес сервера в этот скрипт.
  3. Дайте права для исполнения скрипта:
    chmod 755 /etc/init.d/openl2tpd
    
  4. Введите логин и пароль в /etc/ppp/chap-secrets:
    "логин" * "пароль"
    
  5. Добавьте строку replacedefaultroute и ipparam vpn в /etc/ppp/options. (ipparam не требуется для trunk).
  6. Создайте новый интерфейс в /etc/config/network
    ...
    config 'interface' 'vpn'
    	option 'ifname' 'ppp0'
    	option 'proto' 'none'
    ...
    
  7. Добавьте 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).
  8. Добавьте vpn интерфейс в зону wan в /etc/config/firewall:
    option network 'wan vpn'
    
  9. Теперь, после перезагрузки вы можете запустить openl2tp.
    /etc/init.d/openl2tpd start
    
  10. Для запуска 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, чтобы периодически его запускать.

Back to top

ru/doc/howto/connect_by_l2tp.txt · Last modified: 2014/04/15 22:14 by pelewin