ΠΠ΄ΡΠ°Π²ΠΎ. ΠΠ²Π° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° ΠΌΡΠ΅ΠΆΠ° ΠΎΠ΄ 5 ΠΈΠ»ΡΠ°Π΄ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ. ΠΠ΅ΠΎΠ΄Π°ΠΌΠ½Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ Π½Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΡΠΈΡΠ°ΡΠ΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ - Π²ΠΎ ΡΠ΅Π½ΡΠ°ΡΠΎΡ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈΠΌΠ°ΠΌΠ΅ Brocade RX8 ΠΈ ΠΏΠΎΡΠ½Π° Π΄Π° ΠΈΡΠΏΡΠ°ΡΠ° ΠΌΠ½ΠΎΠ³Ρ Π½Π΅ΠΏΠΎΠ·Π½Π°ΡΠΈ-ΡΠ½ΠΈΠΊΠ°ΡΡΠΈΡΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π΅ ΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° Π½Π° vlans - ΠΎΠ²Π° Π΄Π΅Π»ΡΠΌΠ½ΠΎ Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΠ ΠΈΠΌΠ° ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½ΠΈ Π²Π»Π°Π½ Π·Π° Π±Π΅Π»ΠΈ Π°Π΄ΡΠ΅ΡΠΈ ΠΈΡΠ½. ΠΈ ΡΠΈΠ΅ ΡΠ΅ ΡΠ°Π·Π²Π»Π΅ΡΠ΅Π½ΠΈ Π²ΠΎ ΡΠΈΡΠ΅ ΠΏΡΠ°Π²ΡΠΈ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°. ΠΠ° ΡΠ΅Π³Π° Π·Π°ΠΌΠΈΡΠ»Π΅ΡΠ΅ Π΄ΠΎΡΠ΄ΠΎΠ²Π΅Π½ ΠΏΡΠΎΡΠΎΠΊ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΊΠΎΡ Π½Π΅ ΡΡΡΠ΄ΠΈΡΠ° ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΡΡΡΠ΄Π΅Π½Ρ ΠΈ ΠΎΠ²ΠΎΡ ΡΠ΅ΠΊ Π»Π΅ΡΠ° ΠΊΠΎΠ½ ΡΠ°Π΄ΠΈΠΎ Π²ΡΡΠΊΠ° Π΄ΠΎ Π½Π΅ΠΊΠΎΠ΅ (ΠΈΠ»ΠΈ ΡΠΈΡΠ΅) ΡΠ΅Π»ΠΎ - ΠΊΠ°Π½Π°Π»ΠΎΡ Π΅ Π·Π°ΡΠ½Π°Ρ - ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ ΡΠ΅ Π»ΡΡΠΈ - ΡΠ°Π³Π°...
Π¦Π΅Π»ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠΈ Π±ΡΠ±Π°ΡΠΊΠ°ΡΠ° Π²ΠΎ ΡΡΠ½ΠΊΡΠΈΡΠ°. Π Π°Π·ΠΌΠΈΡΠ»ΡΠ²Π°Π² Π²ΠΎ ΠΏΡΠ°Π²Π΅Ρ q-in-q ΡΠΎ ΠΏΠΎΠ»Π½ΠΎΠΏΡΠ°Π²Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ vlan, Π½ΠΎ ΡΠ΅ΠΊΠ°ΠΊΠΎΠ² Ρ Π°ΡΠ΄Π²Π΅Ρ ΠΊΠ°ΠΊΠΎ P3310, ΠΊΠΎΠ³Π° Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ dot1q, ΠΏΡΠ΅ΡΡΠ°Π½ΡΠ²Π° Π΄Π° Π³ΠΎ ΠΏΡΠΎΠΏΡΡΡΠ° DHCP, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π΅ Π·Π½Π°Π°Ρ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎ qinq ΠΈ ΠΌΠ½ΠΎΠ³Ρ ΡΡΠ°ΠΏΠΈΡΠΈ ΠΎΠ΄ ΡΠΎΡ Π²ΠΈΠ΄. Π¨ΡΠΎ Π΅ ip-Π½Π΅ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π° ΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°? ΠΠ½ΠΎΠ³Ρ ΠΊΡΠ°ΡΠΊΠΎ: Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΏΠΎΡΡΠ°ΡΠ° + ΡΡΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ. ΠΠ° Π½Π°ΡΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π΅: Π΄Π° Π³ΠΎ ΠΈΡΠ΅ΡΠ΅ΠΌΠ΅ ΠΎΠ±Π»ΠΈΠΊΡΠ²Π°ΡΠΎΡ, Π΄Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°ΠΌΠ΅ Π°Π΄ΡΠ΅ΡΠΈ Π΄ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅, Π΄Π° Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΡΡΠΈ Π΄ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ ΠΏΡΠ΅ΠΊΡ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΈ. ΠΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ΅ΡΠΎ ΠΎΠ²Π°? Shaper - lisg, dhcp - db2dhcp Π½Π° Π΄Π²Π° Π½Π΅Π·Π°Π²ΠΈΡΠ½ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ, dhcprelay ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΈΡΠ΅ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ, ucarp ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΈΡΠ΅ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ - Π·Π° ΡΠ΅Π·Π΅ΡΠ²Π½Π° ΠΊΠΎΠΏΠΈΡΠ°. ΠΠΎ, ΠΊΠ°ΠΊΠΎ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈ? ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΡΓ¨ ΠΎΠ΄Π½Π°ΠΏΡΠ΅Π΄ ΡΠΎ Π³ΠΎΠ»Π΅ΠΌΠ° ΡΠΊΡΠΈΠΏΡΠ° - Π½ΠΎ ΡΠΎΠ° Π½Π΅ Π΅ ΡΠΎΡΠ½ΠΎ. Π’Π°ΠΊΠ° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΡΠ°ΠΌΠΎΠ½Π°ΠΏΠΈΡΠ°Π½Π° ΠΏΠ°ΡΠ΅ΡΠΈΡΠ°.
ΠΠΎ ΡΠ΅ΠΌΠ΅Π»Π½ΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ, Π½Π°ΡΠ΄ΠΎΠ² ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ Π·Π° C++, ΠΊΠΎΡΠ° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° ΡΠ±Π°Π²ΠΎ Π΄Π° Π³ΠΎ ΡΠΌΡΠΊΠ°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°ΡΠΎΡ. ΠΠ»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΡΠΎ Π΄ΠΎΠ΄Π°Π²Π° ΠΌΠ°ΡΡΡΡΡΠΈ Π΅ ΡΠ»Π΅Π΄Π΅Π½ - ΡΠ»ΡΡΠ°ΠΌΠ΅ Π±Π°ΡΠ°ΡΠ° Π·Π° arp Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ, Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ lo Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ ΡΡΠΎ ΡΠ΅ Π±Π°ΡΠ°, ΡΠΎΠ³Π°Ρ Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΡΡΠ° ΠΏΡΠ΅ΠΊΡ ΠΎΠ²ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ ΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΡΠ°ΡΠΈΡΠ΅Π½ arp ΡΠ½ΠΈΠΌΠ°Ρ Π½Π° ΠΎΠ²Π°Π° ΠΈΠΏ - ΠΎΠΏΡΡΠΎ, Π½Π΅ΠΊΠΎΠ»ΠΊΡ copy-paste, ΠΌΠ°Π»ΠΊΡ ΠΏΡΠΈΠ΄Π°Π²ΠΊΠ° ΠΈ Π³ΠΎΡΠΎΠ²ΠΎ
ΠΠ·Π²ΠΎΡΠΈ Π½Π° βΡΡΡΠ΅ΡΠΎΡβ
#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 ΡΡΡΠ΅Ρ-ΠΈΠ΄ 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
ΠΠ΄ΠΈΠΌΠ΅ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ - ΡΠΊΠ°ΡΠΏ. ΠΠΈΠ΅ ΡΠ°ΠΌΠΈΡΠ΅ Π³ΠΈ ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ ΡΠΊΡΠΈΠΏΡΠΈΡΠ΅ Π·Π° Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ²Π° ΡΡΠ΄ΠΎ.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π²ΠΎΠ΄Π΅ΡΠ΅ Π½Π° Π΅Π΄Π΅Π½ Π΄Π΅ΠΌΠΎΠ½
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"
Π³ΠΎΡΠ΅.Ρ
#!/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 Π΅ ΠΊΡΠ» ΡΠ°Π±ΠΎΡΠ° - Π½ΠΎ Π½Π΅ Π½ΠΈ ΡΡΠΏΠ΅Π° - ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρ Π³ΡΠ΅ΡΠΊΠΈ Π²ΠΎ ΠΊΠΎΠ΄ΠΎΡ - ΡΠ΅ ΡΠΎΠ½ΠΈ, ΠΊΡΠΈΠ²ΠΎ ΡΠ΅ΡΠ΅, Π° Π½Π°ΡΡΠ°ΠΆΠ½ΠΎ Π΅ ΡΡΠΎ Π°ΠΊΠΎ ΡΠ΅ ΠΎΡΠ²Π΅ΡΠ»ΠΈ - ΡΠΎΠ³Π°Ρ Π»ΡΡΠ΅ΡΠΎ ΡΡΠ΅Π±Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° Π²ΡΠΈΡΠ°Π°Ρ ΡΓ¨ - ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡΠ΅ ΡΠ΅ ΡΡΠ²Π΅Π½ΠΈ - Π²ΠΎΠΎΠΏΡΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅. ΠΠΎΡΠ° Π΅ ΠΏΡΠ΅Π΄Π½ΠΎΡΡΠ° Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΡΠΊΠ°ΡΠΏ Π½Π°ΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΠΆΠΈ? ΠΠ°, Π²ΠΎ ΡΓ¨ - ΠΈΠΌΠ° 100 ΠΏΠΎΡΡΠΈ, Π·Π°Π΄ΡΠΆΠ°Π½ΠΈ ΠΈ Π΅Π΄Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° - ΡΓ¨ Π½Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°. 1 ΠΏΠΎΡΡΠ°Π» Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ ucarp. ΠΠ° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° Π²Π΅Π»Π°Ρ Π΄Π΅ΠΊΠ° Π»Π΅Π²ΠΈΡΠ΅ ΡΠ°ΠΌΠΈ ΡΠ΅ ΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π°Ρ Π°Π΄ΡΠ΅ΡΠΈ ΠΈ ΡΠ΅ Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π½Π° share - Π·Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΎΠ²ΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ dhcp-snooping + source-guard + arp inspection Π½Π° ΡΠΈΡΠ΅ ΠΏΡΠ΅ΠΊΠΈΠ½ΡΠ²Π°ΡΠΈ/ΠΎΠ»ΡΠΈ/Π±Π°Π·ΠΈ. ΠΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ Π½Π΅ΠΌΠ° dhpc ΡΡΠΊΡ ΡΡΠ°ΡΠΈΡΠ΅Π½ - ΠΏΡΠΈΡΡΠ°ΠΏΠ΅Π½ ΡΠΏΠΈΡΠΎΠΊ Π½Π° ΠΏΠΎΡΡΠ°ΡΠ°.
ΠΠΎΡΡΠΎ ΡΠ΅ΡΠΎ ΠΎΠ²Π° Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ? ΠΠ° ΡΠ΅ ββΡΠ½ΠΈΡΡΠΈ Π½Π΅ΡΠ°ΠΊΠ°Π½ΠΈΠΎΡ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ. Π‘Π΅Π³Π° ΡΠ΅ΠΊΠΎΡ ΠΏΡΠ΅ΠΊΠΈΠ½ΡΠ²Π°Ρ ΠΈΠΌΠ° ΡΠ²ΠΎΡ vlan ΠΈ Π½Π΅ΠΏΠΎΠ·Π½Π°ΡΠΎΡΠΎ-ΡΠ½ΠΈΠΊΠ°ΡΡ Π²Π΅ΡΠ΅ Π½Π΅ Π΅ ΡΡΡΠ°ΡΠ½ΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΠΎΠ΄ΠΈ ΡΠ°ΠΌΠΎ Π½Π° Π΅Π΄Π½Π° ΠΏΠΎΡΡΠ°, Π° Π½Π΅ Π½Π° ΡΠΈΡΠ΅... ΠΠ°, Π½Π΅ΡΠ°ΠΊΠ°Π½ΠΈΡΠ΅ Π΅ΡΠ΅ΠΊΡΠΈ ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΠ΄ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° ΠΎΠΏΡΠ΅ΠΌΠ°ΡΠ°, ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠ° Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎΡΡ Π²ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π±Π°ΡΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠ½ΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ.
ΠΠ°ΠΊΠΎ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ sg Π΅ ΠΏΠΎΡΠ΅Π±Π½Π° ΡΠ΅ΠΌΠ°. ΠΠΈΠ½ΠΊΠΎΠ²ΠΈ Π΄ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΡΠ΅Π½ΠΈ. ΠΠΎΠΆΠ΅Π±ΠΈ Π³ΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡΠΎ ΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π½Π΅ΠΊΠΎΠΌΡ Π΄Π° Π³ΠΈ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ΅Π»ΠΈ. ΠΠ΅ΡΠ·ΠΈΡΠ°ΡΠ° 6 ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ° - Π½ΠΎ ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ - ΠΈΠΌΠ° ΠΏΠ»Π°Π½ΠΎΠ²ΠΈ Π·Π° ΠΏΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΏΠΈΡΠΎΠΊΠΎΡ Π·Π° Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° 6 ΠΈ ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΡΠΎ Π΄ΠΎΠ΄Π°Π²Π° ΡΡΡΠΈ.
ΠΠ·Π²ΠΎΡ: www.habr.com