Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 28 • Страница 2 из 2<  1  2
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 30.09.2005
Откуда: Пермь
Фото: 10
-=ilya=- писал(а):
Тебе нужно разрешить прохождение udp броадкастов на твоем компе-роутере на порты 137-138

А где\как это делается в ОС?

_________________
Ждун 80 lvl



Партнер
 

Member
Статус: Не в сети
Регистрация: 25.01.2003
Откуда: UA
Taurus_busy, -=ilya=-
3 уровень - маршрутизатор(ходит то что разрешено тому кому это надо)
2 - свич(бродкасты ходят всем)
1 -хаб(все ходит всем)
Хабом комп конечно не сделаешь, а вот свичем - запросто :)


 

Member
Статус: Не в сети
Регистрация: 27.11.2004
Откуда: г.Ульяновск, РФ
Уважаемый, -=ilya=-, не путайте, пожалуйста, броадкаст-пакеты (уровень IP) и броадкаст-фреймы (уровень Ethernet).

-=ilya=- писал(а):
обычный компьютер с несколькими сетевыми интерфейсами подобен свичу

Он подобен маршрутизатору, а не свичу.
-=ilya=- писал(а):
т.е. разбивает сеть на несколько броадкаст-доменов

Он разбивает сеть на несколько подсетей, IP-броадкаст домен в этом случае один.
Добавлено спустя 4 минуты, 33 секунды
to ALL
Для повышения общей грамотности советую всем перечитать "Компьютерные сети" авторства супругов Олиферов.

_________________
Device not ready - девица не готова


 

Прошу меня извинить, меня, видимо, малость занесло :) попутал термины :oops:.
Каюсь, вместо маршрутизатор написал коммутатор :oops: а все свичи обозвал хабами надеюсь, они за это не сильно обидятся :).

Но это некоторое отклонение от вопроса.

Focusnik я могу сказать, как это сделать в линуксе, но вот под windows - увы бессилен.
Вот пример из жизни. Есть ЛВС из нескольких сегментов. Компьютеры из каждого сегмента в "сетевом окружении" видят только машины из своего сегмента, т.к. широковещательные пакеты из одного сегмента не попадают к соседям. Таким образом, общение машин внутри одного сегмента (включая поиск компьютера через сетевое окружение) не сказывается на загрузке другого сегмента. В противном случае производительность сети несколько ухудшиться.
Мой совет - присмотрись к NetLook и другим аналогичным программам (не думаю, что она единственная).
Если все же решишь разрешить udp-броадкасты, то подними WINS сервер, чтобы все запросы шли сначала к нему, а уж после рассылались широковещательные пакеты.
Насчет DHCP. 47 машин - это лишь начало. Dima-1 правильно написал:
Цитата:
не надо ко всем бегать и менять настройки :) Поменял на сервере как надо и мозг не паришь :)

Сейчас тебя это не напрягает, но как только число машин увеличиться, то поймешь все прелести динамической адресации. Ну и плюс помимо самих адресов можно раздавать и другие параметры, например, адреса dns и wins серверов.


 

Member
Статус: Не в сети
Регистрация: 30.09.2005
Откуда: Пермь
Фото: 10
Понял вообщем. Спасибо.
А вот
-=ilya=- писал(а):
я могу сказать, как это сделать в линуксе

об этом пожалуйта поподробней. Это тоже знать не помешает.
Не вечно же в окна смотреть. :)

_________________
Ждун 80 lvl


 

Оказалось не все так просто :)
Вот результат моих изысканий
Код:
/*
******************************************************************
udpfw - UDP Broadcast Packet Forwarder, it forwards udp broadcast
      packets to all interfaces except the interface it came from

Copyleft (c) 2005 -=ilya=-
This programm was based on udp_broadcast_fw written by Nathan
O'Sullivan in late 2002

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
******************************************************************

Thanks:

Arny <cs6171@scitsc.wlv.ac.uk>
- public domain UDP spoofing code
http://www.netfor2.com/ip.htm
- IP/UDP packet formatting info
Nathan O'Sullivan
- udp_broadcast_fw

*/

#define MAXIFS    4
#define DPRINT  printf
//#define DEBUG    1
#define IPHEADER_LEN 20
#define UDPHEADER_LEN 8
#define HEADER_LEN (IPHEADER_LEN + UDPHEADER_LEN)
 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <linux/if.h>
#include <sys/ioctl.h>

main(int argc,char **argv)
{
    /* We use two sockets - one for receiving broadcast packets (type UDP), and
       one for spoofing them (type RAW) */
    int fd,rcv;
   
    int yes=1;
   
    char *ifaddr[4]={"10.0.0.255","10.1.0.255","192.168.15.255","255.255.255.255"};

    /* Structure holds info on local interfaces */
    struct ifconf ifc; int numifs;
    struct ifreq* reqbuf;
       
    /* list of addresses on local machine */
    struct sockaddr_in addr[MAXIFS];
    struct sockaddr_in addrbc[MAXIFS];
    int num_addr = 0;
   
    /* Address broadcast packet was sent from */
    struct sockaddr_in rcv_addr;
   
    int x=1, len;
    int xx[MAXIFS],xi,num;
   
    u_char gram[4096]=
    {
        0x45,    0x00,    0x00,    0x26,
        0x12,    0x34,    0x00,    0x00,
        0xFF,    0x11,    0,    0,
        0,    0,    0,    0,
        0,    0,    0,    0,
        0,    0,    0,    0,
        0x00,    0x12,    0x00,    0x00,
        '1','2','3','4','5','6','7','8','9','0'
    };

    /* Error out if no port specified */   
    if(argc!=3)
    {
        fprintf(stderr,"usage: %s ip-bcast-addr udp-port\n",*argv);
        fprintf(stderr,"This program listens for broadcast packets on the specified udp-port\n"
            "  on the specified ip broadcast address and then forwards them to each IP on\n"
            "  the local host.  Packets are sent such that they appear to have come from\n"
            "  the original broadcaster\n"
            );
        exit(1);
    };

    /* Create our broadcast socket */
        if((rcv=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0)
          {
          perror("socket");
          exit(1);
          };
//    x = 1;
        setsockopt(rcv, SOL_SOCKET, SO_BROADCAST, (char*) &x, sizeof(int));

    /* We bind it to broadcast addr on the given port */
//10.0.0.255
        addrbc[0].sin_family = AF_INET;
        addrbc[0].sin_port = htons(atoi(argv[2]));
        inet_aton(ifaddr[0],&(addrbc[0].sin_addr.s_addr));
#ifdef DEBUG
        DPRINT("%s\n",inet_ntoa(addrbc[0].sin_addr) );
#endif
//10.1.0.255
        addrbc[1].sin_family = AF_INET;
        addrbc[1].sin_port = htons(atoi(argv[2]));
        inet_aton(ifaddr[1],&(addrbc[1].sin_addr.s_addr));
#ifdef DEBUG
        DPRINT("%s\n",inet_ntoa(addrbc[1].sin_addr) );
#endif
//192.168.15.255
        addrbc[2].sin_family = AF_INET;
        addrbc[2].sin_port = htons(atoi(argv[2]));
        inet_aton(ifaddr[2],&(addrbc[2].sin_addr.s_addr));
#ifdef DEBUG
        DPRINT("%s\n",inet_ntoa(addrbc[2].sin_addr) );
#endif
//255.255.255.255
        addrbc[3].sin_port = htons(atoi(argv[2]));
    addrbc[3].sin_addr.s_addr = INADDR_BROADCAST;
#ifdef DEBUG
        DPRINT("%s\n",inet_ntoa(addrbc[3].sin_addr) );
    DPRINT("addresses set\n");
#endif

   
        rcv_addr.sin_family = AF_INET;
    rcv_addr.sin_port = htons(atoi(argv[2]));
    inet_aton(argv[1],&(rcv_addr.sin_addr.s_addr));
#ifdef DEBUG
        DPRINT("%s\n",inet_ntoa(rcv_addr.sin_addr) );
#endif

    for(x=0;x<MAXIFS;x++)
    if(addrbc[x].sin_addr.s_addr==rcv_addr.sin_addr.s_addr)
      num=x;
#ifdef DEBUG
    DPRINT("recieving from #%d %s\n",num,inet_ntoa(addrbc[num].sin_addr) );
#endif


        if ( bind (rcv, &rcv_addr, sizeof(struct sockaddr_in) ) < 0 )
        {
        perror("bind");
        fprintf(stderr,"A program is already bound to the broadcast address for the given port\n");
        exit(1);
        }
#ifdef DEBUG
    DPRINT("sockets binded \n");
#endif
   
    /* Set up a raw socket for sending our packets through */
    if((fd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) < 0)
      {
          perror("socket");
          exit(1);
      };

    /* Set dest port to that provided on command line */
    *(u_short*)(gram+22)=(u_short)htons(atoi(argv[2]));

    /* Enable IP header stuff on the raw socket */
    #ifdef IP_HDRINCL
    x=1;
    if (setsockopt(fd,IPPROTO_IP,IP_HDRINCL,(char*)&x,sizeof(x))<0)
    {
        perror("setsockopt IP_HDRINCL");
        exit(1);
      };
    #else
    #error IP_HDRINCL support is required
    #endif

     /* Fork to background */
  #ifndef DEBUG
  if (fork())
    exit(0);

  fclose(stdin);
  fclose(stdout);
  fclose(stderr);
  #endif

    for (;;)
    {
        /* Receive a broadcast packet */
#ifdef DEBUG
            DPRINT("main cycle entered\n");
#endif

            x = sizeof(struct sockaddr_in);
            len = recvfrom(rcv,gram+ HEADER_LEN,4006 - HEADER_LEN - 1,0,&rcv_addr,&x);

#ifdef DEBUG
            DPRINT("%d bytes from %s\n",len,inet_ntoa(rcv_addr.sin_addr));
#endif
            if (len <= 0) continue;        /* ignore broken packets */
       

            gram[HEADER_LEN + len] =0;
#ifdef DEBUG
            DPRINT("%s\n",gram+HEADER_LEN);
#endif
   
        /* copy sender's details into our datagram as the source addr */   
            bcopy(&(rcv_addr.sin_addr.s_addr),(gram+12),4);
              *(u_short*)(gram+20)=(u_short)rcv_addr.sin_port;

        /* set the length of the packet */
            *(u_short*)(gram+24)=htons(8 + len);
            *(u_short*)(gram+2)=htons(28+len);

        /* Iterate through the local addresses and send packet to each one */
            for (xi=0;xi<MAXIFS-1;xi++)
            {
            /* Set destination addr ip - port is set already*/
            bcopy(&(addrbc[xi].sin_addr.s_addr),(gram+16),4);   

#ifdef DEBUG
            DPRINT("%d - %s:%d",x,inet_ntoa(rcv_addr.sin_addr),ntohs(rcv_addr.sin_port) );
            DPRINT (" => %s:%d\n", inet_ntoa(addrbc[xi].sin_addr),ntohs(*(u_short*)(gram+22)) );
#endif
               
            if (setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes))<0)
            {
                perror("setsockopt");
                exit(1);
            }
            /* Send the packet */
            if (xi!=num)
                if (sendto(fd,&gram,28+len,0,(struct sockaddr*)&addrbc[xi],sizeof(struct sockaddr)) < 0)
                perror("sendto");
            }
       
    }
}

пример запуска udpfw 10.0.0.255 138,
где 10.0.0.255 - адрес с которого надо форвардить пакеты
138 - номер порта

я сильно не заморачивался, так что интерфейсы прописаны в массиве строк ifaddr, кол-во интерфейсов+1 указано в константе MAXIFS

чтобы обеспечить прозрачность общения windows-машин, видимо, придется запустить
несколько демонов - по два на каждый интерфейс (на 137 и 138 порты)

пользуйтесь на здоровье и сообщайте о найденных багах :)


 

Member
Статус: Не в сети
Регистрация: 30.09.2005
Откуда: Пермь
Фото: 10
Да... Мне, чайнику, до такого рости и рости. :)
Как появится возможность перевести сервер на Linux, буду разбираться.
Спасибо.

_________________
Ждун 80 lvl


 

Advanced member
Статус: Не в сети
Регистрация: 20.10.2004
Откуда: С-Пб
rektom
поднимай на сервере домен Active Directory, тем более что у тебя 2003 винда.. пользователи домена будут видеть друг друга, не зависимо от того в какой подсети они находятся, так же, имея 47 компов DHCP имеет смысл ставить, а всякие "прожки" забудь - попса это, в 2003 все и так есть... да, а рабочие группы дальше своей подсети ничего не обозревают без WINS.. а смысла городить этот анахронизм я лично не вижу... твое решение - DNS с поднятым доменом AD + DHCP и все будет гут :)

_________________
Матом не ругаюсь, я на нем разговариваю
интересуют антикварные АМД-системы. писать в ЛС.
НЕНАВИЖУ ASUS!!!
*AMD OverClan*


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 28 • Страница 2 из 2<  1  2
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan