napisany DNAT + SNAT z opcja maskarady
This commit is contained in:
22
NATItem.cpp
22
NATItem.cpp
@@ -11,7 +11,7 @@ NATItem::NATItem()
|
|||||||
{
|
{
|
||||||
this->ip = "0.0.0.0";
|
this->ip = "0.0.0.0";
|
||||||
this->port = 0;
|
this->port = 0;
|
||||||
this->timeout = 0;
|
this->timeout = time(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
const string& NATItem::getIp() const
|
const string& NATItem::getIp() const
|
||||||
@@ -34,12 +34,26 @@ void NATItem::setPort(int port)
|
|||||||
this->port = 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)
|
void NATItem::setTimeout(int timeout)
|
||||||
{
|
{
|
||||||
this->timeout = timeout;
|
this->timeout = time(NULL) + timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NATItem::free()
|
||||||
|
{
|
||||||
|
this->setTimeout(0);
|
||||||
}
|
}
|
||||||
|
|||||||
21
NATItem.h
21
NATItem.h
@@ -12,28 +12,23 @@
|
|||||||
|
|
||||||
class NATItem
|
class NATItem
|
||||||
{
|
{
|
||||||
string ip; // IP wewn. do którego ma trafić odpowiedź / z którego przyszło żądanie
|
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 port; // port komputera wewn. do którego ma trafić odpowiedź
|
||||||
int timeout; // czas (w sekundach) zajętości portu (0 - port wolny)
|
unsigned long timeout; // czas (w sekundach) zajętości portu (0 - port wolny)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NATItem();
|
NATItem();
|
||||||
/*
|
NATItem();
|
||||||
// settery
|
|
||||||
void setIp(string ip);
|
bool isFree();
|
||||||
void setPort(int port);
|
|
||||||
void setTimeout(int timeout);
|
|
||||||
|
|
||||||
// gettery
|
|
||||||
string getIp();
|
|
||||||
int getPort();
|
|
||||||
int getTimeout();*/
|
|
||||||
const string& getIp() const;
|
const string& getIp() const;
|
||||||
void setIp(const string& ip);
|
void setIp(const string& ip);
|
||||||
int getPort() const;
|
int getPort() const;
|
||||||
void setPort(int port);
|
void setPort(int port);
|
||||||
int getTimeout() const;
|
unsigned long getTimeout() const;
|
||||||
void setTimeout(int timeout);
|
void setTimeout(int timeout);
|
||||||
|
void free();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* NATITEM_H_ */
|
#endif /* NATITEM_H_ */
|
||||||
|
|||||||
@@ -18,7 +18,15 @@ NATRouter::NATRouter()
|
|||||||
cerr << "Nie mozna zaalokowac pamieci dla tablicy NAT!" << endl;
|
cerr << "Nie mozna zaalokowac pamieci dla tablicy NAT!" << endl;
|
||||||
exit(1);
|
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()
|
NATRouter::~NATRouter()
|
||||||
@@ -26,3 +34,91 @@ NATRouter::~NATRouter()
|
|||||||
if (natTable)
|
if (natTable)
|
||||||
delete [] 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;
|
||||||
|
}
|
||||||
|
|||||||
18
NATRouter.h
18
NATRouter.h
@@ -14,9 +14,25 @@
|
|||||||
|
|
||||||
class NATRouter : public Node
|
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:
|
public:
|
||||||
NATRouter();
|
NATRouter();
|
||||||
~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_ */
|
#endif /* NATROUTER_H_ */
|
||||||
|
|||||||
15
Node.cpp
15
Node.cpp
@@ -100,7 +100,7 @@ bool Node::connectNode(Node *node, bool firstConnected)
|
|||||||
* o ile jest skonfigurowana i istnieje do niej sciezka
|
* o ile jest skonfigurowana i istnieje do niej sciezka
|
||||||
* TODO zaimplementowac porownywanie z maska - jezeli dstIp z maska nie gra, wysylac na ruter
|
* 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 *node;
|
||||||
node = this->findConnection(packet.getDstIp()); // znajdz bezposrednia trase
|
node = this->findConnection(packet.getDstIp()); // znajdz bezposrednia trase
|
||||||
@@ -113,11 +113,14 @@ bool Node::send(Packet packet)
|
|||||||
if (packet.getDstPort() == 0)
|
if (packet.getDstPort() == 0)
|
||||||
return false; // wypada zdefiniowac nadawce oraz docelowy port...
|
return false; // wypada zdefiniowac nadawce oraz docelowy port...
|
||||||
|
|
||||||
packet.setSrcIp(this->getIp());
|
// jezeli wezel nie jest routerem to ma ustawic pakietowi swoj srcIp oraz losowy port
|
||||||
// ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny)
|
if (!isRouter)
|
||||||
srand(time(NULL));
|
{
|
||||||
packet.setSrcPort(rand() % 32768 + 28233);
|
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);
|
node->putPacket(packet);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
2
Node.h
2
Node.h
@@ -34,7 +34,7 @@ public:
|
|||||||
virtual ~Node();
|
virtual ~Node();
|
||||||
bool connectNode(Node *node, bool firstConnected = false);
|
bool connectNode(Node *node, bool firstConnected = false);
|
||||||
|
|
||||||
bool send(Packet packet);
|
bool send(Packet packet, bool isRouter = false);
|
||||||
void putPacket(Packet packet);
|
void putPacket(Packet packet);
|
||||||
|
|
||||||
// settery
|
// settery
|
||||||
|
|||||||
Reference in New Issue
Block a user