Porttovábbítás, más néven portleképezés, egy olyan módszer, amely lehetővé teszi a távoli eszközök számára, hogy csatlakozzanak a privát helyi hálózatán (LAN) belüli konkrét szolgáltatásokhoz. Ahogy a név is sugallja, a folyamat magában foglalja egy adott portra érkező kérések továbbítását egy másik portra vagy hálózatra. Módosítja a csomag célját menet közben, és a hálózati címfordítás (NAT) műveletnek minősül.
A porttovábbítás engedélyezése lehetővé teszi a belső hálózathoz nem csatlakozó eszközök vagy állomások számára, hogy elérjék egymást, ami egyébként le van tiltva, ha a funkció ki van kapcsolva. A porttovábbítás előnyeit kihasználva tetszés szerint blokkolhat célwebhelyeket, növelheti a biztonságot, és megkerülheti a NAT tűzfalat.
Ebben az útmutatóban lépésről lépésre bemutatjuk a portok továbbítását iptables segítségével Linux alatt.
Előfeltételek
Az útmutató követéséhez a következőkre lesz szüksége:
- Ubuntu telepítve a rendszerén.
- Két Ubuntu 20.04-es gép ugyanabban az adatközpontban, engedélyezett privát hálózattal.
- Sudo jogosultságokkal rendelkező, nem root felhasználói fiók beállítva mindegyik gépen.
Gép részletei
Először is ismernünk kell a működő szerverek interfészeinek és címeinek részleteit. Ellenőrizzük a rendszerünk hálózati interfészeit:
|
1 |
ip -4 addr show scope global |
A következő kimenetet fogja látni:
|
1 2 3 4 5 6 7 8 9 |
Minta Kimenet 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
Itt a kiemelt kimenet két interfészt mutat, az első eth0 a következő címhez van hozzárendelve: 192.51.100.45, a második pedig, az eth1 a következő címhez van hozzárendelve: 192.168.1.5. E két interfész közül az egyik nyilvános, a másik pedig privát. Futtatunk egy parancsot, hogy megkülönböztessük a kettőt, és kiderítsük, melyik a nyilvános interfész, amely az alapértelmezett átjáróhoz kapcsolódik. A megkülönböztetéshez írja be:
|
1 |
ip route show | grep default= |
A következő kimenetet fogja látni:
|
1 2 3 |
Kimenet: ip route show | grep default |
Fiktív adatok az útmutatóhoz
Ebben az útmutatóban fiktív címeket és interfész-hozzárendeléseket fogunk használni. Ezeket az adatokat szabadon használhatja, vagy tetszés szerint kicserélheti őket.
Webszerver hálózati részletei:
-
Nyilvános IP-cím: 203.0.113.2
-
Privát IP-cím: 192.0.2.2
-
Nyilvános interfész: eth0
-
Privát interfész: eth1
Tűzfal hálózati részletei:
-
Nyilvános IP-cím: 203.0.113.15
-
Privát IP-cím: 192.0.2.15
-
Nyilvános interfész: eth0
-
Privát interfész: eth1
Webszerver beállítása
Kezdjük a webszerver gépünkkel. Először jelentkezzen be a sudo felhasználójával.
Az Nginx telepítése
Először telepítjük az Nginx-et a webszerverünkön, és korlátozzuk, hogy csak a privát interfészén figyeljen. Ez lehetővé teszi, hogy a webszerverünk csak akkor legyen elérhető, ha a porttovábbítást megfelelően állítottuk be.
Ezután frissítse a helyi csomaggyorsítótárat, és az apt segítségével töltse le és telepítse az Nginx-et:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Korlátozások hozzáadása
Miután telepítettük az Nginx-et a webszerverünkön, zárolni fogjuk, hogy biztosítsuk, hogy csak a privát interfészekről fogadjon bemeneteket, máshonnan ne. Ez azt is biztosítja, hogy a webszervereink csak akkor legyenek aktívak, ha a porttovábbítás beállítása helyes.
A korlátozások hozzáadásához nyissa meg az alapértelmezett szerverblokk konfigurációs fájlját: /etc/nginx/sites-enabled/default egy tetszőleges szövegszerkesztőben (itt a nano szövegszerkesztőt használjuk), és gépelje be:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
A kimenetben látni fogja, hogy a listen direktíva kétszer jelenik meg:

Ebben az útmutatóban az első direktívát használjuk az IPv4 továbbítás bemutatására. A második, amely az IPv6-hoz van konfigurálva, eltávolítható. Adja hozzá a webszerver privát IP-címét egy kettősponttal közvetlenül a 80 elé, hogy tájékoztassa az Nginx-et, hogy csak a privát interfészről fogadjon bemeneteket. Ezután szerkessze a direktívát:

Ha kész, mentse el és zárja be a fájlt. Mielőtt továbblépne, győződjön meg arról, hogy nincsenek szintaktikai hibák. Teszteljük a fájlt:
|
1 |
sudo nginx -t |

Ha nem jelenik meg hibaüzenet, újraindíthatja az Nginx-et és engedélyezheti az új konfigurációt:
|
1 |
sudo service nginx restart |
A hálózati korlátozás ellenőrzése
Ellenőrizzük, milyen szintű hozzáférésünk van a webszerverünkhöz. Próbálja meg elérni a webszervert a privát interfészen keresztül a curl paranccsal:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
A következő kimenetet fogja látni:

Ha a nyilvános interfészt próbáljuk használni, nem fogunk tudni kapcsolódni:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
Pontosan erre számítottunk.
A tűzfal konfigurálása a 80-as port továbbítására
Haladjunk tovább a munkával, és valósítsuk meg a porttovábbítást a tűzfal gépünkön.
Továbbítás engedélyezése a kernelben
Alapértelmezés szerint a legtöbb rendszerben a porttovábbítás KI van kapcsolva. Néhány szerkesztéssel be fogjuk kapcsolni a porttovábbítást. Emellett lehetőség van a porttovábbítás végleges BEkapcsolására is a sudo jogosultságok használatával, a következő lépésekben bemutatottak szerint.
A forgalomtovábbítás kernel szintű BEkapcsolásához gépelje be:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
A porttovábbítás végleges BEkapcsolásához szerkessze a /etc/sysctl.conf fájlt. Nyissa meg a fájlt sudo jogosultságokkal, és gépelje be:
|
1 |
sudo nano /etc/sysctl.conf |
Belül keresse meg és vegye ki a kommentből a következő sort:
|
1 |
net.ipv4.ip_forward=1 |
Ha kész, mentse el és zárja be a fájlt. Ezután használja a sysctl parancsokat a beállítások módosításainak érvénybe léptetéséhez:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Alapvető tűzfalbeállítás
Először olvassa el az útmutatót arról, hogyan állítson be egy alapvető tűzfalat a gépén. Ennek befejezése után a következőkkel fog rendelkezni:
- Telepítette a iptables-persistent
- Elmentette az alapértelmezett szabálykészletet a /etc/iptables/rules.v4
- Átfogó ismeretekkel rendelkezik a szabályok hozzáadásáról és módosításáról a iptables parancs használatával
Továbbá megnézheti azt is, how to list and delete iptables Firewall rules.
A továbbítási szabályok hozzáadása
Úgy fogjuk konfigurálni a tűzfalunkat, hogy a nyilvános interfészünkre ( eth0 ) a 80 porton érkező forgalom továbbításra kerüljön a privát interfészünkre ( eth1). Alapértelmezés szerint az alapvető tűzfalunkban a FORWARD lánc DROP értékre van állítva a forgalom eldobásához. Tűzfalszabályok hozzáadásával engedélyezzük a továbbított kapcsolatokat a webszerverünkhöz. A biztonság növelése érdekében korlátozni fogjuk a tűzfalszabályokat a továbbítási kérelmek engedélyezéséhez.
A FORWARD láncban elfogadjuk a portra irányuló új kapcsolatokat,80 amelyek a nyilvános interfészünkről érkeznek és a privát interfészünkre tartanak. Az új kapcsolatokat a conntrack kiterjesztés segítségével azonosítjuk, és egy TCP SYN csomaggal reprezentáljuk:
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
Engedélyeznie kell a bejövő kapcsolatból származó minden további forgalmat mindkét irányban. Gépelje be az alábbi parancsokat a ESTABLISHED és RELATED forgalom engedélyezéséhez a nyilvános és privát interfészeink között:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Let’s verify if our policy on the FORWARD chain is set to DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Until now, we’ve added a few rules that allow traffic between our public and private interfaces to proceed through our firewall. However, iptables is not yet informed to direct the traffic because firewall rules configuration is yet to be done. In the next steps, we will add the NAT rules and adjust the permanent rule set to direct traffic.
Adding the NAT Rules to Direct Packets
We’ll perform two separate operations in order for iptables to correctly alter the packets, and streamline communication with the clients and the webserver.
DNAT is the first operation that commences the PREROUTING chain of the nat table. The operation alters the packet’s destination address and enables it to be correctly routed as it passes between networks. However, the clients on the public network will be connecting to our firewall server and will have no information about our private network topology. To pass information with the private network, change the destination address of each packet to allow it to correctly reach our destination web server.
It is crucial to note that we’re focusing on configuring port forwarding. Performing NAT on every packing hitting the firewall is not a part of our tutorial. We will match packets at port 80 to our web server’s private IP address:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
The packet will get routed correctly to our web server containing the client’s original address as the source address. Despite attempts made by the server to send the reply directly to that address, there will be no possibility to establish a legitimate TCP connection.
To configure proper routing, we’ll modify the packet’s source address. Let’s edit the source address to our firewall server’s private IP address. After modification, the reply will be sent back to the firewall, which will forward back to the client.
To enable this functionality, add a rule to the POSTROUTING chain of the nat table evaluated right before packets are sent out on the network. Then, match the packets destined for our web server by IP address and port:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
Once this rule is in place, our web server should be accessible by pointing our web browser at our firewall machine’s public address:
|
1 |
curl 203.0.113.15 |
You’ll see the output:

Our port forwarding setup is complete.
Adjust the Permanent Rule Set
After completing the port forwarding setup, we’ll save this to our permanent rule set. If you want to keep the comments in the current rule set, use the iptables-persistent service to save your rules:
|
1 |
sudo service iptables-persistent save |
You can also open it up and edit manually to keep the comments in your file:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Next, configure the filter table and the nat table to add the FORWARD chain rules and ROUTING rules respectively. Adjusting the nat table will allow us to add PREROUTING and POSTROUTING rules as shown in the example below:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/rules.v4 *filter # Alapértelmezés szerint minden kimenő engedélyezése, de a bejövő és továbbított csomagok eldobása :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Egyedi protokollonkénti láncok :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Elfogadható UDP forgalom # Elfogadható TCP forgalom -A TCP -p tcp --dport 22 -j ACCEPT # Elfogadható ICMP forgalom # Alapértelmezett elfogadási szabályzat -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Érvénytelen csomagok eldobása -A INPUT -m conntrack --ctstate INVALID -j DROP # Forgalom átadása a protokollspecifikus láncoknak ## Csak az új kapcsolatok engedélyezése (a már kiépített és kapcsolódó kapcsolatokat már kezelni kellene) ## TCP esetén ezenkívül csak az új SYN csomagok engedélyezése, mivel ez az egyetlen érvényes ## módszer új TCP kapcsolat létesítésére -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Elutasítunk mindent, ami idáig eljutott ## Próbáljunk meg protokoll-specifikus elutasító üzenetet küldeni -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Szabályok a 80-as port továbbítására a webszerverünkre # Webszerver hálózati részletei: # * Public IP Address: 203.0.113.2 # * Private IP Address: 192.0.2.2 # * Public Interface: eth0 # * Private Interface: eth1 # # Tűzfal hálózati részletei: # # * Public IP Address: 203.0.113.15 # * Private IP Address: 192.0.2.15 # * Public Interface: eth0 # * Private Interface: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Továbbítási szűrési szabályok vége # Módosítások mentése COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Szabályok a publikus interfész 80-as portjára érkező kérések fordítására # hogy megfelelően továbbíthassuk a webszerverre a # privát interfészen keresztül. # Webszerver hálózati részletei: # * Public IP Address: 203.0.113.2 # * Private IP Address: 192.0.2.2 # * Public Interface: eth0 # * Private Interface: eth1 # # Tűzfal hálózati részletei: # # * Public IP Address: 203.0.113.15 # * Private IP Address: 192.0.2.15 # * Public Interface: eth0 # * Private Interface: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Webszerver forgalom NAT fordításainak vége COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
A fenti értékek hozzáadása után mentse el és zárja be a fájlt. Ezután írja be az alábbi parancsot a szabályok szintaxisának teszteléséhez:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Ha nem lát hibát, töltse be a szabálykészletet:
|
1 |
sudo service iptables-persistent reload |
Ellenőrizzük, hogy a webszerverünk továbbra is elérhető-e a tűzfal publikus IP-címén keresztül:
|
1 |
curl 203.0.113.15 |
Összegzés
A bemutató végére már magabiztosan kell tudnia portokat továbbítani egy Linux szerveren az iptables segítségével. Kihasználhatja a porttovábbítási képességeket a privát hálózat topológiájának elrejtésére, miközben a szolgáltatások forgalmát zökkenőmentesen átirányítja az átjáró tűzfalon.
Mivel a folyamat kifejezetten a hálózati biztonságra és a használt portokra támaszkodik, biztonságos. Fennállhat a kockázat lehetősége, ha nincs biztonsági tűzfal vagy VPN-biztonság a hálózatán. Ezért tanácsos a tűzfalat az ebben a leírásban bemutatott módon konfigurálni. Reméljük, hogy ez az útmutató segít biztonságban maradni az interneten a privát hálózat használata során.
A rendszerén implementálható további tűzfalmegoldások megismeréséhez tekintse meg ezeket a forrásokat a blogunkon:
- Tűzfal konfigurálása UFW-vel Ubuntu 18.04-en
- Tűzfal beállítása FirewallD-vel CentOS 7-en
- Az UFW alapjai: A legfontosabb tűzfalparancsok elsajátítása
Kellemes számítógéphasználatot!
Hozzászólások
Még nincsenek hozzászólások. Legyen Ön az első.