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


ru.nethack

 
 - RU.NETHACK -------------------------------------------------------------------
 From : Alexey V. Vissarionov                2:5020/545     25 Jan 2004  01:39:58
 To : Leonid Zaprudsky
 Subject : пpокси?
 -------------------------------------------------------------------------------- 
 
 
 24 Jan 04  20:44:28 Leonid Zaprudsky -> All:
 
  LZ> есть два компа в локальной сети: один из них с очень-очень огpаниченными 
  LZ> pесypсами(но вин 95 стоит), интеpнета на нем нет, на втоpом - есть 
  LZ> интеpнет, чеpез некий внешний вингейт.
  LZ> Задача: запyстить на втоpом некyю пpогpаммy, пpи pаботе котоpой было бы 
  LZ> возможно выходить в интеpнет с пеpвой, пpосто yказав в эксплоpеpе адpес 
  LZ> пpокси.
  LZ> Какая пpогpамма спpавится с этим?
 
 Что-нибудь наподобие этого:
 
 ==== хрум 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)
    {
     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)
    {
     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;
    }
   }
  }
 }
 
 int 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];
  if (argc == 5)
  {
   if (!strcasecmp(argv[1], "-p"))
   {
    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] machine 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("/");
  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:
    /* we're in the background.. no-one to complain to */
    break;
   case 0:                       /* child process */
    close(rem_fd);
    break;
   default:                      /* parent process */
    close(srv_fd);               /* close original socket */
    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);
   }
  }
 }
 
 ==== тьфу bounce.c ====
 
 Как собрать это под форточками, можешь не спрашивать - я вот уже седьмой год
 оные наблюдаю на расстоянии не менее 2 метров.
 Alexey V. Vissarionov aka Gremlin from Kremlin (gremlin ПРИ gremlin ТЧК ru)
 [DRBL] [OWL] [SRT]
 
 ... Лучше пусть судят трое, чем несут четверо
 --- /bin/vi
  * Origin: http://openwall.com/Owl/ru/ (2:5020/545)
 
 

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

 Тема:    Автор:    Дата:  
 пpокси?   Leonid Zaprudsky   24 Jan 2004 21:44:28 
 пpокси?   Il\'ya Teterin   24 Jan 2004 23:04:56 
 пpокси?   Leonid Zaprudsky   24 Jan 2004 23:52:06 
 пpокси?   Il\'ya Teterin   25 Jan 2004 00:26:30 
 пpокси?   Leonid Zaprudsky   25 Jan 2004 15:59:18 
 пpокси?   Il\'ya Teterin   25 Jan 2004 18:01:13 
 пpокси?   Leonid Zaprudsky   25 Jan 2004 19:33:24 
 пpокси?   Alexey V. Vissarionov   25 Jan 2004 01:39:58 
 пpокси?   Leonid Zaprudsky   25 Jan 2004 16:02:20 
 пpокси?   Alexey V. Vissarionov   25 Jan 2004 16:55:56 
 RE: пpокси?   Andrey Yasenovskiy   26 Jan 2004 01:55:49 
Архивное /ru.nethack/22940012e994.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional