PPTPD - привязка к номеру интерфейса. (pptp patch interface)
Ключевые слова: 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 */
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.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.9 , Elifan , 12:44, 18/07/2007 [ответить ] [смотреть все ]
+ /–
Может возникнуть проблема с ioctl, например при отключение пользователя и не будет писаться статистика трафика.
Второе - может быть слишком длинное имя интерфейса. Обрубание его до н-го количества символов приемлемо, но... когда есть пользователи, с именами отличающимся только последними симоволами, то это проблема!
Ваш комментарий
ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!
Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и
свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и
преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО,
обучающие и методические статьи.
Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за
2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.
Оформить подписку на год