Устойчива Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ IPeE ΠΌΡ€Π΅ΠΆΠ° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΈΠΌΠΏΡ€ΠΎΠ²ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ инструмСнти

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΈΠΌΠ° ΠΌΡ€Π΅ΠΆΠ° ΠΎΡ‚ 5k ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Наскоро сС появи Π΅Π΄ΠΈΠ½ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ приятСн ΠΌΠΎΠΌΠ΅Π½Ρ‚ - Π² Ρ†Π΅Π½Ρ‚ΡŠΡ€Π° Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΈΠΌΠ°ΠΌΠ΅ Brocade RX8 ΠΈ Π·Π°ΠΏΠΎΡ‡Π½Π° Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° ΠΌΠ½ΠΎΠ³ΠΎ нСизвСстни-unicast ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° vlans - Ρ‚ΠΎΠ²Π° отчасти Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, НО ΠΈΠΌΠ° спСциални vlan Π·Π° Π±Π΅Π»ΠΈ адрСси ΠΈ Π΄Ρ€. ΠΈ Ρ‚Π΅ са ΠΎΠΏΡŠΠ½Π°Ρ‚ΠΈ във всички посоки Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°. Π’Π°ΠΊΠ° Ρ‡Π΅ сСга си прСдставСтС входящ ΠΏΠΎΡ‚ΠΎΠΊ към адрСса Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΡƒΡ‡ΠΈ ΠΊΠ°Ρ‚ΠΎ Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ студСнт ΠΈ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π»Π΅Ρ‚ΠΈ към Ρ€Π°Π΄ΠΈΠΎ Π²Ρ€ΡŠΠ·ΠΊΠ° към някоС (ΠΈΠ»ΠΈ цялото) сСло - ΠΊΠ°Π½Π°Π»ΡŠΡ‚ Π΅ Π·Π°Π΄Ρ€ΡŠΡΡ‚Π΅Π½ - ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅ са ядосани - Ρ‚ΡŠΠ³Π°...

Π¦Π΅Π»Ρ‚Π° Π΅ Π΄Π° ΠΏΡ€Π΅Π²ΡŠΡ€Π½Π΅Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° във функция. ΠœΠΈΡΠ»Π΅Ρ… Π² посока q-in-q с ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π΅Π½ клиСнтски vlan, Π½ΠΎ всякакъв Π²ΠΈΠ΄ Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€ ΠΊΠ°Ρ‚ΠΎ P3310, ΠΊΠΎΠ³Π°Ρ‚ΠΎ dot1q Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½, спира Π΄Π° пропуска DHCP, Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π½Π΅ знаят ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚ qinq ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΎΠΏΠΊΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ Π²ΠΈΠ΄. Какво Π΅ ip-unnambered ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ? Много Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ: адрСс Π½Π° шлюз + ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π½Π° интСрфСйса. Π—Π° Π½Π°ΡˆΠ°Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° трябва Π΄Π°: ΠΈΠ·Ρ€Π΅ΠΆΠ΅ΠΌ ΡˆΠ΅ΠΉΠΏΡŠΡ€Π°, Π΄Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ адрСси Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅, Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈ към ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ интСрфСйси. Как Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ всичко Ρ‚ΠΎΠ²Π°? 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 сигнала. Π—Π°Ρ‰ΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…Ρ‚Π΅ Π½Π΅Ρ‚Π»ΠΈΠ½ΠΊ? Π’ΠΎΠ²Π° Π΅ просто ΠΌΡŠΡ€Π·Π΅Π» ΠΈ 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 next-hop-self
съсСд 1.2.3.1 route-map няма в
съсСд 1.2.3.1 СкспортиранС Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π½Π° ΠΊΠ°Ρ€Ρ‚Π°
!
Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° износ Π½Π° списък Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ 1.2.3.0/24
!
Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° износ Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π½Π° ΠΊΠ°Ρ€Ρ‚Π° 10
ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ Скспорт Π½Π° ip адрСс
!
ΠΎΡ‚ΠΊΠ°Π· Π·Π° износ Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π½Π° ΠΊΠ°Ρ€Ρ‚Π° 20

Π”Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ. Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π΄Π° отговаря Π½Π° arp заявки, трябва Π΄Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ‚Π΅ arp проксито.


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

Π½Π°Π΄ΠΎΠ»Ρƒ.ш


#!/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 вмСсто keepalived? Π”Π°, във всичко - ΠΈΠΌΠ° 100 шлюза, keepalived ΠΈ Π΅Π΄Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - всичко Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ. 1 шлюз Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ с ucarp. ΠžΡ‚Π½ΠΎΡΠ½ΠΎ сигурността ΠΊΠ°Π·Π²Π°Ρ‚, Ρ‡Π΅ Π»Π΅Π²ΠΈΡ‚Π΅ Ρ‰Π΅ рСгистрират адрСси Π·Π° сСбС си ΠΈ Ρ‰Π΅ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² сподСлянСто - Π·Π° Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π½ΠΈΠ΅ настройвамС dhcp-snooping + source-guard + arp инспСкция Π½Π° всички ΠΊΠΎΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€ΠΈ/olts/Π±Π°Π·ΠΈ. Ако ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ няма dhpc, Π° static - acces-list Π½Π° ΠΏΠΎΡ€Ρ‚Π°.

Π—Π°Ρ‰ΠΎ бСшС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ всичко Ρ‚ΠΎΠ²Π°? Π—Π° ΡƒΠ½ΠΈΡ‰ΠΎΠΆΠ°Π²Π°Π½Π΅ Π½Π° Π½Π΅ΠΆΠ΅Π»Π°Π½ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. Π‘Π΅Π³Π° всСки ΠΊΠΎΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠ° свой собствСн vlan ΠΈ unknown-unicast Π²Π΅Ρ‡Π΅ Π½Π΅ Π΅ ΡΡ‚Ρ€Π°ΡˆΠ΅Π½, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ трябва Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅ само Π΄ΠΎ Π΅Π΄ΠΈΠ½ ΠΏΠΎΡ€Ρ‚, Π° Π½Π΅ Π΄ΠΎ всички... Π•, страничнитС Π΅Ρ„Π΅ΠΊΡ‚ΠΈ са стандартизирана конфигурация Π½Π° ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½Π΅Ρ‚ΠΎ, ΠΏΠΎ-голяма СфСктивност ΠΏΡ€ΠΈ разпрСдСлянС Π½Π° адрСсно пространство.

Как Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ lisg Π΅ ΠΎΡ‚Π΄Π΅Π»Π½Π° Ρ‚Π΅ΠΌΠ°. Π’Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ към Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ са ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ. МоТС Π±ΠΈ Π³ΠΎΡ€Π½ΠΎΡ‚ΠΎ Ρ‰Π΅ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π½Π° някого Π΄Π° постигнС Ρ†Π΅Π»ΠΈΡ‚Π΅ си. ВСрсия 6 всС ΠΎΡ‰Π΅ Π½Π΅ сС ΠΏΡ€ΠΈΠ»Π°Π³Π° Π² Π½Π°ΡˆΠ°Ρ‚Π° ΠΌΡ€Π΅ΠΆΠ° - Π½ΠΎ Ρ‰Π΅ ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ - ΠΈΠΌΠ° ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π·Π° прСнаписванС Π½Π° lisg Π·Π° вСрсия 6 ΠΈ Ρ‰Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, която добавя ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈ.

Linux ISG
DB2DHCP
Либтинс

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€