Browse Source

napisany DNAT + SNAT z opcja maskarady

master
Piotr Dergun 8 years ago
parent
commit
c3f50de1ad
7 changed files with 150 additions and 25 deletions
  1. +18
    -4
      NATItem.cpp
  2. +8
    -13
      NATItem.h
  3. +96
    -0
      NATRouter.cpp
  4. +17
    -1
      NATRouter.h
  5. +9
    -6
      Node.cpp
  6. +1
    -1
      Node.h
  7. +1
    -0
      common.h

+ 18
- 4
NATItem.cpp View File

@ -11,7 +11,7 @@ NATItem::NATItem()
{
this->ip = "0.0.0.0";
this->port = 0;
this->timeout = 0;
this->timeout = time(NULL);
}
const string& NATItem::getIp() const
@ -34,12 +34,26 @@ void NATItem::setPort(int port)
this->port = port;
}
int NATItem::getTimeout() const
unsigned long NATItem::getTimeout() const
{
return timeout;
long t = this->timeout - time(NULL);
if (t < 0)
return 0;
return t;
}
bool NATItem::isFree()
{
return (this->getTimeout() == 0);
}
void NATItem::setTimeout(int timeout)
{
this->timeout = timeout;
this->timeout = time(NULL) + timeout;
}
void NATItem::free()
{
this->setTimeout(0);
}

+ 8
- 13
NATItem.h View File

@ -12,28 +12,23 @@
class NATItem
{
string ip; // IP wewn. do którego ma trafić odpowiedź / z którego przyszło żądanie
int port; // port komputera wewn. do którego ma trafić odpowiedź
int timeout; // czas (w sekundach) zajętości portu (0 - port wolny)
string ip; // IP wewn. do którego ma trafić odpowiedź / z którego przyszło żądanie
int port; // port komputera wewn. do którego ma trafić odpowiedź
unsigned long timeout; // czas (w sekundach) zajętości portu (0 - port wolny)
public:
NATItem();
/*
// settery
void setIp(string ip);
void setPort(int port);
void setTimeout(int timeout);
NATItem();
bool isFree();
// gettery
string getIp();
int getPort();
int getTimeout();*/
const string& getIp() const;
void setIp(const string& ip);
int getPort() const;
void setPort(int port);
int getTimeout() const;
unsigned long getTimeout() const;
void setTimeout(int timeout);
void free();
};
#endif /* NATITEM_H_ */

+ 96
- 0
NATRouter.cpp View File

@ -18,7 +18,15 @@ NATRouter::NATRouter()
cerr << "Nie mozna zaalokowac pamieci dla tablicy NAT!" << endl;
exit(1);
}
}
int NATRouter::getFreePort()
{
for (int i=0; i<65536; ++i)
if (this->natTable[i].isFree())
return i;
return -1; // nie ma żadnego wolnego portu
}
NATRouter::~NATRouter()
@ -26,3 +34,91 @@ NATRouter::~NATRouter()
if (natTable)
delete [] natTable;
}
void NATRouter::onRecv()
{
Packet p = this->recv();
if (p.getSrcPort() != 0)
{
if (p.getDstIp() != this->getIp() && p.getDstIp() != this->getWanIp())
{
this->sNAT(&p);
}
else if (p.getDstIp() == this->getWanIp() && !this->natTable[p.getDstPort()].isFree())
{
this->dNAT(&p);
}
else
{
// TUTAJ ew. implementacja obslugi pakietu adresowanego do routera
}
}
}
void NATRouter::setWanIp(string wanIp)
{
this->netWanConf.ip = wanIp;
}
void NATRouter::setWanMask(string wanMask)
{
this->netWanConf.mask = wanMask;
}
void NATRouter::setWanGatewayIp(string wanGatewayIp)
{
this->netWanConf.gatewayIp = wanGatewayIp;
}
string NATRouter::getWanIp()
{
return this->netWanConf.ip;
}
string NATRouter::getWanMask()
{
return this->netWanConf.mask;
}
void NATRouter::sNAT(Packet *packet)
{
int port;
NATItem *natItem;
while ((port = this->getFreePort()) == -1)
{
//TESTOWO
cout << "Brak wolnych portow, czekam 1s" << endl;
sleep(1);
}
// wstawiam do tablicy NAT info ze port zarezerowany na odbior
natItem = &this->natTable[port];
natItem->setIp(packet->getSrcIp());
natItem->setPort(packet->getSrcPort());
packet->setSrcIp(this->getWanIp()); // zamieniam IP lokalne na WAN'owe
packet->setSrcPort(port); // zamieniam port lokalny na WAN'owy - z tablicy NAT
this->send(*packet, true); // wysylam dalej
natItem = NULL;
}
void NATRouter::dNAT(Packet* packet)
{
NATItem *natItem = &this->natTable[packet->getDstPort()];
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
this->send(*packet, true); // wysylam dalej
natItem = NULL;
}
string NATRouter::getWanGatewayIp()
{
return this->netWanConf.gatewayIp;
}

+ 17
- 1
NATRouter.h View File

@ -14,9 +14,25 @@
class NATRouter : public Node
{
NATItem *natTable;
NATItem *natTable; // tablica z zaalokowanymi portami na zewnątrz
NetConf netWanConf; // konfiguracja sieciowa na zewnątrz
int getFreePort();
void sNAT(Packet *packet);
void dNAT(Packet *packet);
public:
NATRouter();
~NATRouter();
virtual void onRecv();
// settery
void setWanIp(string wanIp);
void setWanMask(string wanMask);
void setWanGatewayIp(string wanGatewayIp);
// gettery
string getWanIp();
string getWanMask();
string getWanGatewayIp();
};
#endif /* NATROUTER_H_ */

+ 9
- 6
Node.cpp View File

@ -100,7 +100,7 @@ bool Node::connectNode(Node *node, bool firstConnected)
* o ile jest skonfigurowana i istnieje do niej sciezka
* TODO zaimplementowac porownywanie z maska - jezeli dstIp z maska nie gra, wysylac na ruter
*/
bool Node::send(Packet packet)
bool Node::send(Packet packet, bool isRouter)
{
Node *node;
node = this->findConnection(packet.getDstIp()); // znajdz bezposrednia trase
@ -113,11 +113,14 @@ bool Node::send(Packet packet)
if (packet.getDstPort() == 0)
return false; // wypada zdefiniowac nadawce oraz docelowy port...
packet.setSrcIp(this->getIp());
// ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny)
srand(time(NULL));
packet.setSrcPort(rand() % 32768 + 28233);
// jezeli wezel nie jest routerem to ma ustawic pakietowi swoj srcIp oraz losowy port
if (!isRouter)
{
packet.setSrcIp(this->getIp());
// 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;

+ 1
- 1
Node.h View File

@ -34,7 +34,7 @@ public:
virtual ~Node();
bool connectNode(Node *node, bool firstConnected = false);
bool send(Packet packet);
bool send(Packet packet, bool isRouter = false);
void putPacket(Packet packet);
// settery

+ 1
- 0
common.h View File

@ -14,6 +14,7 @@
#include <functional>
#include <cstdlib>
#include <ctime>
#include <unistd.h>
using namespace std;

Loading…
Cancel
Save