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->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);
|
||||
}
|
||||
|
||||
21
NATItem.h
21
NATItem.h
@@ -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_ */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
18
NATRouter.h
18
NATRouter.h
@@ -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_ */
|
||||
|
||||
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
|
||||
* 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;
|
||||
|
||||
2
Node.h
2
Node.h
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user