เป€เบ„เบทเบญเบ‚เปˆเบฒเบ IPeE เบ—เบตเปˆเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบท improvised

เบชเบฐเบšเบฒเบเบ”เบต. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบตเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒ 5k. เบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เบกเบตเบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบšเปเปˆเบชเบฐเบšเบฒเบเบซเบผเบฒเบ - เบขเบนเปˆเปƒเบˆเบเบฒเบ‡เบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบกเบต Brocade RX8 เปเบฅเบฐเบกเบฑเบ™เป€เบฅเบตเปˆเบกเบชเบปเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ” unicast เบ—เบตเปˆเบšเปเปˆเบฎเบนเป‰เบˆเบฑเบเบซเบผเบฒเบ, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ–เบทเบเปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™ vlans - เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™เบšเปเปˆเปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒ, เปเบ•เปˆเบงเปˆเบฒเบกเบต. vlans เบžเบดเป€เบชเบ”เบชเปเบฒเบฅเบฑเบšเบ—เบตเปˆเบขเบนเปˆเบชเบตเบ‚เบฒเบง, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เปเบฅเบฐเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ–เบทเบ stretched เปƒเบ™เบ—เบธเบเบ—เบดเบ”เบ—เบฒเบ‡เบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เบ”เบฝเบงเบ™เบตเป‰เบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบเบฐเปเบชเป€เบ‚เบปเป‰เบฒเบกเบฒเบซเบฒเบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฝเบ™เป€เบ›เบฑเบ™เบ™เบฑเบเบฎเบฝเบ™เบŠเบฒเบเปเบ”เบ™ เปเบฅเบฐเบเบฐเปเบชเบ™เบตเป‰เบšเบดเบ™เป„เบ›เบซเบฒเบงเบดเบ—เบฐเบเบธเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบšเป‰เบฒเบ™เบšเบฒเบ‡ (เบซเบผเบทเบ—เบฑเบ‡เบซเบกเบปเบ”) - เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบ–เบทเบเบญเบธเบ”เบ•เบฑเบ™ - เบฅเบนเบเบ„เป‰เบฒเปƒเบˆเบฎเป‰เบฒเบ - เบ„เบงเบฒเบกเป‚เบชเบเป€เบชเบปเป‰เบฒ ...

เป€เบ›เบปเป‰เบฒโ€‹เบซเบกเบฒเบโ€‹เปเบกเปˆเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰ bug เป€เบ›เบฑเบ™โ€‹เบ„เบธเบ™โ€‹เบชเบปเบกโ€‹เบšเบฑเบ”โ€‹. เบ‚เป‰เบญเบเบ„เบดเบ”เป„เบ›เปƒเบ™เบ—เบดเบ”เบ—เบฒเบ‡เบ‚เบญเบ‡ q-in-q เบเบฑเบš vlan เบฅเบนเบเบ„เป‰เบฒเป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบš, เปเบ•เปˆเบฎเบฒเบ”เปเบงเบ—เบธเบเบ›เบฐเป€เบžเบ”เป€เบŠเบฑเปˆเบ™ P3310, เป€เบกเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰ dot1q, เบขเบธเบ”เปƒเบซเป‰ DHCP เบœเปˆเบฒเบ™, เบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบ‡เบšเปเปˆเบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบทเบญเบ qinq เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบ. เบ‚เบธเบกโ€‹เบ‚เบญเบ‡โ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹เบ™เบฑเป‰เบ™โ€‹. ip-unnambered เปเบกเปˆเบ™เบซเบเบฑเบ‡เปเบฅเบฐเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”? เบชเบฑเป‰เบ™เป†: เบ—เบตเปˆเบขเบนเปˆ gateway + เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš. เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡: เบ•เบฑเบ” shaper, เปเบˆเบเบขเบฒเบเบ—เบตเปˆเบขเบนเปˆเปƒเบซเป‰เบเบฑเบšเบฅเบนเบเบ„เป‰เบฒ, เป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปƒเบซเป‰เบเบฑเบšเบฅเบนเบเบ„เป‰เบฒเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™. เป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰? Shaper - lisg, dhcp - db2dhcp เปƒเบ™เบชเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบญเบเบฐเบฅเบฒเบ”, dhcprelay เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡, ucarp เบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ - เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเปเบฒเบฎเบญเบ‡เบ‚เปเป‰เบกเบนเบ™. เปเบ•เปˆเบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปเบ™เบงเปƒเบ”? เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒเบ”เป‰เบงเบเบชเบฐเบ„เบดเบšเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ - เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ” crutch เบ‚เบฝเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡.

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบปเบšเป€เบซเบฑเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบ—เบตเปˆเบ›เบฐเป€เบชเบตเบ”เบชเปเบฒเบฅเบฑเบš C ++, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ–เบญเบเบ™เป‰เปเบฒเป„เบ”เป‰เบขเปˆเบฒเบ‡เบชเบงเบเบ‡เบฒเบก. algorithm เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบกเบตเบ”เบฑเปˆเบ‡เบ™เบตเป‰ - เบžเบงเบเป€เบฎเบปเบฒเบŸเบฑเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป arp เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš lo เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เป, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบœเปˆเบฒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ™เบตเป‰เปเบฅเบฐเป€เบžเบตเปˆเบก arp static. เบšเบฑเบ™เบ—เบถเบเปƒเบชเปˆ ip เบ™เบตเป‰ - เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, a copy-pastes, a little adjective and you're done

เปเบซเบผเปˆเบ‡เบ—เบตเปˆเบกเบฒเบ‚เบญเบ‡ 'เป€เบฃเบปเบฒเป€เบ•เบต'

#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;
    }
}

script เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ 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? เบกเบฑเบ™เป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆ laziness เปเบฅเบฐ Linux เปเบกเปˆเบ™ script เปƒเบ™ script - เบชเบฐเบ™เบฑเป‰เบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ”เบต. เปเบฅเป‰เบง, เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปเบกเปˆเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡, เปเบกเปˆเบ™เบซเบเบฑเบ‡เบ•เปเปˆเป„เบ›? เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบปเปˆเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ™เบตเป‰เป„เบ›เบซเบฒเบŠเบฒเบเปเบ”เบ™ - เบ—เบตเปˆเบ™เบตเป‰, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบฎเบฒเบ”เปเบงเบ—เบตเปˆเบฅเป‰เบฒเบชเบฐเป„เบซเบกเบ”เบฝเบงเบเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบญเบปเบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ•เปเปˆเบ•เป‰เบฒเบ™เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ - เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบกเบญเบšเบซเบกเบฒเบเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เปƒเบซเป‰ BGP.

bgp configเบŠเบทเปˆเป€เบˆเบปเป‰เบฒเบžเบฒเบš *******
เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เบœเปˆเบฒเบ™ *******
เป„เบŸเบฅเปŒเบšเบฑเบ™เบ—เบถเบ /var/log/bgp.log
!
# AS เป€เบฅเบ, เบ—เบตเปˆเบขเบนเปˆ เปเบฅเบฐเป€เบ„เบทเบญเบ‚เปˆเบฒเบเปเบกเปˆเบ™เบชเบปเบกเบกเบธเบ”
router bgp 12345
bgp router-id 1.2.3.4
เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ„เบทเบ™เปƒเปเปˆ
เปเบˆเบเบขเบฒเบ static
เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™ 1.2.3.1 remote-as 12345
เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™ 1.2.3.1 next-hop-self
เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™ 1.2.3.1 route-map none in
เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™ 1.2.3.1 เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡-เปเบœเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบญเบญเบเบญเบญเบ
!
เปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เบชเบปเปˆเบ‡เบญเบญเบเบฅเบฒเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ 1.2.3.0/24
!
เปƒเบšโ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบชเบปเปˆเบ‡โ€‹เบญเบญเบโ€‹เป€เบชเบฑเป‰เบ™โ€‹เบ—เบฒเบ‡ - เปเบœเบ™โ€‹เบ—เบตเปˆ 10
เบˆเบฑเบšเบ„เบนเปˆเบเบฒเบ™เบชเบปเปˆเบ‡เบญเบญเบเบ—เบตเปˆเบขเบนเปˆ ip
!
route-map export เบ›เบฐเบ•เบดเป€เบชเบ” 20

เปƒเบซเป‰เบชเบทเบšเบ•เปเปˆ. เป€เบžเบทเปˆเบญเปƒเบซเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป arp, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เป€เบ›เบตเบ”เปƒเบŠเป‰ arp proxy.


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

เบ‚เปเปƒเบซเป‰เบเป‰เบฒเบงเบ•เปเปˆเป„เบ› - ucarp . เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบชเบฐเบ„เบดเบšเป€เบ›เบตเบ”เบ•เบปเบงเบชเปเบฒเบฅเบฑเบšเบชเบดเปˆเบ‡เบกเบฐเบซเบฑเบ”เบชเบฐเบˆเบฑเบ™เบ™เบตเป‰เป€เบญเบ‡.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปเบฅเปˆเบ™เบซเบ™เบถเปˆเบ‡ daemon


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, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเบšเบญเบเบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒ relay - เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบซเบเบฑเบ‡เปเบ”เปˆ? เบเบฒเบ™เบชเปเบฒเบฎเบญเบ‡เบ‚เบญเบ‡ gateways, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡, dhcp. เบ™เบตเป‰เปเบกเปˆเบ™เบŠเบธเบ”เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆ - lisg เบเบฑเบ‡เบซเปเปˆเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบขเบนเปˆเบญเป‰เบญเบกเบฎเบญเบšเบกเบฑเบ™เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ•เบปเบงเบชเป‰เบฒเบ‡เปเบฅเป‰เบง. เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบˆเบถเปˆเบ‡เบเบฒเบง เปเบฅเบฐเบชเบฑเบšเบชเบปเบ™? เบกเบฑเบ™เบ‡เปˆเบฒเบเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒ accel-pppd เปเบฅเบฐเปƒเบŠเป‰ pppoe เบžเป‰เบญเบกเบเบฑเบ™เบšเป? เบšเปเปˆ, เบกเบฑเบ™เบšเปเปˆเบ‡เปˆเบฒเบเบเบงเปˆเบฒ - เบ„เบปเบ™เป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบชเปˆเบชเบฒเบเบ•เปเปˆเปƒเบชเปˆเบเบฑเบš router เป„เบ”เป‰, เบšเปเปˆเบ•เป‰เบญเบ‡เป€เบงเบปเป‰เบฒเป€เบ–เบดเบ‡ pppoe. accel-ppp เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบขเบฑเบ™ - เปเบ•เปˆเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ - เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบซเบผเบฒเบเปƒเบ™เบฅเบฐเบซเบฑเบ” - เบกเบฑเบ™เปเบ•เบ, เบกเบฑเบ™เบ•เบฑเบ”เบขเปˆเบฒเบ‡เบ‡เบญเบ, เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเป€เบชเบปเป‰เบฒเปƒเบˆเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบ–เป‰เบฒเบกเบฑเบ™เบชเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบถเป‰เบ™ - เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ›เบฐเบŠเบฒเบŠเบปเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป‚เบซเบฅเบ”เปƒเบซเบกเปˆ. เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡ - เป‚เบ—เบฅเบฐเบชเบฑเบšเปเบกเปˆเบ™เบชเบตเปเบ”เบ‡ - เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเป€เบฅเบตเบ. เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ ucarp เบซเบผเบฒเบเบเบงเปˆเบฒเบเบฒเบ™เบฎเบฑเบเบชเบฒเป„เบงเป‰เปเบกเปˆเบ™เบซเบเบฑเบ‡? เปเบกเปˆเบ™เปเบฅเป‰เบง, เปƒเบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡ - เบกเบต 100 gateways, keepalived เปเบฅเบฐเบซเบ™เบถเปˆเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™ config - เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบ. 1 gateway เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš ucarp. เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เบžเบงเบเป€เบ‚เบปเบฒเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบœเบนเป‰เบŠเป‰เบฒเบเบˆเบฐเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบ—เบตเปˆเบขเบนเปˆเบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเป€เบญเบ‡เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เปƒเบ™เบชเปˆเบงเบ™เปเบšเปˆเบ‡ - เป€เบžเบทเปˆเบญเบ„เบงเบšเบ„เบธเบกเป€เบงเบฅเบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ dhcp-snooping + source-guard + arp inspection on all switches/olts/bases. เบ–เป‰เบฒเบฅเบนเบเบ„เป‰เบฒเบšเปเปˆเบกเบต dhpc เปเบ•เปˆ static - acces-list on the port .

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ—เบฑเบ‡เปเบปเบ”เบ™เบตเป‰เบˆเบถเปˆเบ‡เบชเบณเป€เบฅเบฑเบ”? เป€เบžเบทเปˆเบญเบ—เปเบฒเบฅเบฒเบเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ—เบตเปˆเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปเบ•เปˆเบฅเบฐเบชเบฐเบซเบผเบฑเบšเบกเบต vlan เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เปเบฅเบฐ unknown-unicast เปเบกเปˆเบ™เบšเปเปˆเบซเบ™เป‰เบฒเบขเป‰เบฒเบ™เบญเบตเบเบ•เปเปˆเป„เบ›, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เป„เบ›เบซเบฒเบซเบ™เบถเปˆเบ‡เบžเบญเบ”เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ” ... เบ”เบต, เบœเบปเบ™เบเบฐเบ—เบปเบšเบ‚เป‰เบฒเบ‡เบ„เบฝเบ‡เปเบกเปˆเบ™ config เบญเบธเบ›เบฐเบเบญเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ.

เบงเบดเบ—เบตเบเบฒเบ™เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒ lisg เป€เบ›เบฑเบ™เบซเบปเบงเบ‚เปเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป„เบ”เป‰เบ–เบทเบเบ„เบฑเบ”เบ•เบดเบ”. เบšเบฒเบ‡เบ—เบตเบชเบดเปˆเบ‡เบ—เบตเปˆเบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบšเบฒเบ‡เบ„เบปเบ™เบšเบฑเบ™เบฅเบธเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ. เบฎเบธเปˆเบ™ 6 เบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบ—เบทเปˆเบญ - เปเบ•เปˆเบˆเบฐเบกเบตเบšเบฑเบ™เบซเบฒ - เบกเบตเปเบœเบ™เบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบ„เบทเบ™เปƒเบซเบกเปˆ lisg เบชเปเบฒเบฅเบฑเบšเบฎเบธเปˆเบ™ 6, เปเบฅเบฐเบกเบฑเบ™เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡.

Linux ISG
DB2DHCP
เบฅเบตเบšเบ•เบดเบ™

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™