Tambajotra IPeE mahazaka lesoka mampiasa fitaovana namboarina

Salama. Midika izany fa misy tambajotra misy mpanjifa 5k. Vao haingana no niseho ny fotoana tsy dia mahafinaritra loatra - eo afovoan'ny tambajotra dia manana Brocade RX8 izahay ary nanomboka nandefa fonosana tsy fantatra-unicast marobe, satria ny tambajotra dia mizara ho vlans - tsy olana amin'ny ampahany izany, FA misy vlan manokana ho an'ny adiresy fotsy, sns. ary mivelatra amin'ny lafiny rehetra amin'ny tambajotra izy ireo. Koa alaivo sary an-tsaina ny fikorianan'ny fidirana mankany amin'ny adiresin'ny mpanjifa iray izay tsy mianatra amin'ny maha-mpianatra sisin-tany ary izany dia manidina mankany amin'ny rohy radio mankany amin'ny tanΓ na sasany (na ny rehetra) - tsentsina ny fantsona - tezitra ny mpanjifa - alahelo ...

Ny tanjona dia ny hanova ny bug ho endri-javatra. Nieritreritra ny lalan'ny q-in-q miaraka amin'ny vlan mpanjifa feno aho, fa ny fitaovana rehetra toy ny P3310, rehefa alefa ny dot1q, dia mijanona ny mamela ny DHCP, tsy hain'izy ireo koa ny mifidy qinq sy ny maro. fandrika toy izany. Inona no atao hoe ip-unnambered ary ahoana no fiasan'izy io? Tena fohy: adiresy vavahady + lalana amin'ny interface. Ho an'ny asantsika dia mila: manapaka ny shaper, mizara adiresy amin'ny mpanjifa, manampy lalana mankany amin'ny mpanjifa amin'ny alΓ lan'ny interface sasany. Ahoana no hanaovana izany rehetra izany? Shaper - lisg, dhcp - db2dhcp amin'ny mpizara tsy miankina roa, ny dhcprelay dia mandeha amin'ny mpizara fidirana, ny ucarp koa dia mandeha amin'ny mpizara fidirana - ho an'ny backup. Ahoana anefa no hanampiana lalana? Azonao atao ny manampy ny zava-drehetra mialoha miaraka amin'ny script lehibe - fa tsy marina izany. Noho izany dia hanao tehina sora-tena isika.

Taorian'ny fikarohana lalina tao amin'ny Internet dia nahita tranomboky avo lenta mahafinaritra ho an'ny C ++ aho, izay ahafahanao manindrona ny fifamoivoizana. Ny algorithm amin'ny programa manampy lalana dia toy izao manaraka izao - mihaino ny fangatahana arp eo amin'ny interface isika, raha manana adiresy eo amin'ny interface lo eo amin'ny lohamilina nangatahana, dia manampy lalana amin'ny alΓ lan'ity interface ity izahay ary manampy arp static. raketo amin'ity ip ity - amin'ny ankapobeny, copie-paste vitsivitsy, adjectif kely dia vita ianao

Loharanon'ny 'router'

#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 fametrahana libtins

#!/bin/bash

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

Didy hananganana ny binary

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

Ahoana no hanombohana azy?


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

Eny - hanorina indray ny latabatra mifototra amin'ny famantarana HUP. Nahoana ianao no tsy nampiasa netlink? Ny hakamoana fotsiny ary ny Linux dia script amin'ny script - noho izany dia tsara ny zava-drehetra. Eny, lalana ny lalana, inona no manaraka? Manaraka, mila mandefa ny lalana izay ao amin'ity mpizara ity mankany amin'ny sisin-tany isika - eto, noho ny fitaovana efa lany andro, dia nandeha tamin'ny lalan'ny fanoherana faran'izay kely indrindra izahay - nanendry ity asa ity ho an'ny BGP.

bgp configanaran'ny mpampiantrano *****
tenimiafina *******
rakitra log /var/log/bgp.log
!
# AS isa, adiresy ary tambajotra dia foronina
Ny router bgp 12345
bgp router-id 1.2.3.4
mizara indray mifandray
redistribute static
mpifanolobodirindrina 1.2.3.1 lavitra-toy ny 12345
mpifanolobodirindrina 1.2.3.1 manaraka-hop-tena
mpifanolobodirindrina 1.2.3.1 sarintany lalana tsy misy ao
mpifanolobodirindrina 1.2.3.1 fanondranana sarintany lalana
!
fahazoan-dΓ lana fanondranana lisitra fidirana 1.2.3.0/24
!
fahazoan-dΓ lana fanondranana sarintany 10
mifanandrify amin'ny fanondranana adiresy ip
!
mandΓ  ny fanondranana sari-tany 20

Andeha isika hanohy. Mba hahafahan'ny mpizara mamaly ny fangatahana arp dia tsy maintsy alefanao ny proxy arp.


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

Andao handroso - ucarp. Izahay ihany no manoratra ny script fanombohana ho an'ity fahagagana ity.

Ohatra amin'ny fampandehanana daemon iray


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

midina.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

Mba hiasa amin'ny interface iray ny dhcprelay dia mila adiresy. Noho izany, amin'ny interface ampiasainay dia hanampy adiresy ankavia - ohatra 10.255.255.1/32, 10.255.255.2/32, sns. Tsy hilaza aminao ny fomba hanamboarana ny fampitana aho - tsotra ny zava-drehetra.

Inona Γ ry no ananantsika? Backup of gateways, auto-configuration of route, dhcp. Ity no set farany ambany indrindra - ny lisg dia mametaka ny zava-drehetra manodidina azy ary efa manana shaper isika. Nahoana no lava sy misavoritaka ny zava-drehetra? Tsy mora kokoa ve ny maka accel-pppd sy mampiasa pppoe tanteraka? Tsia, tsy mora kokoa izany - zara raha afaka mampiditra patchcord amin'ny router ny olona, ​​tsy lazaina intsony ny pppoe. Ny accel-ppp dia zavatra mahafinaritra - saingy tsy nety taminay izany - be dia be ny lesoka ao amin'ny kaody - mirodana, manapaka mitongilana, ary ny tena mampalahelo dia raha miramirana ilay izy - dia mila mamerina ny olona. ny zava-drehetra - mena ny telefaona - tsy niasa mihitsy. Inona no tombony amin'ny fampiasana ucarp fa tsy keepalived? Eny, amin'ny zava-drehetra - misy vavahady 100, keepalived ary fahadisoana iray ao amin'ny config - tsy mandeha ny zava-drehetra. Ny vavahady 1 dia tsy mandeha amin'ny ucarp. Mikasika ny fiarovana dia lazain'izy ireo fa ny havia dia hanoratra adiresy ho an'ny tenany ary hampiasa azy ireo amin'ny fizarana - mba hifehezana an'io fotoana io dia mametraka ny dhcp-snooping + source-guard + arp inspection amin'ny switch/olts/bases rehetra. Raha tsy manana dhpc ny mpanjifa fa static - acces-list amin'ny seranana.

Nahoana no natao izany rehetra izany? Handrava ny fifamoivoizana tsy ilaina. Ankehitriny ny switch tsirairay dia manana ny vlan-ny ary tsy mampatahotra-unicast intsony, satria mila mankany amin'ny seranana iray ihany fa tsy amin'ny rehetra ... Eny ary, ny voka-dratsiny dia config fitaovana manara-penitra, fahombiazana bebe kokoa amin'ny fanomezana toerana ny adiresy.

Ny fomba fanamboarana lisg dia lohahevitra misaraka. Misy rohy mankany amin'ny tranomboky. Angamba ireo voalaza etsy ambony ireo dia hanampy olona iray hanatratra ny tanjony. Ny version 6 dia tsy mbola ampiharina amin'ny tambazotrantsika - fa hisy olana - misy ny drafitra hamerenana ny lisg ho an'ny version 6, ary ilaina ny manitsy ny programa izay manampy lalana.

Linux ISG
DB2DHCP
Libtins

Source: www.habr.com

Add a comment