NAT - DNAT podbija timeout (zamiast usuwac z tablicy NAT), SNAT szuka czy port juz byl uprzednio zaalokowany

This commit is contained in:
2017-01-11 21:50:12 +01:00
parent d176521abe
commit e45685b4f1
5 changed files with 40 additions and 13 deletions

View File

@@ -57,3 +57,8 @@ void NATItem::free()
{
this->setTimeout(0);
}
void NATItem::increaseTimeout(int timeout)
{
this->setTimeout(this->getTimeout() + timeout);
}

View File

@@ -20,6 +20,7 @@ public:
NATItem();
bool isFree();
void increaseTimeout(int timeout);
const string& getIp() const;
void setIp(const string& ip);

View File

@@ -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;

View File

@@ -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();

View File

@@ -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;