Подключение к провайдеру используя 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, чтобы периодически его запускать.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2018/09/16 11:53
  • by bobafetthotmail