*** Для страждущих, наваял тут патч для 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 */