Шабакаи IpeE ба хатогиҳо тобовар бо истифода аз абзорҳои импровизатсияшуда

Салом. Ин маънои онро дорад, ки шабакаи муштариёни 5k мавҷуд аст. Ба наздикӣ як лаҳзаи на он қадар гуворо ба миён омад - дар маркази шабака мо Brocade RX8 дорем ва он ба фиристодани бастаҳои номаълуми ягона оғоз кард, зеро шабака ба вланҳо тақсим шудааст - ин қисман мушкил нест, аммо вуҷуд дорад вланҳои махсус барои суроғаҳои сафед ва ғайра. ва онхо дар тамоми самтхои шабака тул кашидаанд. Ҳамин тавр, ҳоло тасаввур кунед, ки ҷараёни воридотӣ ба суроғаи муштарие, ки ҳамчун донишҷӯи сарҳадӣ таҳсил намекунад ва ин ҷараён ба сӯи пайванди радиоӣ ба ягон деҳа (ё ҳама) парвоз мекунад - канал баста шудааст - мизоҷон хашмгинанд - андӯҳ...

Ҳадаф табдил додани хато ба хусусият аст. Ман дар самти q-in-q бо vlan муштарии мукаммал фикр мекардам, аммо ҳама навъҳои сахтафзор ба монанди P3310, вақте ки dot1q фаъол аст, имкони DHCP-ро қатъ мекунад, онҳо инчунин намедонанд, ки чӣ тавр интихоб кардани qinq ва бисёриҳо домҳои ин гуна. ip-unnambered чист ва он чӣ гуна кор мекунад? Хеле мухтасар: суроғаи дарвоза + масир дар интерфейс. Барои вазифаи мо, мо бояд: шаклдиҳандаро буред, суроғаҳоро ба мизоҷон тақсим кунед, тавассути интерфейсҳои муайян ба мизоҷон масирҳо илова кунед. Хамаи инро чй тавр бояд кард? Shaper - lisg, dhcp - db2dhcp дар ду сервери мустақил, dhcprelay дар серверҳои дастрасӣ кор мекунад, ucarp инчунин дар серверҳои дастрасӣ - барои нусхабардорӣ кор мекунад. Аммо чӣ гуна бояд маршрутҳоро илова кард? Шумо метавонед ҳама чизро пешакӣ бо скрипти калон илова кунед - аммо ин дуруст нест. Ҳамин тавр, мо як асобачаи худнависӣ месозем.

Пас аз ҷустуҷӯи ҳамаҷониба дар Интернет, ман як китобхонаи олиҷаноби сатҳи баландро барои C++ пайдо кардам, ки ба шумо имкон медиҳад трафикро зебо бубинед. Алгоритми барномае, ки маршрутҳоро илова мекунад, чунин аст - мо дархостҳои arp-ро дар интерфейс гӯш мекунем, агар мо дар сервери дархостшуда суроға дошта бошем, мо тавассути ин интерфейс масир илова мекунем ва 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 истифода накардед? Ин танҳо танбалӣ аст ва 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
содироти суроғаи 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 осонтар нест? Не, ин осонтар нест - одамон метавонанд як патчкордро ба роутер гузоранд, ба ғайр аз pppoe. accel-ppp як чизи олӣ аст - аммо он барои мо кор накард - дар код хатогиҳои зиёд мавҷуданд - он пошида мешавад, каҷ мекунад ва аз ҳама аламовараш он аст, ки агар он равшан шавад - пас одамон бояд дубора бор кунанд ҳама чиз - телефонҳо сурх - он тамоман кор намекунад. Бартарии истифодаи ucarp ба ҷои нигоҳ доштани нигоҳдорӣ чист? Бале, дар ҳама чиз - 100 шлюз вуҷуд дорад, нигоҳдорӣ ва як хато дар конфигуратсия - ҳама чиз кор намекунад. 1 дарвоза бо ucarp кор намекунад. Дар мавриди амният, онҳо мегӯянд, ки чапҳо суроғаҳоро барои худ сабт хоҳанд кард ва онҳоро дар мубодила истифода хоҳанд кард - барои назорат кардани ин лаҳза, мо дар ҳама коммутаторҳо / олтсҳо / пойгоҳҳо dhcp-snooping + source-guard + inspection arp насб кардем. Агар муштарӣ dhpc надошта бошад, аммо статикӣ - acces-list дар порт.

Чаро ин ҳама анҷом дода шуд? Барои нест кардани трафики номатлуб. Ҳоло ҳар як коммутатор vlan-и худро дорад ва номаълум-уникаст дигар даҳшатнок нест, зеро он танҳо ба як порт рафтан лозим аст, на ба ҳама... Хуб, таъсири тараф конфигуратсияи стандартии таҷҳизот, самаранокии бештар дар тақсимоти фазои суроғаҳо мебошад.

Чӣ тавр танзим кардани lisg як мавзӯи алоҳида аст. Истинодҳо ба китобхонаҳо замима карда мешаванд. Шояд гуфтаҳои дар боло зикршуда ба касе дар расидан ба ҳадафҳои худ кӯмак кунанд. Дар шабакаи мо версияи 6 ҳанӯз амалӣ карда намешавад - аммо мушкилот пеш меояд - нақшаи аз нав навиштани lisg барои версияи 6 вуҷуд дорад ва барои ислоҳ кардани барномае, ки хатсайрҳоро илова мекунад, лозим аст.

Linux ISG
DB2DHCP
Либтинҳо

Манбаъ: will.com

Илова Эзоҳ