ืจืฉืช IPeE ื—ืกื™ื ืช ืชืงืœื•ืช ื‘ืืžืฆืขื•ืช ื›ืœื™ื ืžืื•ืœืชืจื™ื

ืฉืœื•ื. ื–ื” ืื•ืžืจ ืฉื™ืฉ ืจืฉืช ืฉืœ 5k ืœืงื•ื—ื•ืช. ืœืื—ืจื•ื ื” ืงืจื” ืจื’ืข ืœื ื ืขื™ื ื‘ืžื™ื•ื—ื“ - ื‘ืžืจื›ื– ื”ืจืฉืช ื™ืฉ ืœื ื• Brocade RX8 ื•ื”ื•ื ื”ืชื—ื™ืœ ืœืฉืœื•ื— ื”ืจื‘ื” ื—ื‘ื™ืœื•ืช unicast ืœื ื™ื“ื•ืขื•ืช, ืžื›ื™ื•ื•ืŸ ืฉื”ืจืฉืช ืžื—ื•ืœืงืช ืœ-vlans - ื–ื• ื—ืœืงื™ืช ืœื ื‘ืขื™ื”, ืื‘ืœ ื™ืฉ vlans ืžื™ื•ื—ื“ื™ื ืขื‘ื•ืจ ื›ืชื•ื‘ื•ืช ืœื‘ื ื•ืช ื•ื›ื•'. ื•ื”ื ืžืชื•ื—ื™ื ืœื›ืœ ื”ื›ื™ื•ื•ื ื™ื ืฉืœ ื”ืจืฉืช. ืื– ืขื›ืฉื™ื• ื“ืžื™ื™ื ื• ื–ืจื™ืžื” ื ื›ื ืกืช ืœื›ืชื•ื‘ืช ืฉืœ ืœืงื•ื— ืฉืœื ืœื•ืžื“ ื›ืชืœืžื™ื“ ืžื’"ื‘ ื•ื”ื–ืจื™ืžื” ื”ื–ื• ืขืคื” ืœืขื‘ืจ ืงื™ืฉื•ืจ ืจื“ื™ื• ืœื›ืคืจ ื›ืœืฉื”ื• (ืื• ื›ื•ืœื•) - ื”ืขืจื•ืฅ ืกืชื•ื - ื”ืœืงื•ื—ื•ืช ื›ื•ืขืกื™ื - ืขืฆื‘...

ื”ืžื˜ืจื” ื”ื™ื ืœื”ืคื•ืš ื‘ืื’ ืœืคื™ืฆ'ืจ. ื—ืฉื‘ืชื™ ื‘ื›ื™ื•ื•ืŸ ืฉืœ q-in-q ืขื vlan ืœืงื•ื— ืžืœื, ืื‘ืœ ื›ืœ ืžื™ื ื™ ื—ื•ืžืจื” ื›ืžื• P3310, ื›ืืฉืจ dot1q ืžื•ืคืขืœ, ืžืคืกื™ืงื” ืœืขื‘ื•ืจ DHCP, ื”ื ื’ื ืœื ื™ื•ื“ืขื™ื ืื™ืš ืœืขืฉื•ืช qinq ืกืœืงื˜ื™ื‘ื™ ื•ืžืœื›ื•ื“ื•ืช ืจื‘ื•ืช ืฉืœ ืžื”ืกื•ื’ ื”ื–ื”. ืžื” ื–ื” ip ืœืœื ืžืกืคืจ ื•ืื™ืš ื–ื” ืขื•ื‘ื“? ื‘ืงืฆืจื” ืžืื•ื“: ื›ืชื•ื‘ืช ืฉืขืจ + ืžืกืœื•ืœ ื‘ืžืžืฉืง. ืขื‘ื•ืจ ื”ืžืฉื™ืžื” ืฉืœื ื•, ืื ื—ื ื• ืฆืจื™ื›ื™ื: ืœื—ืชื•ืš ืืช ื”ืžืขืฆื‘, ืœื”ืคื™ืฅ ื›ืชื•ื‘ื•ืช ืœืœืงื•ื—ื•ืช, ืœื”ื•ืกื™ืฃ ืžืกืœื•ืœื™ื ืœืœืงื•ื—ื•ืช ื“ืจืš ืžืžืฉืงื™ื ืžืกื•ื™ืžื™ื. ืื™ืš ืœืขืฉื•ืช ืืช ื›ืœ ื–ื”? Shaper - lisg, dhcp - db2dhcp ื‘ืฉื ื™ ืฉืจืชื™ื ืขืฆืžืื™ื™ื, dhcprelay ืคื•ืขืœ ืขืœ ืฉืจืชื™ ื”ื’ื™ืฉื”, ucarp ืคื•ืขืœ ื’ื ืขืœ ืฉืจืชื™ ื”ื’ื™ืฉื” - ืœื’ื™ื‘ื•ื™. ืื‘ืœ ืื™ืš ืžื•ืกื™ืคื™ื ืžืกืœื•ืœื™ื? ืืคืฉืจ ืœื”ื•ืกื™ืฃ ื”ื›ืœ ืžืจืืฉ ืขื ืกืงืจื™ืคื˜ ื’ื“ื•ืœ - ืื‘ืœ ื–ื” ืœื ื ื›ื•ืŸ. ืื– ื ืขืฉื” ืงื‘ ื‘ื›ืชื‘ ืขืฆืžื™.

ืœืื—ืจ ื—ื™ืคื•ืฉ ืžืขืžื™ืง ื‘ืื™ื ื˜ืจื ื˜, ืžืฆืืชื™ ืกืคืจื™ื™ื” ื ืคืœืื” ื‘ืจืžื” ื’ื‘ื•ื”ื” ืขื‘ื•ืจ C++, ื”ืžืืคืฉืจืช ืœืš ืœื”ืจื™ื— ื™ืคื” ืชืขื‘ื•ืจื”. ื”ืืœื’ื•ืจื™ืชื ืฉืœ ื”ืชื•ื›ื ื™ืช ืฉืžื•ืกื™ืคื” ืžืกืœื•ืœื™ื ื”ื•ื ื›ื“ืœืงืžืŸ - ืื ื• ืžืื–ื™ื ื™ื ืœื‘ืงืฉื•ืช arp ื‘ืžืžืฉืง, ืื ื™ืฉ ืœื ื• ื›ืชื•ื‘ืช ื‘ืžืžืฉืง lo ื‘ืฉืจืช ื”ืžื‘ื•ืงืฉ, ืื– ื ื•ืกื™ืฃ ืžืกืœื•ืœ ื“ืจืš ื”ืžืžืฉืง ื”ื–ื” ื•ื ื•ืกื™ืฃ arp ืกื˜ื˜ื™ ืœื”ืงืœื™ื˜ ืœ-IP ื”ื–ื” - ื‘ืื•ืคืŸ ื›ืœืœื™, ื›ืžื” ื”ืขืชืง-ื”ื“ื‘ืงื™ื, ืงืฆืช ืฉื ืชื•ืืจ ื•ืกื™ื™ืžืช

ืžืงื•ืจื•ืช ื”'ื ืชื‘'

#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>

#include <tins/tins.h>
#include <map>
#include <iostream>
#include <functional>
#include <sstream>

using std::cout;
using std::endl;
using std::map;
using std::bind;
using std::string;
using std::stringstream;

using namespace Tins;

class arp_monitor {
public:
    void run(Sniffer &sniffer);
    void reroute();
    void makegws();
    string iface;
    map <string, string> gws;
private:
    bool callback(const PDU &pdu);
    map <string, string> route_map;
    map <string, string> mac_map;
    map <IPv4Address, HWAddress<6>> addresses;
};

void  arp_monitor::makegws() {
    struct ifaddrs *ifAddrStruct = NULL;
    struct ifaddrs *ifa = NULL;
    void *tmpAddrPtr = NULL;
    gws.clear();
    getifaddrs(&ifAddrStruct);
    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (!ifa->ifa_addr) {
            continue;
        }
        string ifName = ifa->ifa_name;
        if (ifName == "lo") {
            char addressBuffer[INET_ADDRSTRLEN];
            if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
                // is a valid IP4 Address
                tmpAddrPtr = &((struct sockaddr_in *) ifa->ifa_addr)->sin_addr;
                inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6
                // is a valid IP6 Address
                tmpAddrPtr = &((struct sockaddr_in6 *) ifa->ifa_addr)->sin6_addr;
                inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            } else {
                continue;
            }
            gws[addressBuffer] = addressBuffer;
            cout << "GW " << addressBuffer << " is added" << endl;
        }
    }
    if (ifAddrStruct != NULL) freeifaddrs(ifAddrStruct);
}

void arp_monitor::run(Sniffer &sniffer) {
    cout << "RUNNED" << endl;
    sniffer.sniff_loop(
            bind(
                    &arp_monitor::callback,
                    this,
                    std::placeholders::_1
            )
    );
}

void arp_monitor::reroute() {
    cout << "REROUTING" << endl;
    map<string, string>::iterator it;
    for ( it = route_map.begin(); it != route_map.end(); it++ ) {
        if (this->gws.count(it->second) && !this->gws.count(it->second)) {
            string cmd = "ip route replace ";
            cmd += it->first;
            cmd += " dev " + this->iface;
            cmd += " src " + it->second;
            cmd += " proto static";
            cout << cmd << std::endl;
            cout << "REROUTE " << it->first << " SRC " << it->second << endl;
            system(cmd.c_str());
            cmd = "arp -s ";
            cmd += it->first;
            cmd += " ";
            cmd += mac_map[it->first];
            cout << cmd << endl;
            system(cmd.c_str());

        }
    }
    for ( it = gws.begin(); it != gws.end(); it++ ) {
	string cmd = "arping -U -s ";
	cmd += it->first;
	cmd += " -I ";
	cmd += this->iface;
	cmd += " -b -c 1 ";
	cmd += it->first;
        system(cmd.c_str());
    }
    cout << "REROUTED" << endl;
}

bool arp_monitor::callback(const PDU &pdu) {
    // Retrieve the ARP layer
    const ARP &arp = pdu.rfind_pdu<ARP>();

    if (arp.opcode() == ARP::REQUEST) {
	
        string target = arp.target_ip_addr().to_string();
        string sender = arp.sender_ip_addr().to_string();
        this->route_map[sender] = target;
        this->mac_map[sender] = arp.sender_hw_addr().to_string();
        cout << "save sender " << sender << ":" << this->mac_map[sender] << " want taregt " << target << endl;
        if (this->gws.count(target) && !this->gws.count(sender)) {
            string cmd = "ip route replace ";
            cmd += sender;
            cmd += " dev " + this->iface;
            cmd += " src " + target;
            cmd += " proto static";
//            cout << cmd << std::endl;
/*            cout << "ARP REQUEST FROM " << arp.sender_ip_addr()
                 << " for address " << arp.target_ip_addr()
                 << " sender hw address " << arp.sender_hw_addr() << std::endl
                 << " run cmd: " << cmd << endl;*/
            system(cmd.c_str());
            cmd = "arp -s ";
            cmd += arp.sender_ip_addr().to_string();
            cmd += " ";
            cmd += arp.sender_hw_addr().to_string();
            cout << cmd << endl;
            system(cmd.c_str());
        }
    }
    return true;
}

arp_monitor monitor;
void reroute(int signum) {
    monitor.makegws();
    monitor.reroute();
}

int main(int argc, char *argv[]) {
    string test;
    cout << sizeof(string) << endl;

    if (argc != 2) {
        cout << "Usage: " << *argv << " <interface>" << endl;
        return 1;
    }
    signal(SIGHUP, reroute);
    monitor.iface = argv[1];
    // Sniffer configuration
    SnifferConfiguration config;
    config.set_promisc_mode(true);
    config.set_filter("arp");

    monitor.makegws();

    try {
        // Sniff on the provided interface in promiscuous mode
        Sniffer sniffer(argv[1], config);

        // Only capture arp packets
        monitor.run(sniffer);
    }
    catch (std::exception &ex) {
        std::cerr << "Error: " << ex.what() << std::endl;
    }
}

ืกืงืจื™ืคื˜ ื”ืชืงื ื” ืฉืœ libtins

#!/bin/bash

git clone https://github.com/mfontanini/libtins.git
cd libtins
mkdir build
cd build
cmake ../
make
make install
ldconfig

ืคืงื•ื“ื” ืœื‘ื ื•ืช ืืช ื”ื‘ื™ื ืืจื™

g++ main.cpp -o arp-rt -O3 -std=c++11 -lpthread -ltins

ืื™ืš ืœื”ืคืขื™ืœ ืื•ืชื•?


start-stop-daemon --start --exec  /opt/ipoe/arp-routes/arp-rt -b -m -p /opt/ipoe/arp-routes/daemons/eth0.800.pid -- eth0.800

ื›ืŸ - ื–ื” ื™ื‘ื ื” ืžื—ื“ืฉ ืืช ื”ื˜ื‘ืœืื•ืช ืขืœ ืกืžืš ืื•ืช HUP. ืœืžื” ืœื ื”ืฉืชืžืฉืช ื‘-netlink? ื–ื• ืคืฉื•ื˜ ืขืฆืœื•ืช ื•ืœื™ื ื•ืงืก ื–ื” ืกืงืจื™ืคื˜ ืขืœ ืกืงืจื™ืคื˜ - ืื– ื”ื›ืœ ื‘ืกื“ืจ. ื•ื‘ื›ืŸ, ืžืกืœื•ืœื™ื ื”ื ืžืกืœื•ืœื™ื, ืžื” ื”ืœืื”? ืœืื—ืจ ืžื›ืŸ, ืขืœื™ื ื• ืœืฉืœื•ื— ืืช ื”ืžืกืœื•ืœื™ื ืฉื ืžืฆืื™ื ื‘ืฉืจืช ื”ื–ื” ืืœ ื”ื’ื‘ื•ืœ - ื›ืืŸ, ืขืงื‘ ืื•ืชื” ื—ื•ืžืจื” ืžื™ื•ืฉื ืช, ื ืงื˜ื ื• ื‘ื ืชื™ื‘ ืฉืœ ื”ื”ืชื ื’ื“ื•ืช ื”ืงื˜ื ื” ื‘ื™ื•ืชืจ - ื”ืงืฆื” ืืช ื”ืžืฉื™ืžื” ื”ื–ื• ืœ-BGP.

bgp configืฉื ืžืืจื— *******
ืกื™ืกืžื” *******
ืงื•ื‘ืฅ ื™ื•ืžืŸ /var/log/bgp.log
!
# ืžืกืคืจ AS, ื›ืชื•ื‘ื•ืช ื•ืจืฉืชื•ืช ื”ื ื‘ื“ื•ื™ื™ื
ื ืชื‘ bgp 12345
bgp router-id 1.2.3.4
ืœื”ืคื™ืฅ ืžื—ื“ืฉ ืžื—ื•ื‘ืจื™ื
ืœื”ืคื™ืฅ ืžื—ื“ืฉ ืกื˜ื˜ื™
ืฉื›ืŸ 1.2.3.1 ืฉืœื˜-ื›-12345
ืฉื›ืŸ 1.2.3.1 ื”ื‘ื-ื”ื•ืค-ืขืฆืžื™
ืฉื›ืŸ 1.2.3.1 ืžืกืœื•ืœ-ืžืคืช ืื™ืŸ ื‘
ืฉื›ืŸ 1.2.3.1 ื™ื™ืฆื•ื ืžืคืช ืžืกืœื•ืœ ื”ื—ื•ืฆื”
!
ื”ื™ืชืจ ื™ื™ืฆื•ื ืฉืœ ืจืฉื™ืžืช ื’ื™ืฉื” 1.2.3.0/24
!
ื”ื™ืชืจ ื™ื™ืฆื•ื ืžืคืช ืžืกืœื•ืœ 10
ื”ืชืืžื” ืœื™ื™ืฆื•ื ื›ืชื•ื‘ืช ื”-IP
!
ื“ื—ื™ื™ืช ื™ื™ืฆื•ื ืžืคืช ืžืกืœื•ืœ 20

ื‘ื•ื ื ืžืฉื™ืš. ืขืœ ืžื ืช ืฉื”ืฉืจืช ื™ื’ื™ื‘ ืœื‘ืงืฉื•ืช arp, ืขืœื™ืš ืœื”ืคืขื™ืœ ืืช arp proxy.


echo 1 > /proc/sys/net/ipv4/conf/eth0.800/proxy_arp

ื‘ื•ืื• ื ืžืฉื™ืš ื”ืœืื” - ืื•ืงืจืค. ืื ื—ื ื• ื›ื•ืชื‘ื™ื ื‘ืขืฆืžื ื• ืืช ืชืกืจื™ื˜ื™ ื”ื”ืฉืงื” ืœื ืก ื”ื–ื”.

ื“ื•ื’ืžื” ืœื”ืคืขืœืช ื“ืžื•ืŸ ืื—ื“


start-stop-daemon --start --exec  /usr/sbin/ucarp -b -m -p /opt/ipoe/ucarp-gen2/daemons/$iface.$vhid.$virtualaddr.pid -- --interface=eth0.800 --srcip=1.2.3.4 --vhid=1 --pass=carpasword --addr=10.10.10.1 --upscript=/opt/ipoe/ucarp-gen2/up.sh --downscript=/opt/ipoe/ucarp-gen2/down.sh -z -k 10 -P --xparam="10.10.10.0/24"

up.sh


#!/bin/bash

iface=$1
addr=$2
gw=$3

vlan=`echo $1 | sed "s/eth0.//"`


ip ad ad $addr/32 dev lo
ip ro add blackhole $gw
echo 1 > /proc/sys/net/ipv4/conf/$iface/proxy_arp

killall -9 dhcrelay
/etc/init.d/dhcrelay zap
/etc/init.d/dhcrelay start


killall -HUP arp-rt

ืœืžื˜ื”.ืฉ


#!/bin/bash

iface=$1
addr=$2
gw=$3

ip ad d $addr/32 dev lo
ip ro de blackhole $gw
echo 0 > /proc/sys/net/ipv4/conf/$iface/proxy_arp


killall -9 dhcrelay
/etc/init.d/dhcrelay zap
/etc/init.d/dhcrelay start

ื›ื“ื™ ืฉ-dhcprelay ื™ืขื‘ื•ื“ ืขืœ ืžืžืฉืง, ื”ื•ื ืฆืจื™ืš ื›ืชื•ื‘ืช. ืœื›ืŸ, ืขืœ ื”ืžืžืฉืงื™ื ื‘ื”ื ืื ื• ืžืฉืชืžืฉื™ื ื ื•ืกื™ืฃ ื›ืชื•ื‘ื•ืช ืฉืžืืœื™ื•ืช - ืœืžืฉืœ 10.255.255.1/32, 10.255.255.2/32 ื•ื›ื•'. ืื ื™ ืœื ืื’ื™ื“ ืœืš ืื™ืš ืœื”ื’ื“ื™ืจ ืืช ื”ืžืžืกืจ - ื”ื›ืœ ืคืฉื•ื˜.

ืื– ืžื” ื™ืฉ ืœื ื•? ื’ื™ื‘ื•ื™ ืฉืขืจื™ื, ื”ื’ื“ืจื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ืžืกืœื•ืœื™ื, dhcp. ื–ื” ื”ืกื˜ ื”ืžื™ื ื™ืžืœื™ - ื’ื lisg ืขื•ื˜ืคืช ื”ื›ืœ ืกื‘ื™ื‘ื• ื•ื›ื‘ืจ ื™ืฉ ืœื ื• ืžืขืฆื‘. ืœืžื” ื”ื›ืœ ื›ืœ ื›ืš ืืจื•ืš ื•ืžืกื•ื‘ืš? ื”ืื ืœื ืงืœ ื™ื•ืชืจ ืœืงื—ืช accel-pppd ื•ืœื”ืฉืชืžืฉ ื‘-pppoe ืœื’ืžืจื™? ืœื, ื–ื” ืœื ืคืฉื•ื˜ ื™ื•ืชืจ - ืื ืฉื™ื ื‘ืงื•ืฉื™ ื™ื›ื•ืœื™ื ืœื”ื›ื ื™ืก ื›ื‘ืœ patchcord ืœื ืชื‘, ืฉืœื ืœื“ื‘ืจ ืขืœ pppoe. accel-ppp ื–ื” ื“ื‘ืจ ืžื’ื ื™ื‘ - ืื‘ืœ ื–ื” ืœื ืขื‘ื“ ืœื ื• - ื™ืฉ ื”ืจื‘ื” ืฉื’ื™ืื•ืช ื‘ืงื•ื“ - ื”ื•ื ืžืชืคื•ืจืจ, ื”ื•ื ื—ื•ืชืš ื‘ืฆื•ืจื” ืขืงื•ืžื”, ื•ื”ื“ื‘ืจ ื”ื›ื™ ืขืฆื•ื‘ ื”ื•ื ืฉืื ื–ื” ื”ืชื‘ื”ืจ - ืื– ืื ืฉื™ื ืฆืจื™ื›ื™ื ืœื˜ืขื•ืŸ ืžื—ื“ืฉ ื”ื›ืœ - ื”ื˜ืœืคื•ื ื™ื ืื“ื•ืžื™ื - ื–ื” ืœื ืขื‘ื“ ื‘ื›ืœืœ. ืžื” ื”ื™ืชืจื•ืŸ ื‘ืฉื™ืžื•ืฉ ื‘-ucarp ื•ืœื ื‘-leived? ื›ืŸ, ื‘ื›ืœ ื“ื‘ืจ - ื™ืฉ 100 ืฉืขืจื™ื, keepalived ื•ืฉื’ื™ืื” ืื—ืช ื‘ืชืฆื•ืจื” - ื”ื›ืœ ืœื ืขื•ื‘ื“. ืฉืขืจ 1 ืœื ืขื•ื‘ื“ ืขื ucarp. ืœื’ื‘ื™ ื”ืื‘ื˜ื—ื” ืื•ืžืจื™ื ืฉื”ืฉืžืืœื™ื™ื ื™ืจืฉืžื• ืœืขืฆืžื ื›ืชื•ื‘ื•ืช ื•ื™ืฉืชืžืฉื• ื‘ื”ืŸ ื‘-share - ื›ื“ื™ ืœืฉืœื•ื˜ ื‘ืจื’ืข ื”ื–ื”, ื”ื’ื“ืจื ื• dhcp-snooping + source-guard + arp inspection ืขืœ ื›ืœ ื”ืžืชื’ื™ื/olts/bases. ืื ืœืœืงื•ื— ืื™ืŸ dhpc ืืœื ืกื˜ื˜ื™ - acces-list ื‘ืคื•ืจื˜.

ืœืžื” ื›ืœ ื–ื” ื ืขืฉื”? ืœื”ืจื•ืก ืชื ื•ืขื” ืœื ืจืฆื•ื™ื”. ืขื›ืฉื™ื• ืœื›ืœ ืžืชื’ ื™ืฉ vlan ืžืฉืœื• ื•-unknown-unicast ื›ื‘ืจ ืœื ืžืคื—ื™ื“, ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืฆืจื™ืš ืœืœื›ืช ืจืง ืœื™ืฆื™ืื” ืื—ืช ื•ืœื ืœื›ื•ืœื... ื•ื‘ื›ืŸ, ืชื•ืคืขื•ืช ื”ืœื•ื•ืื™ ื”ืŸ ืชืฆื•ืจืช ืฆื™ื•ื“ ืกื˜ื ื“ืจื˜ื™ืช, ื™ืขื™ืœื•ืช ืจื‘ื” ื™ื•ืชืจ ื‘ื”ืงืฆืืช ืžืจื—ื‘ ื›ืชื•ื‘ื•ืช.

ื›ื™ืฆื“ ืœื”ื’ื“ื™ืจ ืืช lisg ื”ื•ื ื ื•ืฉื ื ืคืจื“. ืžืฆื•ืจืคื™ื ืงื™ืฉื•ืจื™ื ืœืกืคืจื™ื•ืช. ืื•ืœื™ ื”ืืžื•ืจ ืœืขื™ืœ ื™ืขื–ื•ืจ ืœืžื™ืฉื”ื• ื‘ื”ืฉื’ืช ืžื˜ืจื•ืชื™ื•. ื’ืจืกื” 6 ืขื“ื™ื™ืŸ ืœื ืžื™ื•ืฉืžืช ื‘ืจืฉืช ืฉืœื ื• - ืื‘ืœ ืชื”ื™ื” ื‘ืขื™ื” - ื™ืฉ ืชื•ื›ื ื™ื•ืช ืœืฉื›ืชื‘ ืืช lisg ืœื’ืจืกื” 6, ื•ื™ื”ื™ื” ืฆื•ืจืš ืœืชืงืŸ ืืช ื”ืชื•ื›ื ื™ืช ืฉืžื•ืกื™ืคื” ืžืกืœื•ืœื™ื.

ืœื™ื ื•ืงืก ISG
DB2DHCP
ืœื™ื‘ื˜ื™ื ืก

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”