ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅. ΠΠΌΠ° ΠΌΡΠ΅ΠΆΠ° ΠΎΡ 5000 ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ. ΠΠ΅ΠΎΡΠ΄Π°Π²Π½Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π½Π΅ΠΏΡΠΈΡΡΠ΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ β Π² ΡΠ΅Π½ΡΡΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈΠΌΠ°ΠΌΠ΅ Brocade RX8, ΠΊΠΎΠΉΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ unknown-unicast ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° VLAN β ΠΎΡΡΠ°ΡΡΠΈ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΠ ΠΈΠΌΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ VLAN Π·Π° Π±Π΅Π»ΠΈ Π°Π΄ΡΠ΅ΡΠΈ ΠΈ Ρ.Π½., ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°. ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅ ΡΠΈ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΠ΅ ΡΡΠΈ ΠΎΡ Π±ΠΎΡΠ΄Π΅ΡΠ°, ΠΈ ΡΠΎΠ·ΠΈ ΠΏΠΎΡΠΎΠΊ ΡΡΡΠ³Π²Π° ΠΊΡΠΌ ΡΠ°Π΄ΠΈΠΎ Π»ΠΈΠ½ΠΊΠ° Π½Π° Π½ΡΠΊΠΎΠ΅ (ΠΈΠ»ΠΈ Π½Π° Π²ΡΠΈΡΠΊΠΈΡΠ΅) ΡΠ΅Π»ΠΎ β ΠΊΠ°Π½Π°Π»ΡΡ Π΅ Π·Π°Π΅Ρ β ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ ΡΠ° Π½Π΅Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ β ΡΡΠ³Π°β¦
ΠΠ°Π΄Π°ΡΠ°ΡΠ° Π΅ β Π΄Π° ΠΏΡΠ΅Π²ΡΡΠ½Π΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ. ΠΠΈΡΠ»Π΅Ρ Π² ΠΏΠΎΡΠΎΠΊΠ° q-in-q Ρ ΠΏΡΠ»Π΅Π½ ΠΊΠ»ΠΈΠ΅Π½Ρ-VLAN, Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΊΠ°ΡΠΎ P3310 ΡΠΏΠΈΡΠ°Ρ Π΄Π° ΠΏΡΠΎΠΏΡΡΠΊΠ°Ρ DHCP ΠΏΡΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° dot1q, ΠΎΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΡΠ°Π²ΡΡ ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎ qinq ΠΈ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΠΈ ΠΊΠ°ΠΌΡΠ½ΠΈ Π² ΡΠΎΠ·ΠΈ ΡΠΌΠΈΡΡΠ». ΠΠ°ΠΊΠ²ΠΎ Π΅ ip-unnumbered ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ? ΠΠΊΡΠ°ΡΡΠ΅ β Π°Π΄ΡΠ΅Ρ Π½Π° ΡΠ»ΡΠ·Π° + ΠΌΠ°ΡΡΡΡΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠ° Π½Π°ΡΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π½ΠΈ ΡΡΡΠ±Π²Π°: Π΄Π° ΡΠ΅ΠΆΠ΅ΠΌ ΡΠ΅ΠΉΠΏΠ΅ΡΠ°, Π΄Π° ΡΠ°Π·Π΄Π°Π²Π°ΠΌΠ΅ Π°Π΄ΡΠ΅ΡΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅, Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈ Π·Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ ΡΡΠ΅Π· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ. Π‘ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ? Π¨Π΅ΠΉΠΏΠ΅Ρ β 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 ΡΠΈΠ³Π½Π°Π» ΠΈ ΡΠ΅ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅. ΠΠ°ΡΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π΅ΡΠ»ΠΈΠ½ΠΊ? ΠΡΠΎΡΡΠΎ ΠΌΡΡΠ·Π΅Π», Π° ΠΈ Π»ΠΈΠ½ΡΠΊΡ Π΅ ΡΠΊΡΠΈΠΏΡ Π½Π° ΡΠΊΡΠΈΠΏΡ, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄. ΠΠΌΠΈ ΠΌΠ°ΡΡΡΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ»Π΅Π΄Π²Π°? Π‘Π»Π΅Π΄Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ Π½Π° Π±ΠΎΡΠ΄Π΅Ρ ΠΌΠ°ΡΡΡΡΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΡΡΡΠ²ΡΡ β ΡΡΠΊ, ΠΏΠΎΡΠ°Π΄ΠΈ ΡΡΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΏΠΎΠ΅Ρ ΠΌΠ΅ ΠΏΠΎ ΠΏΡΡΡ Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎΡΠΎ ΡΡΠΏΡΠΎΡΠΈΠ²Π»Π΅Π½ΠΈΠ΅ β ΠΏΠΎΡΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° Π½Π° BGP.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ bgphostname *******
password *******
log file /var/log/bgp.log
!
# Π½ΠΎΠΌΠ΅Ρ Π°Ρ-ΠΊΠΈ, Π°Π΄ΡΠ΅ΡΠ° ΠΈ ΡΠ΅ΡΠΈ Π²ΡΠ΄ΡΠΌΠ°Π½Ρ
router bgp 12345
bgp router-id 1.2.3.4
redistribute connected
redistribute static
neighbor 1.2.3.1 remote-as 12345
neighbor 1.2.3.1 next-hop-self
neighbor 1.2.3.1 route-map none in
neighbor 1.2.3.1 route-map export out
!
access-list export permit 1.2.3.0/24
!
route-map export permit 10
match ip address export
!
route-map export deny 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
down.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
ΠΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ dhcprelay Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° β ΠΌΡ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π°Π΄ΡΠ΅Ρ. ΠΠ°ΡΠΎΠ²Π° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅, Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ°Π»ΡΠΈΠ²ΠΈ Π°Π΄ΡΠ΅ΡΠΈ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 10.255.255.1/32, 10.255.255.2/32 ΠΈ Ρ.Π½. ΠΠ°ΠΊ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΡΠ΅Π»Π΅Ρ Π½Π΅ Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΎΠ±ΡΡΠ½ΡΠ²Π°ΠΌ β ΡΠ°ΠΌ Π΅ Π²ΡΠΈΡΠΊΠΎ ΠΏΡΠΎΡΡΠΎ.
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ°ΠΌΠ΅. ΠΠ΅ΠΊΡΠΏ Π½Π° ΡΠ»ΡΠ·ΠΎΠ²Π΅ΡΠ΅, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΌΠ°ΡΡΡΡΡΠΈΡΠ΅, DHCP. Π’ΠΎΠ²Π° Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡΡ Π½Π°Π±ΠΎΡ β Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ lisg ΠΈ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΠΈ ΡΠ΅ΠΉΠΏΠΈΠ½Π³. ΠΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π΄ΡΠ»Π³ΠΎ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎ? ΠΠ΅ Π±ΠΈ Π»ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ accel-pppd ΠΈ Π²ΡΠΎΠ±ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ pppoe? ΠΠ΅, Π½Π΅ Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ β Ρ ΠΎΡΠ°ΡΠ° ΡΡΡΠ΄Π½ΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π²ΠΊΠ°ΡΠ°Ρ ΠΏΠ°ΡΠΊΠΎΡΠ΄ Π² ΡΡΡΠ΅ΡΠ°, Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° pppoe. accel-ppp Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½, Π½ΠΎ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ β ΠΌΠ½ΠΎΠ³ΠΎ Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΊΠΎΠ΄Π° β ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΠ΅, ΠΈΠ·ΡΡΠ·Π²Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, ΠΈ Π½Π°ΠΉ-Π»ΠΎΡΠΎΡΠΎ Π΅, ΡΠ΅ Π°ΠΊΠΎ ΡΠ΅ ΡΡΡΡΠΈ β Π½Π° Ρ ΠΎΡΠ°ΡΠ° ΠΈΠΌ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π·Π°ΡΠ΅Π΄ΡΡ Π²ΡΠΈΡΠΊΠΎ β ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡΠ΅ ΡΠ΅ΡΠ²Π΅Π½ΠΈ β Π²ΡΠΎΠ±ΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ. ΠΠ°ΠΊΠ²ΠΎ Π΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ucarp Π²ΠΌΠ΅ΡΡΠΎ keepalived? ΠΠ°, Π²ΡΠΈΡΠΊΠΎ β ΠΈΠΌΠ° 100 ΡΠ»ΡΠ·Π°, keepalived ΠΈ Π΅Π΄Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° β Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Π²ΡΠΈΡΠΊΠΎ. Π‘ ucarp Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Π΅Π΄ΠΈΠ½ ΡΠ»ΡΠ·. Π©ΠΎ ΡΠ΅ ΠΎΡΠ½Π°ΡΡ Π΄ΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°, Π°ΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ ΡΠ°Π»ΡΠΈΠ²ΠΈ Π°Π΄ΡΠ΅ΡΠΈ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π½Π° ΡΠ°ΡΠΈΠΊΠ° β Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠΈΡΠΎΠ²Π΅/ΠΎΠ»ΡΠΈ/Π±Π°Π·ΠΈ Π½Π°ΡΡΡΠΎΠΉΠ²Π°ΠΌΠ΅ dhcp-snooping + source-guard + arp inspection. ΠΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½ΡΠΌΠ° dhcp Π° ΡΡΠ°ΡΠΈΠΊ β acces-list Π½Π° ΠΏΠΎΡΡΠ°.
ΠΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ? ΠΠ° ΡΠ½ΠΈΡΠΎΠΆΠ°Π²Π°Π½Π΅ Π½Π° Π½Π΅ΠΆΠ΅Π»Π°Π½ΠΈΡ ΡΡΠ°ΡΠΈΠΊ. Π‘Π΅Π³Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ²ΠΈΡ ΠΈΠΌΠ° ΡΠ²ΠΎΠΉ VLAN ΠΈ unknown-unicast Π²Π΅ΡΠ΅ Π½Π΅ Π΅ ΡΡΡΠ°ΡΠ΅Π½, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΡΠ°ΠΌΠΎ ΠΏΡΠ΅Π· Π΅Π΄ΠΈΠ½ ΠΏΠΎΡΡ, Π° Π½Π΅ ΠΏΡΠ΅Π· Π²ΡΠΈΡΠΊΠΈ... Π ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈΡΠ΅ Π΅ΡΠ΅ΠΊΡΠΈ - ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°Π½ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» Π½Π° ΠΎΠ±ΠΎΡΡΠ΄Π²Π°Π½Π΅ΡΠΎ, ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ ΠΏΡΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π°Π΄ΡΠ΅ΡΠ½ΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ.
ΠΠ°ΠΊ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ lisg - ΡΠΎΠ²Π° Π΅ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΠ΅ΠΌΠ°. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ ΡΠ° Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ ΠΊΡΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅. ΠΠΎΠΆΠ΅ Π±ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΡΡ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠ³ΠΎ Π² ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π·Π°Π΄Π°ΡΠΈΡΠ΅ ΡΠΈ. ΠΠ΅ΡΡΠΈΡ 6 Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π° Π² Π½Π°ΡΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ° - Π½ΠΎ ΡΠ°ΠΌ ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΠ΅ - ΠΏΠ»Π°Π½ΠΈΡΠ° ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ΅ lisg Π·Π° 6 Π²Π΅ΡΡΠΈΡ ΠΈ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Ρ ΠΌΠ°ΡΡΡΡΡΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
