เช‡เชฎเซเชชเซเชฐเซเชตเชพเช‡เชเซเชก เชŸเซ‚เชฒเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชซเซ‹เชฒเซเชŸ-เชŸเซ‹เชฒเชฐเชจเซเชŸ IPeE เชจเซ‡เชŸเชตเชฐเซเช•

เชจเชฎเชธเซเชคเซ‡. เช†เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เชคเซเชฏเชพเช‚ 5k เช—เซเชฐเชพเชนเช•เซ‹เชจเซเช‚ เชจเซ‡เชŸเชตเชฐเซเช• เช›เซ‡. เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชเช• เช–เซ‚เชฌ เชœ เชธเซเช–เชฆ เช•เซเชทเชฃ เช†เชตเซ€ เชจเชฅเซ€ - เชจเซ‡เชŸเชตเชฐเซเช•เชจเซ€ เชฎเชงเซเชฏเชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฌเซเชฐเซ‹เช•เซ‡เชก RX8 เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช˜เชฃเชพ เชฌเชงเชพ เช…เชœเชพเชฃเซเชฏเชพ-เชฏเซเชจเชฟเช•เชพเชธเซเชŸ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชจเซ‡เชŸเชตเชฐเซเช• vlans เชฎเชพเช‚ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒเซเช‚ เช›เซ‡ - เช† เช†เช‚เชถเชฟเช• เชฐเซ€เชคเซ‡ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เช›เซ‡. เชธเชซเซ‡เชฆ เชธเชฐเชจเชพเชฎเชพเช‚เช“ เชฎเชพเชŸเซ‡ เช–เชพเชธ vlans, เชตเช—เซ‡เชฐเซ‡. เช…เชจเซ‡ เชคเซ‡เช“ เชจเซ‡เชŸเชตเชฐเซเช•เชจเซ€ เชฌเชงเซ€ เชฆเชฟเชถเชพเชฎเชพเช‚ เชตเชฟเชธเซเชคเชฐเซ‡เชฒ เช›เซ‡. เชคเซ‹ เชนเชตเซ‡ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ เช•เซ‡ เชเช• เช•เซเชฒเชพเชฏเชจเซเชŸเชจเชพ เชธเชฐเชจเชพเชฎเชพ เชชเชฐ เช†เชตเชจเชพเชฐเชพ เชชเซเชฐเชตเชพเชนเชจเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ เชœเซ‡ เชฌเซ‹เชฐเซเชกเชฐ เชธเซเชŸเซเชกเชจเซเชŸ เชคเชฐเซ€เช•เซ‡ เชญเชฃเชคเซ‹ เชจเชฅเซ€ เช…เชจเซ‡ เช† เชชเซเชฐเชตเชพเชน เช…เชฎเซเช• (เช…เชฅเชตเชพ เชฌเชงเชพ) เช—เชพเชฎเชจเซ€ เชฐเซ‡เชกเชฟเชฏเซ‹ เชฒเชฟเช‚เช• เชคเชฐเชซ เช‰เชกเซ‡ เช›เซ‡ - เชšเซ‡เชจเชฒ เชญเชฐเชพเชˆ เช—เชˆ เช›เซ‡ - เช—เซเชฐเชพเชนเช•เซ‹ เช—เซเชธเซเชธเซ‡ เช›เซ‡ - เช‰เชฆเชพเชธเซ€...

เชฌเช—เชจเซ‡ เชธเซเชตเชฟเชงเชพเชฎเชพเช‚ เชซเซ‡เชฐเชตเชตเชพเชจเซ‹ เชงเซเชฏเซ‡เชฏ เช›เซ‡. เชนเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เช•เซเชฒเชพเชฏเช‚เชŸ เชตเซเชฒเชพเชจ เชธเชพเชฅเซ‡ q-in-q เชจเซ€ เชฆเชฟเชถเชพเชฎเชพเช‚ เชตเชฟเชšเชพเชฐเซ€ เชฐเชนเซเชฏเซ‹ เชนเชคเซ‹, เชชเชฐเช‚เชคเซ P3310 เชœเซ‡เชตเชพ เชคเชฎเชพเชฎ เชชเซเชฐเช•เชพเชฐเชจเชพ เชนเชพเชฐเซเชกเชตเซ‡เชฐ, เชœเซเชฏเชพเชฐเซ‡ dot1q เชธเช•เซเชทเชฎ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ DHCP เชจเซ‡ เชชเชธเชพเชฐ เชฅเชตเชพ เชฆเซ‡เชคเซเช‚ เชฌเช‚เชง เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เช“ เช เชชเชฃ เชœเชพเชฃเชคเชพ เชจเชฅเซ€ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เช˜เชฃเชพ เชฌเชงเชพ เชคเซ‡ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“. เช†เชˆเชชเซ€-เช…เชจเชพเชฎเซเชฌเชฐ เชถเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡? เช–เซ‚เชฌ เชœ เชธเช‚เช•เซเชทเชฟเชชเซเชคเชฎเชพเช‚: เช—เซ‡เชŸเชตเซ‡ เชธเชฐเชจเชพเชฎเซเช‚ + เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐเชจเซ‹ เชฎเชพเชฐเซเช—. เช…เชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡, เช…เชฎเชพเชฐเซ‡ เช† เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡: เชถเซ‡เชชเชฐเชจเซ‡ เช•เชพเชชเซ‹, เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ‡ เชธเชฐเชจเชพเชฎเชพเช‚เช“เชจเซเช‚ เชตเชฟเชคเชฐเชฃ เช•เชฐเซ‹, เชšเซ‹เช•เซเช•เชธ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชฆเซเชตเชพเชฐเชพ เช•เซเชฒเชพเชฏเช‚เชŸ เชฎเชพเชŸเซ‡ เชฐเซ‚เชŸ เช‰เชฎเซ‡เชฐเซ‹. เช† เชฌเชงเซเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚? เชถเซ‡เชชเชฐ - lisg, dhcp - db2dhcp เชฌเซ‡ เชธเซเชตเชคเช‚เชคเซเชฐ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ, dhcprelay เชเช•เซเชธเซ‡เชธ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡, ucarp เชชเชฃ เชเช•เซเชธเซ‡เชธ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡ - เชฌเซ‡เช•เช…เชช เชฎเชพเชŸเซ‡. เชชเชฐเช‚เชคเซ เชฎเชพเชฐเซเช—เซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‰เชฎเซ‡เชฐเชตเซเช‚? เชคเชฎเซ‡ เชฎเซ‹เชŸเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชพเชฅเซ‡ เช…เช—เชพเช‰เชฅเซ€ เชฌเชงเซเช‚ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ - เชชเชฐเช‚เชคเซ เช† เชธเชพเชšเซเช‚ เชจเชฅเซ€. เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชธเซเชต-เชฒเซ‡เช–เชฟเชค เช•เซเชฐเซ‰เชš เชฌเชจเชพเชตเซ€เชถเซเช‚.

เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เชธเช‚เชชเซ‚เชฐเซเชฃ เชถเซ‹เชง เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเชจเซ‡ C++ เชฎเชพเชŸเซ‡ เชเช• เช…เชฆเซเชญเซเชค เช‰เชšเซเชš-เชธเซเชคเชฐเชจเซ€ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชฎเชณเซ€, เชœเซ‡ เชคเชฎเชจเซ‡ เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‡ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชธเซเช‚เช˜เชตเชพ เชฆเซ‡ เช›เซ‡. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡เชจเซเช‚ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชœเซ‡ เชฐเซ‚เชŸเซเชธ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡ - เช…เชฎเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชเช†เชฐเชชเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชธเชพเช‚เชญเชณเซ€เช เช›เซ€เช, เชœเซ‹ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชธเชฐเซเชตเชฐ เชชเชฐ เชฒเซ‹ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เช•เซ‹เชˆ เชธเชฐเชจเชพเชฎเซเช‚ เชนเซ‹เชฏ เชœเซ‡ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‹ เช…เชฎเซ‡ เช† เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชฆเซเชตเชพเชฐเชพ เชเช• เชฎเชพเชฐเซเช— เช‰เชฎเซ‡เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชธเซเชฅเชฟเชฐ เชเช†เชฐเชชเซ€ เช‰เชฎเซ‡เชฐเซ€เช เช›เซ€เช. เช† เช†เชˆเชชเซ€ เชชเชฐ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ‹ - เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชฅเซ‹เชกเซ€ เช•เซ‹เชชเซ€-เชชเซ‡เชธเซเชŸ, เชฅเซ‹เชกเซเช‚ เชตเชฟเชถเซ‡เชทเชฃ เช…เชจเซ‡ เชคเชฎเซ‡ เชชเซ‚เชฐเซเชฃ เช•เชฐเซ€ เชฒเซ‹

'เชฐเชพเช‰เชŸเชฐ' เชจเชพ เชธเซเชคเซเชฐเซ‹เชคเซ‹

#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 เชธเชฟเช—เซเชจเชฒเชจเชพ เช†เชงเชพเชฐเซ‡ เช•เซ‹เชทเซเชŸเช•เซ‹เชจเซเช‚ เชชเซเชจเชƒเชจเชฟเชฐเซเชฎเชพเชฃ เช•เชฐเชถเซ‡. เชคเชฎเซ‡ เชจเซ‡เชŸเชฒเชฟเช‚เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชฎ เชจ เช•เชฐเซเชฏเซ‹? เชคเซ‡ เชฎเชพเชคเซเชฐ เช†เชณเชธ เช›เซ‡ เช…เชจเซ‡ Linux เช เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชชเชฐเชจเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช›เซ‡ - เชคเซ‡เชฅเซ€ เชฌเชงเซเช‚ เชธเชพเชฐเซเช‚ เช›เซ‡. เช เซ€เช• เช›เซ‡, เชฎเชพเชฐเซเช—เซ‹ เชฎเชพเชฐเซเช—เซ‹ เช›เซ‡, เช†เช—เชณ เชถเซเช‚ เช›เซ‡? เช†เช—เชณ, เช†เชชเชฃเซ‡ เช† เชธเชฐเซเชตเชฐ เชชเชฐเชจเชพ เชฐเซ‚เชŸเชจเซ‡ เชธเชฐเชนเชฆ เชชเชฐ เชฎเซ‹เช•เชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ - เช…เชนเซ€เช‚, เชธเชฎเชพเชจ เชœเซ‚เชจเชพ เชนเชพเชฐเซเชกเชตเซ‡เชฐเชจเซ‡ เช•เชพเชฐเชฃเซ‡, เช…เชฎเซ‡ เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เชชเซเชฐเชคเชฟเช•เชพเชฐเชจเซ‹ เชฎเชพเชฐเซเช— เช…เชชเชจเชพเชตเซเชฏเซ‹ - เช…เชฎเซ‡ เช† เช•เชพเชฐเซเชฏ BGPเชจเซ‡ เชธเซ‹เช‚เชชเซเชฏเซเช‚.

bgp เชฐเซ‚เชชเชฐเซ‡เช–เชพเชฏเชœเชฎเชพเชจ เชจเชพเชฎ *******
เชชเชพเชธเชตเชฐเซเชก *******
เชฒเซ‹เช— เชซเชพเช‡เชฒ /var/log/bgp.log
!
# AS เชจเช‚เชฌเชฐ, เชธเชฐเชจเชพเชฎเชพเช‚ เช…เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เช•เชพเชฒเซเชชเชจเชฟเช• เช›เซ‡
เชฐเชพเช‰เชŸเชฐ bgp 12345
bgp เชฐเชพเช‰เชŸเชฐ-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
เช†เชˆเชชเซ€ เชเชกเซเชฐเซ‡เชธ เชจเชฟเช•เชพเชธ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช•เชฐเซ‹
!
เชฐเซ‚เชŸ-เชจเช•เชถเซ‹ เชจเชฟเช•เชพเชธ เชจเชพเชฎเช‚เชœเซ‚เชฐ 20

เชšเชพเชฒเซ‹ เชšเชพเชฒเซ เชฐเชพเช–เซ€เช. เชธเชฐเซเชตเชฐ เชเช†เชฐเชชเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‹ เชœเชตเชพเชฌ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชเช†เชฐเชชเซ€ เชชเซเชฐเซ‹เช•เซเชธเซ€เชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡.


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

เชšเชพเชฒเซ‹ เช†เช—เชณ เชตเชงเซ€เช - ucarp. เช…เชฎเซ‡ เช† เชšเชฎเชคเซเช•เชพเชฐ เชฎเชพเชŸเซ‡ เชฒเซ‹เชจเซเชš เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชœเชพเชคเซ‡ เชฒเช–เซ€เช เช›เซ€เช.

เชเช• เชกเชฟเชฎเชจ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ


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

down.sh


#!/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 เชคเซ‡เชจเซ€ เช†เชธเชชเชพเชธเชจเซ€ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ‡ เชชเชฃ เชฒเชชเซ‡เชŸเซ€ เชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชถเซ‡เชชเชฐ เช›เซ‡. เชถเชพ เชฎเชพเชŸเซ‡ เชฌเชงเซเช‚ เช†เชŸเชฒเซเช‚ เชฒเชพเช‚เชฌเซ เช…เชจเซ‡ เช—เซ‚เช‚เชšเชตเชฃเชญเชฐเซเชฏเซเช‚ เช›เซ‡? เชถเซเช‚ เชเช•เซเชธเซ‡เชฒ-เชชเซ€เชชเซ€เชชเซ€เชกเซ€ เชฒเซ‡เชตเซเช‚ เช…เชจเซ‡ เชชเซ€เชชเซ€เชชเซ€เช“ เชเช•เชธเชพเชฅเซ‡ เชตเชพเชชเชฐเชตเซเช‚ เชธเชฐเชณ เชจเชฅเซ€? เชจเชพ, เชคเซ‡ เชธเชฐเชณ เชจเชฅเซ€ - เชฒเซ‹เช•เซ‹ เชญเชพเช—เซเชฏเซ‡ เชœ เชชเซ‡เชšเช•เซ‹เชฐเซเชกเชจเซ‡ เชฐเชพเช‰เชŸเชฐเชฎเชพเช‚ เชซเชฟเชŸ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, pppoe เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เชจ เช•เชฐเชตเซ‹. accel-ppp เช เชเช• เชธเชฐเชธ เชตเชธเซเชคเซ เช›เซ‡ - เชชเชฐเช‚เชคเซ เชคเซ‡ เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€ - เช•เซ‹เชกเชฎเชพเช‚ เช˜เชฃเซ€ เชฌเชงเซ€ เชญเซ‚เชฒเซ‹ เช›เซ‡ - เชคเซ‡ เช•เซเชทเซ€เชฃ เชฅเชˆ เชœเชพเชฏ เช›เซ‡, เชคเซ‡ เช•เซเชŸเชฟเชฒ เชฐเซ€เชคเซ‡ เช•เชพเชชเซ€ เชจเชพเช–เซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเซŒเชฅเซ€ เชฆเซเชƒเช–เชจเซ€ เชตเชพเชค เช เช›เซ‡ เช•เซ‡ เชœเซ‹ เชคเซ‡ เชคเซ‡เชœเชธเซเชตเซ€ เชฅเชพเชฏ เช›เซ‡ - เชคเซ‹ เชฒเซ‹เช•เซ‹เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชฌเชงเซเช‚ - เชซเซ‹เชจ เชฒเชพเชฒ เช›เซ‡ - เชคเซ‡ เชฌเชฟเชฒเช•เซเชฒ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. Keepalived เช•เชฐเชคเชพเช‚ เชฏเซเช•เชพเชฐเซเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชถเซเช‚ เชซเชพเชฏเชฆเซ‹ เช›เซ‡? เชนเชพ, เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชฎเชพเช‚ - 100 เช—เซ‡เชŸเชตเซ‡ เช›เซ‡, เช•เซ€เชชเชฒเชพเชˆเชต เช›เซ‡ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเชฎเชพเช‚ เชเช• เชญเซ‚เชฒ เช›เซ‡ - เชฌเชงเซเช‚ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. 1 เช—เซ‡เชŸเชตเซ‡ ucarp เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เชธเซเชฐเช•เซเชทเชพ เช…เช‚เช—เซ‡, เชคเซ‡เช“ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชกเชพเชฌเซ‡เชฐเซ€เช“ เชชเซ‹เชคเชพเชจเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชจเชพเชฎเชพเช‚ เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชถเซ‡เชฐ เชชเชฐ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชถเซ‡ - เช† เช•เซเชทเชฃเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชคเชฎเชพเชฎ เชธเซเชตเซ€เชšเซ‹/olts/เชฌเซ‡เช เชชเชฐ dhcp-snooping + source-guard + arp เช‡เชจเซเชธเซเชชเซ‡เช•เซเชถเชจ เชธเซ‡เชŸ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เชœเซ‹ เช•เซเชฒเชพเชฏเชจเซเชŸ เชชเชพเชธเซ‡ dhpc เชจเชฅเซ€ เชชเชฐเช‚เชคเซ เชชเซ‹เชฐเซเชŸ เชชเชฐ เชธเซเชŸเซ‡เชŸเชฟเช• - เชเช•เซเชธเซ‡เชธ-เชฒเชฟเชธเซเชŸ เช›เซ‡.

เช† เชฌเชงเซเช‚ เชถเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚? เช…เชจเชฟเชšเซเช›เชจเซ€เชฏ เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‹ เชจเชพเชถ เช•เชฐเชตเชพ. เชนเชตเซ‡ เชฆเชฐเซ‡เช• เชธเซเชตเซ€เชšเชจเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ vlan เช›เซ‡ เช…เชจเซ‡ เช…เชœเซเชžเชพเชค-เชฏเซเชจเชฟเช•เชพเชธเซเชŸ เชนเชตเซ‡ เชกเชฐเชพเชฎเชฃเซ€ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เชจเซ‡ เชซเช•เซเชค เชเช• เชœ เชชเซ‹เชฐเซเชŸ เชชเชฐ เชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชฌเชงเชพ เชชเชฐ เชจเชนเซ€เช‚... เชธเชพเชฐเซเช‚, เช†เชกเช…เชธเชฐ เช เชชเซเชฐเชฎเชพเชฃเชฟเชค เชธเชพเชงเชจเซ‹เชจเซ€ เช—เซ‹เช เชตเชฃเซ€ เช›เซ‡, เชธเชฐเชจเชพเชฎเชพเช‚เชจเซ€ เชœเช—เซเชฏเชพ เชซเชพเชณเชตเชตเชพเชฎเชพเช‚ เชตเชงเซ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ.

lisg เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซเช‚ เชคเซ‡ เชเช• เช…เชฒเช— เชตเชฟเชทเชฏ เช›เซ‡. เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเซ€ เชฒเชฟเช‚เช•เซเชธ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เช›เซ‡. เช•เชฆเชพเชš เช‰เชชเชฐเซ‹เช•เซเชค เช•เซ‹เชˆเชจเซ‡ เชคเซ‡เชฎเชจเชพ เชฒเช•เซเชทเซเชฏเซ‹เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡. เชธเช‚เชธเซเช•เชฐเชฃ 6 เชนเชœเซ เชธเซเชงเซ€ เช…เชฎเชพเชฐเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซเช•เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชจเชฅเซ€ - เชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เชเช• เชธเชฎเชธเซเชฏเชพ เชนเชถเซ‡ - เชธเช‚เชธเซเช•เชฐเชฃ 6 เชฎเชพเชŸเซ‡ lisg เชซเชฐเซ€เชฅเซ€ เชฒเช–เชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชœเซ‡ เชฐเซ‚เชŸเซเชธ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡.

Linux ISG
DB2DHCP
เชฒเชฟเชฌเชŸเชฟเชจเซเชธ

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹