ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Архив за Август, 2008

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Предыстория

Однажды возник вопрос о том, как оперативно получать информацию о состоянии сети, когда находишься не у рабочего места.
Путем нехитрых размышлений был найден единственный выход: отсылка SMS-сообщений системой мониторинга о ключевых событиях.

Для реализации этого проекта были куплены GSM модем Siemens MC35i и 1-портовый асинхронный сервер Moxa NPort-5110, обеспечивающий преобразование интерфейса RS-232 в Ethernet и конечно же сервер под FreeBSD 🙂

Moxa NPort-5110 был приобретен для цели отсылки SMS-сообщений из любого сегмента сети, а не только с машины, к которой подключен GSM-шлюз.

Теория с примерами

Итак, конфигурация схемы следующая:

GSM модем включен в Moxa NPort-5110 кабелем RS-232.

Moxa имеет адрес 10.100.0.2:4001. Для отправки сообщения на латинице нужно выполнить следующую последовательность команд на модеме:

telnet 10.100.0.2 4001
AT+CPIN=7256
OK
AT+CMGF=1
OK
AT+CMGS="+79101234567"
>test,test,testCTRL+Z
+CMGS 

где CTRL+Z — комбинация клавиш, нажатие которой означает конец сообщения.

С отправкой сообщения «Ахтунг!» на кириллице на номер +79101234567 все сильно сложнее, т.к. сообщение должно уходить пакетом в формате PDU в кодировке UCS2 (юникодная кодировка, поддерживающая в том числе кириллицу), а потому рассмотрим этот случай подробнее.

Пример:

telnet 10.100.0.2 4001
AT+CPIN=7256
OK
AT+CMGF=0
OK
AT+CMGS=28
>0011000B919701214365F70018C10E0410044504420443043D04330021CTRL+Z
+CMGS

Разберем поподробнее эту «кашу»:

AT+CMGF=0 - установка модема в PDU-режим
AT+CMGS=28 - длина строки пакета /2 -1
0011000B919701214365F70018C10E0410044504420443043D04330021 - сам PDU пакет

Формат PDU-пакета представляет собой 16-ричную последовательность, передающуюся человекочитаемой строкой (не ASCII-представления самих 16-ричных чисел). Оригинал описания (сохраненная копия) формата PDU пакета (на английском).

Перевод и коментарии:
00 Длина и номер SMS-центра провайдера. у нас — дефолтный из настроек GSM
11 Сообщение SMS-Submit (сохраненная копия)
0B Длина телефонного номера получателя (количество цифр в нем — в нашем случае 11)
91 Тип телефонного номера получателя (у нас получается «международный тип с планом нумерации Е.164/E.163) (сохраненная копия)
6 байт телефонный номер получателя (кодировка описана ниже)
00 Протокол (00 — SMS) (сохраненная копия)
18 Кодирование данных (08=UCS2,00-latin 7 bit etc. Старший байт — не сохранять в истории получателя) (сохраненная копия)
С1 Доставка актуальна 1 неделю (как рассчитывается) (сохраненная копия)
0E Длина сообщения («байт». длина символов кодированной UCS2-строки/2)
xx байт Кодированное сообщение (текст в UCS2, 16-ричное представление)

по-порядку подробней:

  • первый байт на некоторых телефонах передавать не следует (работа возможна только через SMS-центр провайдера, телефон другого не умеет)
  • номер получателя (алгоритм создавали наркаманы). кодируется «как есть» путем переставления местами соседних цифр, «добивается» до длины в 12 символов символами «F». например номер доблестной советской милиции (02 кто забыл) кодируется как 20FFFFFFFFFF, а номер из нашего примера (+79101234567) — как 9701214365F7. З.Ы. Не забывайте что длина SMS-сообщения ограничена, в кодировке UCS2 70-ю символами, на латинице — 160-ю символами.

Кодирование отправки SMS сообщений на PHP

<?

//Массив с параметрами GSM шлюза
$init=array('ip'=>"10.100.0.2",'port'=>'4001','pin'=>'7256'); 
// Отправка СМС :)
send_sms("Это тест","9101234567");
//Функция отсылки СМС
//$mess - сообщение
//$mob - номер мобильного в формате ХХХУУУУУУУ
//$debug - 1 - выводить отладочную инфу, 0 - нет
function send_sms($mess,$mob,$debug=0){
    global $init; 
    //Если сообщение и номер мобильника не пустые.
    //Проверку правильности формата мобильника возлагается на вас ;-) 
    if ($mess && $mob){
           $len=strlen($mess);
           $mob="7".$mob;
           $ooo="";
           if (preg_match('/^([x0Ax0Dx20-x7F]+)$/',$mess,$tmp)){
                if ($len<=160){
                      $len=0;
                      print "8-bit encoded SMS<br>";
                }else{
                      print "Длина сообщения в 8-битной кодировке [$len] больше 160 символов!<br>n";
                      return -1;
                }
           }else{
                if ($len<=70){
                     $mess=cp1251_2ucs2($mess);
                     $ret.="00";//it is only an indicator of the length of the SMSC information supplied (0)
                     $ret.="11"; //First octet of the SMS-SUBMIT message.
                     $ret.="00"; //TP-Message-Reference. The "00" value here lets the phone set the message reference number itself.
                     $ret.="0B"; // Address-Length. Length of phone number (11)
                     $ret.="91"; //Type-of-Address. (91 indicates international format of the phone number).
                     // Начало кодирования номера мобильного
                     if ((strlen($mob)/2)%2){
                           $mob.="F";
                     }
                     for ($i=0;$i<strlen($mob);$i+=2){
                              $ret.=$mob[$i+1].$mob[$i];
                     }
                     // Закончили взрывать мозг :)
                     $ret.="00"; //TP-PID. Protocol identifier
                     $ret.="18"; //TP-DCS. Data coding scheme. 18 - don't save at history, 08 - save
                     $ret.="C1"; //TP-Validity-Period. C1 means 1 week
                     $ret.=sprintf("%02X",strlen($mess)/2); //TP-User-Data-Length. Length of message.
                     $ret.=$mess; //TP-User-Data $ret.=chr(26); //end of TP-User-Data
                     $len=sprintf ("%s",(strlen($ret)-3)/2);
                     $mess=$ret;
                     print "16-bit encoded SMS<br>";
                }else{
                     print "Длина ссобщения в 16-битной кодировке [$len] больше 70 символов!<br>n";
                     return -1;
                }
           }
           // Создаем сокет
           $socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
           if (!$socket) {
                err($socket);
           }else{
                // Устанавливаем опцию таймаута в 5 секунд для сокета.
                // Проверка на удачную установку лежит на вас :)
                socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>5,"usec"=>0));
                // Устанавливаем соединение на сокет
                $result = @socket_connect($socket, $init['ip'], $init['port']);
                if (!$result) {
                     err($socket);
                } else {
                     // Инициализируем GSM шлюз
                     $out=sms_init($socket,$len,$debug);
                     if ($len){
                          // Сообщение на кириллице
                          $out.=raw($socket,"AT+CMGS=$len",">");
                     }else{
                          // Сообщение на латинице
                          $out.=raw($socket,sprintf("AT+CMGS="+%s"",$mob),">");
                          $mess.=chr(26);
                     }
                     $out.=raw($socket,$mess,"CMGS",$debug);
                     if ($debug){
                          printf ("<pre>[ %s ]</pre>",$out);
                     }
                }
                @socket_close($socket);
           }
     }
     return $out;
} 
// Функция начальной инициализации модема
// $socket - ресурс сокета
// $type - 0 - сообщение на латинице, 1 - на кириллице
// $debug - 1 - выводить отладочную инфу, 0 - нет
function sms_init($socket,$type,$debug=0){
    global $init;
    $out=raw($socket,"AT","OK",$debug);
    $out.=raw($socket,sprintf("AT+CPIN=%s",$init['pin']),'(ERROR)|(OK)',$debug);
    $out.=raw($socket,sprintf("AT+CMGF=%d",$type?0:1),"OK$",$debug);
    if ($debug){
         print "<pre><font color="green">$out</font></pre><br>";
    }
    return $out;
}

// Функция посылки комманды на GSM шлюз
// $socket - ресурс сокета
// $write - команда, передаваемая GSM шлюзу
// $delim - последовательность, означающая окончание чтения ответа с GSM шлюза
// $debug - 1 - выводить отладочную инфу, 0 - нет
function raw($socket,$write,$delim,$debug=0){
    $ooo='';
    $write.="\r\n";
    if (@socket_write($socket,$write,strlen($write))===false){
        err($socket);
    }else{
        while ($out = @socket_read($socket, 2, PHP_NORMAL_READ)) {
           if ($out===false){
               err($socket);
           }else{
               if ($debug){
                   print $out;
                   flush();
               }
               $ooo=sprintf("%s%s",$ooo,$out);
           }
           if (preg_match("/".$delim."/i",$ooo,$tmp)){
               if ($debug){
                   print_r($tmp);
                   flush();
               }
               break;
           }
        }
     }
     usleep(100000);
     return $ooo;
} 
// Функция вывода ошибки при работе с сокетом
// $soc - ресурс сокета
function err($soc){
    printf ("<script>alert ('Ошибка: %s');</script><font color=red><b>%s: [%s]</b></font><br>",
    socket_strerror(socket_last_error($soc)),"Ошибка",socket_strerror(socket_last_error($soc)));
} 
// Функция кодирования кириллицы из CP1251 в UCS2
// $str - строка для перекодирования
function cp1251_2ucs2($str){
    for ($i=0;$i<strlen($str);$i++){
        if (ord($str[$i]) < 127){
            $results = sprintf("%04X",ord($str[$i]));
        }elseif (ord($str[$i])==184){ //ё
            $results="0451";
        }elseif (ord($str[$i])==168){ //Ё
            $results="0401";
        }else{
            $results = sprintf("%04X",(ord($str[$i])-192+1040));
        }
        $ucs2 .= $results;
    }
    return $ucs2;
}
// Функция вывода отладочной инфы
function debug($array){
    ob_start("get_vars");
    print_r($array);
    ob_end_flush();
} 
// Функция output_callback для функции debug()
function get_vars($buffer){
    return sprintf ("<div style="padding: 3px; border: 2px #88bbbb solid; color: #00dd00; background-color: #bbffbb; font-weight: bold; text-align: left;"><pre>%s</pre></div>",
    htmlspecialchars($buffer));
}

?>

Декодирование принятых SMS сообщений на PHP

 Отлично, с отсылкой СМС разобрались, осталось чтение сообщений (как обычно, с 8-битной кодировкой проблем нет, есть только с нашей кириллицей).

Команды для чтения SMS с GSM модемов:

at+cmgf=1 — выводить сообщения в неупакованном (читабельном) виде
at+cmgl=»all» — вывести сообщения
at+cmgr=n — прочитать отдельное сообщение
at+cmgd=n — удалить сообщение с SIM-карты
Сам прием СМС сообщений с GSM шлюза не сильно отличается от передачи (на основе вышеприведенной отправки предлагается вам самостоятельно реализовать это. Опишу только функцию для преобразования сообщения с «тарабарского» на русский:
<?
function ucs2_2cp1251($str){
    for ($i=0;$i<strlen($str);$i+=4){
        $char=hexdec($str[$i].$str[$i+1].$str[$i+2].$str[$i+3]);
        if ($char>126){
            if ($char==1105){
                $char=184; //ё
            }elseif($char==1025){
                $char=168; //Ё
            }elseif ($char>=848){
                $char-=848;
            }
        }elseif(!$char){
            $char=32;
        }
        $ret.=chr($char);
    }
    return $ret;
}
?>
Источники:
1. О виджетах и гаджетах
2. SMS and PDU format
3. IXBT.ru
4. Связывание мобильника и FreeBSD через bluetooth (c п.1 по п.6 включительно)

Ссылки:
З.Ы. Этот материал можно использовать и при отсылке СМС через обычный мобильник. Разница в том,
что вместо сетевого сокета нужно использовать устройство FreeBSD /dev/ttyU0 (при подключении через USB
кабель) либо /dev/ttypf (выполнив перед этим команду rfcomm_sppd -a MAC_адрес_телефона -t /dev/ttypf &).
О связывании мобильника и FreeBSD через bluetooth смотри выше "Источники".

З.З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Автор: Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 10, среднее: 4,60 из 5)
Загрузка...
Отправить на почту Отправить на почту

В виду участившихся вопросов по работе PPPoE, для правильного понимания обсуждаемого вопроса необходимо разобраться с основными понятиями изучаемого явления.

PPPoE (Point-to-point protocol over Ethernet) — сетевой протокол передачи кадров PPP через Ethernet. Предоставляет дополнительные возможности (аутентификация, сжатие, шифрование).

PPPoE — это туннелирующий протокол (tunneling protocol), который позволяет настраивать (или инкапсулировать) IP, или другие протоколы, которые наслаиваются на PPP, через соединения Ethernet, но с программными возможностями PPP соединений, и поэтому используется для виртуальных «звонков» на соседнюю Ethernet-машину и устанавливает соединение точка-точка, которое используется для транспортировки IP-пакетов, работающее с возможностями PPP.

PPPoE – это метод передачи PPP поверх Ethernet. Пакеты PPP инкапсулируются (включаются) в Ethernet фреймы.

Действующими лицами являются с одной стороны Access Concentrator (AC) – это сервер доступа, а с другой клиент PPPoE. Клиент и сервер должны быть соединены с использованием любых Ethernet устройств (повторители, коммутаторы).

Для именования сервера доступа используется Access Concentrator Name. В свою очередь, Access Concentrator может предоставлять некоторое количество PPPoE сервисов, называемых Service Name.

Парадигма PPPoE включает две стадии: Discovery stage и PPP Session stage.

Клиент, желающий установить PPPoE соединение, сначала должен пройти Discovery stage. При этом между ним и сервером передаются Ethernet фреймы с Ether_type=0x8863.

Наблюдать можно следующим образом:

tcpdump –n –e -i fxp0 ether proto 0x8863

В свою очередь, Discovery stage подразделяется на: initiation, offer, request, and session confirmation.

Сначала клиент должен инициировать PPPoE сессию (initiation). Для этого он посылает специальный пакет Active Discovery Initiation (PADI). Данный пакет посылается на broadcast Ethernet адрес (ff:ff:ff:ff:ff:ff), что логично, так как клиент пока не знает адреса сервера доступа. Опционно пакет может содержать запрашиваемый клиентом Service Name (и только, хотя многие считают, что здесь может быть и Access Concentrator Name).

Пример PADI-пакета:

Frame 1 (44 bytes on wire, 44 bytes captured)
Ethernet II, Src: 00:50:da:42:d7:df, Dst: ff:ff:ff:ff:ff:ff
PPP-over-Ethernet Discovery
  Version: 1
  Type 1
  Code Active Discovery Initiation (PADI)
  Session ID: 0000
  Payload Length: 24
PPPoE Tags
  Tag: Service-Name
  Tag: Host-Uniq
    Binary Data: (16 bytes)

Src. (=source) представляет MAC-адрес машины, пославшей PADI.
Dst. (=destination) является широковещательным Ethernet-адресом.
PADI-пакет может быть получен более чем одним AC.

Сервер доступа отвечает пакетом Active Discovery Offer (PADO), в который включает свое название Access Concentrator Name и название предоставляемого сервиса Service Name. Данный пакет уже юникастовый и содержит мак адрес конкретного сервера.

Вот пример PADO-пакета:

Frame 2 (60 bytes on wire, 60 bytes captured)
Ethernet II, Src: 00:0e:40:7b:f3:8a, Dst: 00:50:da:42:d7:df
PPP-over-Ethernet Discovery
  Version: 1
  Type 1
  Code Active Discovery Offer (PADO)
  Session ID: 0000 Payload Length: 36
PPPoE Tags
  Tag: Service-Name
  Tag: AC-Name
    String Data: IpzbrOOl
  Tag: Host-Uniq
    Binary Data: (16 bytes)

AC-Name — String Data представляет строковое AC имя, в данном случае «Ipzbr001»
Src. представляет MAC-адрес AC.

Теперь клиент может выбрать нужное (Service Name и Access Concentrator Name) из возможно нескольких предложений (PADO пакетов) и ответить уже конкретному серверу пакетом Active Discovery Request (PADR).

Согласный на предоставление связи сервер посылает клиенту Active Discovery Session-confirmation (PADS) пакет, включающий уникальный идентификатор сессии (SID), необходимый для дальнейшего взаимодействия. На этом Discovery stage заканчивается и начинается PPP session stage.

PPP session stage начинается с использованием уже обозначенного идентификатора (SID) и Service Name и включает стандартные PPP процедуры: link control, network layer control, authentication. При этом согласуются различные параметры связи и, самое главное, происходит аутентификация.

На данном этапе (и далее, вплоть до отключения) между клиентом и сервером передаются Ethernet фреймы с Ether_type=0x8864.

Наблюдать можно следующим образом:

tcpdump –n –e -i fxp0 ether proto 0x8864

В итоге устанавливается PPPoE соединение и передаются данные.

Для окончания соединения PPPoE клиент (или сервер, что реже) посылает пакет Active Discovery Terminate (PADT).

Типичный обмен пакетами между участниками PPPoE выглядит так (mac сервера s:s:s:s:s:s, mac клиента c:c:c:c:c:c):

подключение клиента:

c:c:c:c:c:c ff:ff:ff:ff:ff:ff 8863 60: PPPoE PADI [Host-Uniq UTF8]
s:s:s:s:s:s c:c:c:c:c:c 8863 49: PPPoE PADO [AC-Name «Provider»] [Service-Name] [Host-Uniq UTF8] [AC-Cookie UTF8]

c:c:c:c:c:c s:s:s:s:s:s 8863 60: PPPoE PADR [Host-Uniq UTF8] [AC-Cookie UTF8] [AC-Name » Provider «]

s:s:s:s:s:s c:c:c:c:c:c 8863 49: PPPoE PADS [ses 0x15] [AC-Name » Provider «] [Service-Name] [Host-Uniq UTF8] [AC-Cookie UTF8]

обмен данными

отключение клиента

c:c:c:c:c:c s:s:s:s:s:s 8863 60: PPPoE PADT [ses 0x1a]

Более подробное описание PPPoE содержится в RFC 2516

Ссылки:

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 4,75 из 5)
Загрузка...
Отправить на почту Отправить на почту

Может возникнуть ситуация когда пропускной способности одного гигабитного интерфейса не достаточно.

Решить эту проблему может ещё один интерфейс и агрегирование их в один логический.

В нашем примере мы используем гигабитные интерфейсы.

Juniper

Войдем в режим конфигурации:

root@juniper> configure

перейдем в раздел chassis

[edit]
root@juniper#
edit chassis

теперь необходимо задать количество агрегированных интерфейсов:

[edit chassis]
root@juniper#
set aggregated-devices ethernet device-count 1

Теперь нам нужно выбрать и настроить наши гигабитные интерфейсы:

[edit chassis]
root@juniper#
top

[edit]
root@juniper#
edit interfaces

[edit interfaces]
root@juniper#
set ge-0/1/0 gigether-options 802.3ad ae0

[edit interfaces]
root@juniper#
set ge-1/3/0 gigether-options 802.3ad ae0

теперь можно приступать к настройке агрегированного интерфейса, он имеет имя ae0 и с ним можно делать все тоже самое, что и с обычным интерфейсом, например поднимать вланы:

[edit interfaces]
root@juniper#
set ae0 vlan-tagging

[edit interfaces]
root@juniper#
set ae0 unit 11 vlan-id 11 family inet address 192.168.1.1/24 preferred

Посмотрим итог:

chassis {
     aggregated-devices {
           ethernet {
                device-count 1;
           }
     }
}
interfaces {
    ge-0/1/0 {
          gigether-options {
              802.3ad ae0;
          }
    }
    ge-1/3/0 {
          gigether-options {
              802.3ad ae0;
          }
    }
    ae0 {
          vlan-tagging;
          unit 11 {
                 vlan-id 11;
                family inet {
                       address 192.168.1.1/24 {
                            preferred;
                      }
                }
          }
    }
}

Cisco

Приступим к настройке Cisco Catalyst 3560G


Switch> enable
Switch# configure terminal
Switch(config)# interface GigabitEthernet0/1
Switch(config-if)# channel-group 1 mode on
Switch(config-if)# switchport trunk encapsulation dot1q
Switch(config-if)# switchport trunk allowed vlan 11
Switch(config-if)# switchport mode trunk
Switch(config-if)# interface GigabitEthernet0/2
Switch(config-if)# channel-group 1 mode on
Switch(config-if)# switchport trunk encapsulation dot1q
Switch(config-if)# switchport trunk allowed vlan 11
Switch(config-if)# switchport mode trunk
Switch(config-if)# interface Port-channel1
Switch(config-if)# switchport trunk encapsulation dot1q
Switch(config-if)# switchport trunk allowed vlan 11
Switch(config-if)# switchport mode trunk
Switch(config-if)# exit
Switch(config)# port-channel load-balance src-ip


Примечание:
При отладке канала EtherChannel, который не формируется по какой-либо причине, следует помнить, что все порты в группе должны иметь одинаковые атрибуты. Например, у всех портов должна быть одинаковая скорость, дуплексность, VLAN-сеть (или собственная VLAN-сеть для магистрального канала), магистральный режим и инкапсуляция, допустимый VLAN-диапазон и другие параметры.
Полезные команды show:


show etherchannel [channel-group]
<1-48> Channel group number
detail Detail information
load-balance Load-balance/frame-distribution scheme among ports in port-channel
port Port information
port-channel Port-channel information
protocol protocol enabled
summary One-line summary per channel-group

show pagp [group-number]
<1-48> Channel group number
counters Traffic information
internal Internal information
neighbor Neighbor information


Посмотрим итог:

port-channel load-balance src-ip
!
interface Port-channel1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 11
 switchport mode trunk
!
interface GigabitEthernet0/1
switchport trunk encapsulation dot1q
switchport trunk allowed vlan 11
switchport mode trunk
channel-group 1 mode on
!
interface GigabitEthernet0/2
switchport trunk encapsulation dot1q
switchport trunk allowed vlan 11
switchport mode trunk
channel-group 1 mode on
!

Таким образом мы объединили (агрегировали) по два порта на каждом устройстве (получили 2-х гигабитный интерфейс) и сделали между ними trunk в котором «ходит» vlan 11.

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Многие новички в сетях и FreeBSD сталкиваются с вопросом:

«Как соединить две сети если сервер на FreeBSD имеет физическое подключение к обеим сетям ?»

Схема сети

Схема сети

Иными словами сервер FreeBSD должен выступать в роли router (маршрутизатор).

Итак, что мы имеем:

  • Ethernet сеть
  • Две подсети класса «С» (/24 — маска 255.255.255.0)
  • Сервер FreeBSD с двумя сетевыми картами
  • Клиенты в обеих подсетях

Наша задача, чтобы клиенты из подсети 192.168.1.0/24 могли обмениваться трафиком с клиентами из подсети 192.168.0.0/24.

Сначала настроим сервер FreeBSD и заставим его передавать (маршрутизировать) пакеты из одной подсети в другую.

За это отвечает параметр net.inet.ip.forwarding, посмотрим в какое значение он имеет:

[root@freebsd ~]# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 0

На данный момент его значение «0», а это значит, что сервер FreeBSD не будет выполнять маршрутизации.

Включим эту функцию:

[root@freebsd ~]# sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1

Так мы изменили значение с «0» на «1». Теперь нужно сделать, так чтобы после ребута это значение всегда было 1-цой. Это можно сделать 2-мя способами:

  1. в файл /etc/rc.conf добавить строчку: gateway_enable=»YES»
  2. в файл /etc/sysctl.conf добавить строчку: net.inet.ip.forwarding=1

На сервере у нас есть две сетевые карты и соответственно два интерфейса: em0 и em1.

Пусть em0 «смотрит» в сеть слева, а em1 в сеть справа. Назначим IP-адреса для интерфейсов FreeBSD сервера:

[root@freebsd ~]# ifconfig em0 add 192.168.1.1/24
[root@freebsd ~]# ifconfig em1 add 192.168.0.1/24


Примечание:

Если на команду ifconfig вы получаете ответ:
command not found
воспользуйтесь командой

[root@virus ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz /usr/src/sbin/ifconfig
которая укажет где именно располагается утилита ifconfig
как видно из результата выполнения команды whereis утилита ifconfig находится /sbin/ifconfig
вводите полный путь до утилиты ifconfig, тогда надпись command not found появляться не будет и команда будет выполняться


Посмотрим что получилось:

[root@freebsd ~]# ifconfig -a

em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
           ether 00:02:a5:4e:92:48
           inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
           media: Ethernet autoselect (100baseTX <full-duplex>)
           status: active
em1: flags=8802<UP,BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
           ether 00:02:a5:4e:92:49
           inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
           media: Ethernet autoselect (100baseTX <full-duplex>)
           status: active

Рассмотрим что все это значит :

em0 и em1 — имена сетевых интерфейсов
флаг UP — означает что сетевая карта включена, если этого флага не будет, то пакеты не будут приниматься на этом интерфейсе (для включения воспользуйтесь командой: ifconfig ИМЯ_ИНТЕРФЕЙСА up)
ether — это mac-адрес этой сетевой карты
inet — назначенный IP-адрес для этого интерфейса и broadcast адрес для этой подсети
media — информация о скорости и дуплексе интерфейса
status — текущий статус интерфейса. Если status: no carrier, то это означает, что на сетевой карте нет линка.

Сохраним настройки, чтобы IP-адреса назначались интерфейсам после ребута сервера, для этого необходимо добавить в файл /etc/rc.conf следующие строчки:

ifconfig_em0=»inet 192.168.1.1 netmask 255.255.255.0″
ifconfig_em1=»inet 192.168.0.1 netmask 255.255.255.0″

Если на сервере вы используете firewall, например ipfw, то добавим правила разрешающие проход пакетов из одной сети в другую:

ipfw add 100 allow ip from 192.168.1.1/24 to 192.168.0.1/24
ipfw add 110 allow ip from 192.168.1.0/24 to 192.168.1.1/24

Теперь настройте клиентские компьютеры:

  • Выставить IP-адрес из нужной подсети: 192.168.1.ХХХ или 192.168.0.ХХХ
  • Выставить маску подсети 255.255.255.0
  • Выставить шлюз по умолчанию: для подсети 192.168.1.ХХХ это 192.168.1.1, а для подсети 192.168.0.ХХХ это 192.168.0.1 (именно эти IP-адреса на интерфейсах нашего FreeBSD сервера)

Наступило время проверить есть ли связь сервера и клиентов. Для этого возьмем заведомо рабочий клиентский компьютер из 2-х сетей, например это будут компьютеры с IP-адресами:

  • 192.168.1.11
  • 192.168.0.15

Воспользуемся утилитой ping на сервере:

[root@freebsd ~]# ping 192.168.1.11

Если результат будет таким:

PING 192.168.1.11 (192.168.1.11): 56 data bytes
64 bytes from 192.168.1.11: icmp_seq=0 ttl=64 time=0.466 ms
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.238 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.272 ms
^C
— 192.168.1.11 ping statistics —
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.238/0.325/0.466/0.100 ms

Значит все хорошо и связь между сервером и клиентом есть. Проделайте тоже самое с 192.168.0.15.

Если результат ping отрицательный, то убедитесь что на клиентском компьютере правильно выставлен IP-адрес и маска подсети, а так же наличие линка на сетевой карте.

Теперь можно попробовать проверить связь между клиентскими компьютерами из разных подсетей.

Так же воспользуемся утилитой ping, но уже на компьютере с IP-адресом 192.168.1.11:

ping 192.168.0.15

Если ответ есть, то и свзяь между компьютерами из разных подсетей есть.

Если ответа нет, то воспользуемся утилитой tracert (для Windows) или traceroute (для FreeBSD):

tracert 192.168.0.15

Если сразу «идут звездочки»:

1 * * *

То проверьте правильность выставление шлюза по умолчанию.

Если трасса выглядит так:

1 192.168.1.1 (192.168.1.1) 0.421 ms 0.447 ms 0.485 ms
2 * * *

То пакет доходит до сервера, убедитесь что firewall сервера не блокирует пакеты и что клиентский компьютер с IP-адресом 192.168.0.15 правильно настроен и «видит» сервер (проверьте IP-адрес, маску подсети, шлюз по умолчанию и наличие ping до сервера)

Вы все проверили, но по прежнему ничего не работает ? Воспользуемся утилитой tcpdump на сервере, которая покажет пакеты проходящие через интерфейсы сервера:

[root@freebsd ~]# tcpdump -ni em0
и
[root@freebsd ~]# tcpdump -ni em1

Запустите пинг с одного клиентского компьютера из одной подсети на другой клиентский компьютер в другой подсети (как мы делали в примерах выше) и смотрите в вывод команды tcpdump на сервере, который будет примерно таким:

[root@freebsd ~]# tcpdump -ni em0

12:17:23.398376 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 49222, seq 0, length 64
12:17:24.399906 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 49222, seq 1, length 64

Т.е. компьютер 192.168.1.11 посылает пакет ICMP echo request до компьютера 192.168.0.15, но ответов мы не видим. Посмотри передает ли сервер эти пакеты на другую сетевую карту:

[root@freebsd ~]# tcpdump -ni em1

12:21:18.167017 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 50246, seq 4, length 64
12:21:19.168022 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 50246, seq 5, length 64

Видим, что запросы передаются на другой интерфейс сервера, но ответов по прежнему нет. Проверьте настройки компьютера 192.168.0.15 и отсутствие у него проблем с физическим подключением к сети.

Когда все работает вывод будет таким:

12:21:17.165998 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 50246, seq 3, length 64
12:21:17.171199 IP 192.168.0.15 > 192.168.1.11: ICMP echo reply, id 50246, seq 3, length 64
12:21:18.167017 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 50246, seq 4, length 64
12:21:18.171353 IP 192.168.0.15 > 192.168.1.11: ICMP echo reply, id 50246, seq 4, length 64

Мы видим стандартый вывод «запрос-ответ», когда на пакет ICMP echo request приходит ответ в виде пакета ICMP echo reply

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 7, среднее: 4,43 из 5)
Загрузка...
Отправить на почту Отправить на почту

У Вас может возникнуть необходимость поднять vlan и trunk на оборудовании Juniper, например маршутизаторы:

Juniper серии M7i, M10i или серия MX

Как это сделать ?

Первое что мы делаем это переходим в режим конфигурации:

configure

Как вы наверняка заметили, что конфиг Juniper похож на конфиг DNS серверов и состоит из секций.

Перейдем в секцию конфигурации интерфейсов:

edit interfaces

Дадим команду show чтобы посмотреть какие интерфейсы у нас есть:

show

ge-0/0/0 {

}
fxp0 {
      unit 0 {
      }
}
lo0 {
     unit 0 {
         family inet {
             address 127.0.0.1/32;
        }
     }
}

ge-0/0/0 — это наш гигабитный интерфейс на котором мы и будем поднимать vlan
fxp0 — это managment интерфейс (встроенный)
lo0 — это соответственно Loopback интерфейс

Приступим собственно к настройке, возьмем для примера создание 2-х vlan — 5 и 10 на гигабитном интерфейсе ge-0/0/0.

Для того чтобы поднять на интерфейсе ge-0/0/0 vlan`ы нам нужно в «корне» этого интерфейса выставить vlan-tagging, т.е. указать что этот интерфейс будет trunk`ом и будет принимать vlan`ы:

[edit interfaces]
root@juniper#
set ge-0/0/0 vlan-tagging

Следующий шаг это создание sub interface (саб-интерфейсов):

[edit interfaces]
root@juniper#
set ge-0/0/0 unit 5

Тем самым мы создали саб-интерфейс под номером 5-ть. Номера саб-интерфейсов никак не привязаны к номеру vlan. Вы можете задавать любые значения, я (мне так удобней) делаю саб-интерфейсы с номерами vlan, некоторые делаю саб-интерфейсы давая номера по порядку. Тут дело за вами.

Теперь зададим созданному саб-интерфейсу номер vlan:

[edit interfaces]
root@juniper#
set ge-0/0/0 unit 5 vlan-id 5

Выставим ему описание:

[edit interfaces]
root@juniper#
set ge-0/0/0 unit 5 description «My 5 vlan»

Укажем его IP-адрес:

[edit interfaces]
root@juniper#
set ge-0/0/0 unit 5 family inet address 192.168.1.1/24

Посмотрим что у нас получилось:

show

ge-0/0/0 {
   vlan-tagging;
   unit 5 {
       description "My 5 vlan";
       vlan-id 5;
       family inet {
            address 192.168.1.1/24;
       }
}

Теперь по аналогии создадим vlan 10, но немного упростим себе жизнь дабы вводить команду поменьше.

Для этого перейдем в конфигурации чуть глубже, непосредственно в секцию интерфейса ge-0/0/0:

[edit interfaces]
root@juniper#
edit ge-0/0/0

[edit interfaces ge-0/0/0]
root@juniper#

Тем самым нам уже не будет требоваться вводить имя интерфейса при каждой команде, а так же мы введем все сразу одной строкой:

[edit interfaces ge-0/0/0]
root@juniper#
set unit 10 vlan-id 10 description «My 10 vlan» family inet address 192.168.2.1/24

Так мы сразу выполнили все четыре пункта:

  1. создали саб-интерфейс
  2. задали номер влана
  3. задали описание
  4. назначили IP-адрес

Посмотрим что же у нас получилось:

show

ge-0/0/0 {
   vlan-tagging;
   unit 5 {
       description "My 5 vlan";
       vlan-id 5;
       family inet {
            address 192.168.1.1/24;
       }
   unit 10 {
       description "My 10 vlan";
       vlan-id 10;
       family inet {
            address 192.168.2.1/24;
       }
}

Вот и все, теперь интерфейс ge-0/0/0 принимает vlan 5 и 10 и вы можете «подавать» в этот интерфейс trunk в котором прописать эти vlan`ы.

Осталось проверить все ли правильно и не ошиблись ли вы:

[edit interfaces ge-0/0/0]
root@juniper#
commit check

Если в ответ появится configuration check succeeds то все ОК, конфигурация верна. Осталось её закомитить:

[edit interfaces ge-0/0/0]
root@juniper#
commit comment «Set up two sub interfaces on ge-0/0/0»

Конфигурация применится на Juniper и сохранится с указанным комментарием.


Заметка:
Juniper сохраняет до 50-ти конфигураций которые вы commit`ите. Посмотреть можно их список:
root@juniper> show system commit

Если вы находитесь в режиме конфигурирования, то нужно добавлять слово «run»:
[edit]
root@juniper#
run show system commit


Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 9, среднее: 4,44 из 5)
Загрузка...
Отправить на почту Отправить на почту