Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : gremlin@express.ru                   2:5020/400     15 Feb 2001  22:09:05
 To : All
 Subject : Re: прокси,   но не сквид
 -------------------------------------------------------------------------------- 
 
 Доброго времени суток!
 
 Eugeny Zadevalov wrote:
 
 >   значит, так. есть необходимость установить некий прокси сервер,
 >   который бы мог, сам ничего не кешировать, а только перенаправлять
 >   все запросы к себе на некий задаваемый в его конфигах парент прокси,
 >   который squid.
 
 [хрум]
 
 >   не с целью как такового проксирования а с целью самостоятельно раздавать
 >   доступ в интернет, через свою машину, то есть реально весь трафик пойдет
 >   через мою "официальную" пару логин:пароль, а для юзеров я сам буду
 >   раздавать, уже на мой вкус логины и пароли но уже к своему прокси...
 
 [хрум]
 
 >   умение авторизироваться на прокси нашего инет гейта, и умение
 >   перенаправлять запросы моих юзеров через меня к нему, и назад...
 
 Гм... такой изврат найти, IMAO, нереально. Как вариант - можно написать
 что-то свое на основе bounce. Собственно, сам демон там есть, нужно
 только прикрутить авторизацию.
 
 Если основной прокси не требует авторизации и она также не нужна на
 форвардере - можно пользовать bounce в чистом виде. Эта штука позволяет
 осуществлять простейшее "пробрасывание" TCP-соединений на внешние хосты,
 что позволяет использовать его, например, для доступа к SMTP и POP.
 
 Буде кому оно надо:
 
 /* bounce.c */
 
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <netinet/in.h>
 #include <netdb.h>
 #include <arpa/inet.h>
 #include <sys/ioctl.h>
 #include <signal.h>
 #include <sys/wait.h>
 
 #define    QLEN           5
 #define    DEFAULT_PORT   1523
 
 char sbuf[16384], cbuf[16384];
 extern int errno;
 
 void sigchld()
 {
   signal(SIGCHLD, sigchld);
   while(waitpid(0, (int *)0, WNOHANG|WUNTRACED)>=0);
 }
 
 void communicate(int sfd, int cfd)
 {
     char *chead, *ctail, *shead, *stail;
     int num, nfd, spos, cpos;
 
     extern int errno;
     fd_set rd, wr;
 
     struct itimerval itime;
 
     itime.it_interval.tv_sec=0;
     itime.it_interval.tv_usec=0;
     itime.it_value.tv_sec=21600;
     itime.it_value.tv_usec=0;
     setitimer(ITIMER_REAL,&itime,NULL);
 
     chead=ctail=cbuf;
     cpos=0;
     shead=stail=sbuf;
     spos=0;
     while (1)
     {
         FD_ZERO(&rd);
         FD_ZERO(&wr);
         if (spos<sizeof(sbuf)-1)
             FD_SET(sfd, &rd);
         if (ctail>chead)
             FD_SET(sfd, &wr);
         if (cpos<sizeof(cbuf)-1)
             FD_SET(cfd, &rd);
         if (stail>shead)
             FD_SET(cfd, &wr);
         nfd=select(256, &rd, &wr, 0, 0);
         if (nfd<=0) continue;
         if (FD_ISSET(sfd, &rd))
         {
             num=read(sfd,stail,sizeof(sbuf)-spos);
             if ((num==-1) && (errno != EWOULDBLOCK)) return;
             if (num==0)
             {
 #ifdef FNDELAY
                 fcntl(sfd,F_SETFL,fcntl(sfd,F_GETFL,0)&~FNDELAY);
                 fcntl(cfd,F_SETFL,fcntl(cfd,F_GETFL,0)&~FNDELAY);
 #endif
                 if (ctail!=chead) write(sfd,chead,ctail-chead);
                 if (stail!=shead) write(cfd,shead,stail-shead);
                 write(cfd,chead,0);
                 return;
             }
 
             if (num>0)
             {
                 spos+=num;
                 stail+=num;
                 if (!--nfd) continue;
             }
         }
         if (FD_ISSET(cfd, &rd))
         {
             num=read(cfd,ctail,sizeof(cbuf)-cpos);
             if ((num==-1) && (errno != EWOULDBLOCK)) return;
             if (num==0)
             {
 #ifdef FNDELAY
                 fcntl(sfd,F_SETFL,fcntl(sfd,F_GETFL,0)&~FNDELAY);
                 fcntl(cfd,F_SETFL,fcntl(cfd,F_GETFL,0)&~FNDELAY);
 #endif
                 if (ctail!=chead) write(sfd,chead,ctail-chead);
                 if (stail!=shead) write(cfd,shead,stail-shead);
                 write(sfd,chead,0);
                 return;
             }
 
             if (num>0)
             {
                 cpos+=num;
                 ctail+=num;
                 if (!--nfd) continue;
             }
         }
         if (FD_ISSET(sfd, &wr))
         {
             num=write(sfd,chead,ctail-chead);
             if ((num==-1) && (errno != EWOULDBLOCK)) return;
             if (num>0)
             {
                 chead += num;
                 if (chead==ctail)
                 {
                     chead=ctail=cbuf;
                     cpos=0;
                 }
                 if (!--nfd) continue;
             }
         }
         if (FD_ISSET(cfd, &wr))
         {
             num=write(cfd,shead,stail-shead);
             if ((num==-1) && (errno != EWOULDBLOCK)) return;
             if (num>0)
             {
                 shead += num;
                 if (shead==stail)
                 {
                     shead=stail=sbuf;
                     spos=0;
                 }
                 if (!--nfd) continue;
             }
         }
     }
 }
 
 void main(int argc, char **argv)
 {
     int srv_fd, rem_fd, len, cl_fd, on=1;
     int myport=DEFAULT_PORT, remoteport;
     struct sockaddr_in rem_addr, srv_addr, cl_addr;
     char *myname;
     struct hostent *hp;
 
     myname=argv[0];
 
     fprintf(stderr,"%s - TCP port bouncer\n",myname);
 
     if (argc==5)
     {
         if (strcmp(argv[1],"-p")==0)
         {
             if ((myport=atoi(argv[2]))==0)
             {
                 fprintf(stderr,"Bad port number.\n");
                 exit(-1);
             }
             argv+=2;
             argc-=2;
         }
         else
         {
             fprintf(stderr,"Use: %s [-p localport] machine port
 \n",myname);
             exit(-1);
         }
     }
     if (argc!=3)
     {
         fprintf(stderr,"Use: %s [-p localport] <host> <port>
 \n",myname);
         exit(-1);
     }
     if ((remoteport=atoi(argv[2]))<=0)
     {
         fprintf(stderr, "Bad remote port number.\n");
         exit(-1);
     }
 
     memset((char *) &rem_addr, 0, sizeof(rem_addr));
     memset((char *) &srv_addr, 0, sizeof(srv_addr));
     memset((char *) &cl_addr, 0, sizeof(cl_addr));
 
     cl_addr.sin_family=AF_INET;
     cl_addr.sin_port=htons(remoteport);
     if ((hp=gethostbyname(argv[1]))==NULL)
     {
         cl_addr.sin_addr.s_addr=inet_addr(argv[1]);
         if (cl_addr.sin_addr.s_addr==-1)
         {
             fprintf(stderr, "Unknown host.\n");
             exit(-1);
         }
     }
     else
         cl_addr.sin_addr=*(struct in_addr *)(hp->h_addr_list[0]);
 
     srv_addr.sin_family=AF_INET;
     srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
     srv_addr.sin_port=htons(myport);
     srv_fd=socket(PF_INET,SOCK_STREAM,0);
     if (bind(srv_fd,&srv_addr,sizeof(srv_addr))==-1)
     {
         perror("bind");
         exit(-1);
     }
 
     listen(srv_fd,QLEN);
 
     signal(SIGCHLD, sigchld);
     printf("Ready to bounce connections from port %i to %s on port
 %i\n",
            myport, argv[1], remoteport);
     close(0); close(1); close(2);
     chdir("/");;
 
 #ifdef TIOCNOTTY
     if ((rem_fd=open("/dev/tty", O_RDWR)) >= 0)
     {
         ioctl(rem_fd, TIOCNOTTY, (char *)0);
         close(rem_fd);
     }
 #endif
 
     if (fork()) exit(0);
 
     while (1)
     {
         len=sizeof(rem_addr);
         rem_fd=accept(srv_fd,&rem_addr,&len);
         if (rem_fd<0)
         {
           if (errno==EINTR) continue;
           exit(-1);
         }
         switch(fork())
         {
           case -1:
             break;
           case 0:
             close(rem_fd);
             break;
           default:
             close(srv_fd);
             if ((cl_fd=socket(PF_INET, SOCK_STREAM, 0))<0)
             {
                 close(rem_fd);
                 exit(-1);
             }
             if (connect(cl_fd, (struct sockaddr *)&cl_addr,
 sizeof(cl_addr))<0)
             {
                 close(rem_fd);
                 exit(-1);
             }
 
             setsockopt(cl_fd, SOL_SOCKET, SO_KEEPALIVE, &on,
 sizeof(on));
             setsockopt(rem_fd, SOL_SOCKET, SO_KEEPALIVE, &on,
 sizeof(on));
 
             communicate(cl_fd, rem_fd);
             close(rem_fd);
             exit(0);
         }
     }
 }
 
 /* EOF */
 
 - ---
 Alexey V. Vissarionov <gremlin AT express.ru>
 
 ... У меня стоит UNIX, а у вас висит Windows.
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 прокси, но не сквид   Eugeny Zadevalov   14 Feb 2001 20:11:32 
 Re: прокси, но не сквид   Nick Gazaloff   15 Feb 2001 16:16:09 
 Re: прокси, но не сквид   gremlin@express.ru   15 Feb 2001 22:09:05 
Архивное /ru.linux/46429a432feb.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional