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);
|
||||
}
|
||||
|
||||
void NATItem::increaseTimeout(int timeout)
|
||||
{
|
||||
this->setTimeout(this->getTimeout() + timeout);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ public:
|
||||
NATItem();
|
||||
|
||||
bool isFree();
|
||||
void increaseTimeout(int timeout);
|
||||
|
||||
const string& getIp() const;
|
||||
void setIp(const string& ip);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* NATItem.cpp
|
||||
*
|
||||
* Created on: 10-01-2017
|
||||
* Created on: 11-01-2017
|
||||
* Author: Piotr Dergun
|
||||
*/
|
||||
|
||||
@@ -121,6 +121,9 @@ void NATRouter::sNAT(Packet *packet)
|
||||
int port;
|
||||
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)
|
||||
{
|
||||
//TESTOWO
|
||||
@@ -145,8 +148,8 @@ void NATRouter::sNAT(Packet *packet)
|
||||
/*
|
||||
* funkcja DNAT ma za zadanie znalezc w tablicy NAT
|
||||
* port i adres IP wezla na ktory ma wrocic odpowiedz
|
||||
* z sieci Internet (z zewnatrz), a takze zwolnic ten
|
||||
* port
|
||||
* z sieci Internet (z zewnatrz), a takze przedluzyc
|
||||
* czas zycia tego portu
|
||||
*/
|
||||
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->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
|
||||
|
||||
@@ -171,6 +175,19 @@ string NATRouter::getWanNetwork()
|
||||
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()
|
||||
{
|
||||
return this->netWanConf.gatewayIp;
|
||||
|
||||
@@ -18,6 +18,7 @@ class NATRouter : public Node
|
||||
NetConf netWanConf; // konfiguracja sieciowa na zewnątrz
|
||||
void initalizeNatTable();
|
||||
int getFreePort();
|
||||
int getAllocatedPort(string srcIp, int srcPort);
|
||||
void sNAT(Packet *packet);
|
||||
void dNAT(Packet *packet);
|
||||
void setWanNetwork();
|
||||
|
||||
3
Node.cpp
3
Node.cpp
@@ -155,10 +155,13 @@ bool Node::send(Packet packet, bool isRouter)
|
||||
if (!isRouter)
|
||||
{
|
||||
packet.setSrcIp(this->getIp());
|
||||
if (packet.getSrcPort() == 0)
|
||||
{
|
||||
// ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny)
|
||||
srand(time(NULL));
|
||||
packet.setSrcPort(rand() % 32768 + 28233);
|
||||
}
|
||||
}
|
||||
node->putPacket(packet);
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user