NAT - DNAT podbija timeout (zamiast usuwac z tablicy NAT), SNAT szuka czy port juz byl uprzednio zaalokowany
This commit is contained in:
@@ -57,3 +57,8 @@ void NATItem::free()
|
|||||||
{
|
{
|
||||||
this->setTimeout(0);
|
this->setTimeout(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NATItem::increaseTimeout(int timeout)
|
||||||
|
{
|
||||||
|
this->setTimeout(this->getTimeout() + timeout);
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public:
|
|||||||
NATItem();
|
NATItem();
|
||||||
|
|
||||||
bool isFree();
|
bool isFree();
|
||||||
|
void increaseTimeout(int timeout);
|
||||||
|
|
||||||
const string& getIp() const;
|
const string& getIp() const;
|
||||||
void setIp(const string& ip);
|
void setIp(const string& ip);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* NATItem.cpp
|
* NATItem.cpp
|
||||||
*
|
*
|
||||||
* Created on: 10-01-2017
|
* Created on: 11-01-2017
|
||||||
* Author: Piotr Dergun
|
* Author: Piotr Dergun
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -121,6 +121,9 @@ void NATRouter::sNAT(Packet *packet)
|
|||||||
int port;
|
int port;
|
||||||
NATItem *natItem;
|
NATItem *natItem;
|
||||||
|
|
||||||
|
// mozliwe, ze juz port zostal zaalokowany, to trzeba wykorzystac
|
||||||
|
port = this->getAllocatedPort(packet->getSrcIp(), packet->getSrcPort());
|
||||||
|
if (port == -1)
|
||||||
while ((port = this->getFreePort()) == -1)
|
while ((port = this->getFreePort()) == -1)
|
||||||
{
|
{
|
||||||
//TESTOWO
|
//TESTOWO
|
||||||
@@ -145,8 +148,8 @@ void NATRouter::sNAT(Packet *packet)
|
|||||||
/*
|
/*
|
||||||
* funkcja DNAT ma za zadanie znalezc w tablicy NAT
|
* funkcja DNAT ma za zadanie znalezc w tablicy NAT
|
||||||
* port i adres IP wezla na ktory ma wrocic odpowiedz
|
* port i adres IP wezla na ktory ma wrocic odpowiedz
|
||||||
* z sieci Internet (z zewnatrz), a takze zwolnic ten
|
* z sieci Internet (z zewnatrz), a takze przedluzyc
|
||||||
* port
|
* czas zycia tego portu
|
||||||
*/
|
*/
|
||||||
void NATRouter::dNAT(Packet* packet)
|
void NATRouter::dNAT(Packet* packet)
|
||||||
{
|
{
|
||||||
@@ -154,7 +157,8 @@ void NATRouter::dNAT(Packet* packet)
|
|||||||
|
|
||||||
packet->setDstIp(natItem->getIp()); // zamieniam IP lokalne na WAN'owe
|
packet->setDstIp(natItem->getIp()); // zamieniam IP lokalne na WAN'owe
|
||||||
packet->setDstPort(natItem->getPort()); // zamieniam port NAT na lokalny wezla
|
packet->setDstPort(natItem->getPort()); // zamieniam port NAT na lokalny wezla
|
||||||
natItem->free(); // zwalniam port w routerze
|
//natItem->free(); // zwalniam port w routerze
|
||||||
|
natItem->increaseTimeout(5); // podbijam o kolejne 5 sekund skoro transmisja trwa
|
||||||
|
|
||||||
this->send(*packet, true); // wysylam dalej
|
this->send(*packet, true); // wysylam dalej
|
||||||
|
|
||||||
@@ -171,6 +175,19 @@ string NATRouter::getWanNetwork()
|
|||||||
return this->netWanConf.network;
|
return this->netWanConf.network;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* funkcja szuka aktywnego zaalokowanego portu (aktywna
|
||||||
|
* transmisja) w tablicy NAT dla pary (srcIp:srcPort)
|
||||||
|
*/
|
||||||
|
int NATRouter::getAllocatedPort(string srcIp, int srcPort)
|
||||||
|
{
|
||||||
|
for (int i=1; i<65536; ++i)
|
||||||
|
if (this->natTable[i].getIp() == srcIp && this->natTable[i].getPort() == srcPort)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1; // nic nie znaleziono
|
||||||
|
}
|
||||||
|
|
||||||
string NATRouter::getWanGatewayIp()
|
string NATRouter::getWanGatewayIp()
|
||||||
{
|
{
|
||||||
return this->netWanConf.gatewayIp;
|
return this->netWanConf.gatewayIp;
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class NATRouter : public Node
|
|||||||
NetConf netWanConf; // konfiguracja sieciowa na zewnątrz
|
NetConf netWanConf; // konfiguracja sieciowa na zewnątrz
|
||||||
void initalizeNatTable();
|
void initalizeNatTable();
|
||||||
int getFreePort();
|
int getFreePort();
|
||||||
|
int getAllocatedPort(string srcIp, int srcPort);
|
||||||
void sNAT(Packet *packet);
|
void sNAT(Packet *packet);
|
||||||
void dNAT(Packet *packet);
|
void dNAT(Packet *packet);
|
||||||
void setWanNetwork();
|
void setWanNetwork();
|
||||||
|
|||||||
3
Node.cpp
3
Node.cpp
@@ -155,10 +155,13 @@ bool Node::send(Packet packet, bool isRouter)
|
|||||||
if (!isRouter)
|
if (!isRouter)
|
||||||
{
|
{
|
||||||
packet.setSrcIp(this->getIp());
|
packet.setSrcIp(this->getIp());
|
||||||
|
if (packet.getSrcPort() == 0)
|
||||||
|
{
|
||||||
// ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny)
|
// ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny)
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
packet.setSrcPort(rand() % 32768 + 28233);
|
packet.setSrcPort(rand() % 32768 + 28233);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
node->putPacket(packet);
|
node->putPacket(packet);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user