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