URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID11
Нить номер: 26
[ Назад ]

Исходное сообщение
"Patch PPTPD: PPPD привязать к интерфейсу"

Отправлено Den68 , 16-Авг-04 13:35 
*** Для страждущих, наваял тут патч для 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 */

Содержание

Сообщения в этом обсуждении