ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΈΠΌΠ° ΠΌΡΠ΅ΠΆΠ° ΠΎΡ 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 ΠΈ ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Ρ ΠΌΠ°ΡΡΡΡΡΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com