The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

PPTPD - привязка к номеру интерфейса. (pptp patch interface)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: pptp, patch, interface,  (найти похожие документы)
From: Den68 Newsgroups: mail Date: Fri, 13 Aug 2004 02:36:41 +0600 (YEKST) Subject: PPTPD - привязка к номеру интерфейса. *** Для страждущих, наваял тут патч для pptpd, теперь можно VPN прикрутить к текущему STG без глобальных переделок. *** *** Смысл патча: *** - привязка номера ppp интрфейса к IP адресу *** *** Пример: наружная сеть: 10.0.100.0 *** Внутренняя сеть: 192.168.90.0 (где живет STG (билинг такой)) *** DHCPD выдает адреса для сети 10.0.100.0 идентичные по последней цифре с сетью 192.168.90.0, например: *** *** Пользователь прописан в STG с IP адресом 192.168.90.77, как следствие, интерфейс для подсчета трафика ему прописывается ppp77. *** DHCPD должен выдавать ему IP адрес во внешней сети 10.0.100.77 *** в CHAP-SECRET в директории /etc/ppp/ соответственно заноситься *** *** <логин STG> * <пароль STG> 192.168.90.77 *** *** как следствие, ему при установлении ВПН соеденения присваивается ИП 192.168.90.77 внутренней сети, а интерфейс в результате применения патча становиться ppp77 - STG считает трафик. *** *** При тестах использовались: *** pptpd 1.2.1 *** pppd 2.4.2 *** mppe pppd + kernel 2.4.26 patch (не обязательно) *** stargazer-1 (последний релиз (бета ?)) *** С вопросами и поправками можно по адресу admin (@) nkl . ru *** *** Сам патч: (pptpd 1.2.1) *** *** /INSTALL/PPTPD/pptpd-1.2.1/pptpctrl.c Tue Aug 10 17:55:12 2004 --- /INSTALL/PPTPD-PATCH/pptpd-1.2.1/pptpctrl.c Thu Aug 12 23:56:24 2004 *************** *** 101,112 **** { char pppLocal[16]; /* local IP to pass to pppd */ char pppRemote[16]; /* remote IP address to pass to pppd */ struct sockaddr_in addr; /* client address */ socklen_t addrlen; int arg = 1; int flags; struct in_addr inetaddrs[2]; ! char *pppaddrs[2] = { pppLocal, pppRemote }; gargc = argc; gargv = argv; --- 101,115 ---- { char pppLocal[16]; /* local IP to pass to pppd */ char pppRemote[16]; /* remote IP address to pass to pppd */ + char ConnectIP[16]; /* Connect IP address to pass to pppd */ + struct sockaddr_in addr; /* client address */ socklen_t addrlen; int arg = 1; int flags; struct in_addr inetaddrs[2]; ! // char *pppaddrs[2] = { pppLocal, pppRemote }; ! char *pppaddrs[3] = { pppLocal, pppRemote, ConnectIP }; gargc = argc; gargv = argv; *************** *** 183,190 **** signal(SIGTERM, &bail); NOTE_VALUE(PAC, call_id_pair, htons(-1)); NOTE_VALUE(PNS, call_id_pair, htons(-1)); ! syslog(LOG_INFO, "CTRL: Client %s control connection started", inet_ntoa(addr.sin_addr)); pptp_handle_ctrl_connection(pppaddrs, inetaddrs); syslog(LOG_DEBUG, "CTRL: Reaping child PPP[%i]", pppfork); if (pppfork > 0) --- 186,198 ---- signal(SIGTERM, &bail); NOTE_VALUE(PAC, call_id_pair, htons(-1)); NOTE_VALUE(PNS, call_id_pair, htons(-1)); ! /* ! !!!!!!!!!!!!!!!!! Insert CONNECT address !!!!!!!!!!!!!!!!!!!!!! ! */ syslog(LOG_INFO, "CTRL: Client %s control connection started", inet_ntoa(addr.sin_addr)); + // + inetaddrs[2] = addr.sin_addr; + // pptp_handle_ctrl_connection(pppaddrs, inetaddrs); syslog(LOG_DEBUG, "CTRL: Reaping child PPP[%i]", pppfork); if (pppfork > 0) *************** *** 374,379 **** --- 382,390 ---- inet_ntoa(inetaddrs[1]), ntohs(((struct pptp_out_call_rply *) (rply_packet))->call_id_peer), ntohs(((struct pptp_out_call_rply *) (rply_packet))->call_id)); + /* + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! startCall !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 + */ if ((pty_fd = startCall(pppaddrs, inetaddrs)) > maxfd) maxfd = pty_fd; *************** *** 595,600 **** --- 606,614 ---- #elif clientSocket > 1 close(clientSocket); #endif + /* + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! launch_pppd !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ launch_pppd(pppaddrs, inetaddrs); syslog(LOG_ERR, "CTRL: PPPD launch failed! (launch_pppd did not fork)"); _exit(1); *************** *** 620,625 **** --- 634,641 ---- { char *pppd_argv[14]; int an = 0; + char m[4][4]; // = {'\0','\0','\0','\0'}; + int z = 0; sigset_t sigs; pppd_argv[an++] = ppp_binary; *************** *** 739,744 **** --- 755,775 ---- pppd_argv[an++] = inet_ntoa(inetaddrs[1]); } + /* + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PPP-INTERFACE OCTET !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + + z = sscanf(inet_ntoa(inetaddrs[2]), "%s.%s.%s.%s", m[0], m[1], m[2], m[3]); + if ( z > 0 ) + { + pppd_argv[an++] = "unit"; + pppd_argv[an++] = m[3]; + syslog(LOG_DEBUG, "CTRL (PPP-INTERFACE OCTET): ( planed: ppp%s )", m[3]); + } else { + syslog(LOG_DEBUG, "CTRL (PPP-INTERFACE OCTET): ( NOT CONVERT ppp IFACE )"); + } + + /* argv arrays must always be NULL terminated */ pppd_argv[an++] = NULL; /* make sure SIGCHLD is unblocked, pppd does not expect it */

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1.1, Тошик (??), 04:40, 16/11/2004 [ответить]  
  • +/
    Простите ламу за вопрос. Но как патчить то?
     
  • 1.2, Cinos (?), 20:28, 24/12/2004 [ответить]  
  • +/
    Как я понимаю патч привязывает к ип наружней сети. А это ничего не даёт. Пользователь может поставить у себя ип и мак другого пользователя прописать статично ип внутренней сети который ты действительно ему назначешь и нормально пройдет атентификацию а вот интерфейс у него будет другого пользователя по которому ты и собираешься считать :-) Так что помоему использовать патч нецелесообразно
     
  • 1.3, Cinos (?), 17:49, 25/12/2004 [ответить]  
  • +/
    Данный патч на мой взгляд неактуален. Как и остальные патчи привязки интерфейса к ип поскольку привязывают интерфейс к внешнему ип а не ип выдаваемый pptpd внешний ип можно сменить если конечно на каждый порт свича не будет прописан мак пользователя. Вязать надо к внутреннему ип а это или не возможно или сложно поскольку pppd или ppp сначала создают интерфейс а уж потом производят аутентификацию. Если кто знает как с помощью ioctl сменить имя интерфейса текущей сесии прошу бросить на мыло. Тогда будет возможно привязать ppp и pppd  (а соответственно и все довески к ним pptpd, pppoe и др.) к номеру интерфейса без возможности со строны пользователя сменить его.
     
  • 1.4, Vas (??), 19:23, 28/03/2005 [ответить]  
  • +/
    patch -p1 pptpctrl.c < ../pptpd_patch
     
  • 1.5, kesha (??), 03:32, 10/01/2006 [ответить]  
  • +/
    а что если из внешнего файла (к примеру конфига пользователя) выуживать нужный номер интерфейса?
     
  • 1.6, fi (?), 10:47, 26/05/2006 [ответить]  
  • +/
    Там кто писал про невозможное :))

    в /etc/ppp/ip-up дописать следующее:
    if [ $5 = "remote_ip_addr"  ];
        then
            /sbin/ifconfig $1 down
            /sbin/ip link set $1 name iface_name
            /sbin/ifconfig iface_name up
    fi

    всё работает)

     
  • 1.7, fi (?), 11:03, 26/05/2006 [ответить]  
  • +/
    где remote_ip_addr -- ip адрес, установленный клиенту, iface_name -- имя интерфейса, которое хотим назначить, например kolya, wasya ...


    зы. Сначала лучше создать отдельный скрипт и проверить чтоб не было всяких синтакс ероров в том что сверху)

     
  • 1.8, ZigFisher (?), 14:45, 08/02/2007 [ответить]  
  • +/
    Так IMHO, красивше будет :)
    http://zft.crimeainfo.com/


    NEWNAME="ppp-$PEERNAME"
    [ -z "$PEERNAME" ] && NEWNAME="$1"

    if [ -x /sbin/ip ]; then
            /sbin/ip link set $1 down
            /sbin/ip link set $1 name $NEWNAME
            /sbin/ip link set $NEWNAME up
    fi

     
  • 1.9, Elifan (?), 12:44, 18/07/2007 [ответить]  
  • +/
    Может возникнуть проблема с ioctl, например при отключение пользователя и не будет писаться статистика трафика.
    Второе - может быть слишком длинное имя интерфейса. Обрубание его до н-го количества символов приемлемо, но... когда есть пользователи, с именами отличающимся только последними симоволами, то это проблема!
     
  • 1.10, yurgen (??), 07:15, 26/01/2019 [ответить]  
  • +/
    Второй вариант не захотел работать с pFsense (клиент vpn), скрипт работает на Centos (server vpn). Мож кому пригодиться, немного упростил:
    NEWNAME=$PEERNAME

    if [ -x /sbin/ip ]; then
            /sbin/ip link set $1 down
            /sbin/ip link set $1 name $NEWNAME
            /sbin/ip link set $NEWNAME up
    fi

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру