Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
CheckBootSpeed - это диагностический пакет на основе скриптов PowerShell, создающий отчет о скорости загрузки Windows 7 ...
Вы когда-нибудь хотели создать установочный диск Windows, который бы автоматически установил систему, не задавая вопросо...
Если после установки Windows XP у вас перестала загружаться Windows Vista или Windows 7, вам необходимо восстановить заг...
Программа подготовки документов и ведения учетных и отчетных данных по командировкам. Используются формы, утвержденные п...
Red Button – это мощная утилита для оптимизации и очистки всех актуальных клиентских версий операционной системы Windows...
OSzone.net Видео Unix Интернет Маршрутизация, NAT PPTPD - привязка к номеру интерфейса RSS

PPTPD - привязка к номеру интерфейса

Текущий рейтинг: 5 (проголосовало 2)
 Посетителей: 1135 | Просмотров: 1390 (сегодня 0)  Шрифт: - +
*** Для страждущих, наваял тут патч для 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 */

Иcточник: http://www.opennet.ru  •  Опубликована: 05.03.2005
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:  


Оценить статью:
Вверх
Комментарии посетителей
Комментарии отключены. С вопросами по статьям обращайтесь в форум.