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.1 , Тошик (?? ), 04:40, 16/11/2004 [ответить ]
+ /–
Простите ламу за вопрос. Но как патчить то?
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.4 , Vas (?? ), 19:23, 28/03/2005 [ответить ]
+ /–
patch -p1 pptpctrl.c < ../pptpd_patch
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.8 , ZigFisher (? ), 14:45, 08/02/2007 [ответить ]
+ /–
Так IMHO, красивше будет :)
http://zft.crimeainfo.com/
NEWNAME="ppp-$PEERNAME"
[ -z "$PEERNAME" ] && NEWNAME="$1"
if [ -x /sbin/ip ]; then
/sbin/ip link set $1 down
/sbin/ip link set $1 name $NEWNAME
/sbin/ip link set $NEWNAME up
fi
1.9 , Elifan (? ), 12:44, 18/07/2007 [ответить ]
+ /–
Может возникнуть проблема с ioctl, например при отключение пользователя и не будет писаться статистика трафика.
Второе - может быть слишком длинное имя интерфейса. Обрубание его до н-го количества символов приемлемо, но... когда есть пользователи, с именами отличающимся только последними симоволами, то это проблема!
1.10 , yurgen (?? ), 07:15, 26/01/2019 [ответить ]
+ /–
Второй вариант не захотел работать с pFsense (клиент vpn), скрипт работает на Centos (server vpn). Мож кому пригодиться, немного упростил:
NEWNAME=$PEERNAME
if [ -x /sbin/ip ]; then
/sbin/ip link set $1 down
/sbin/ip link set $1 name $NEWNAME
/sbin/ip link set $NEWNAME up
fi