Si të transferoni portet përmes një porte Linux me Iptables
Prezantimi
NAT, ose përkthimi i adresës së rrjetit, është një term i përgjithshëm për manipulimin e paketave në mënyrë që t'i ridrejtojë ato në një adresë alternative. Zakonisht, kjo përdoret për të lejuar trafikun të kapërcejë kufijtë e rrjetit. Një host që zbaton NAT zakonisht ka akses në dy ose më shumë rrjete dhe është i konfiguruar për të drejtuar trafikun ndërmjet tyre.
Përcjellja e portit është procesi i përcjelljes së kërkesave për një port specifik në një host, rrjet ose port tjetër. Meqenëse ky proces modifikon destinacionin e paketës gjatë fluturimit, ai konsiderohet një lloj operacioni NAT.
Në këtë tutorial, ne do të demonstrojmë se si të përdorim iptables
për të përcjellë portet te hostet pas një muri zjarri duke përdorur teknikat NAT. Kjo është e dobishme nëse keni konfiguruar një rrjet privat, por ende dëshironi të lejoni një trafik të caktuar brenda përmes një makine të caktuar porta.
Parakushtet
Për të ndjekur së bashku me këtë udhëzues, do t'ju duhet:
- Konfigurimi i dy serverëve Ubuntu 20.04 në të njëjtën qendër të dhënash me rrjetin privat të aktivizuar. Në secilën prej këtyre makinave, do t'ju duhet të konfiguroni një llogari përdoruesi jo-root me privilegje
sudo
. Ju mund të mësoni se si ta bëni këtë me udhëzuesin tonë në udhëzuesin fillestar të konfigurimit të serverit Ubuntu 20.04. Sigurohuni që të kapërceni Hapin 4 të këtij udhëzuesi pasi ne do të konfigurojmë dhe konfigurojmë murin e zjarrit gjatë këtij tutoriali. - Në një nga serverët tuaj, konfiguroni një shabllon të murit të zjarrit me
iptables
që të mund të funksionojë si serveri juaj i murit të zjarrit. Ju mund ta bëni këtë duke ndjekur udhëzuesin tonë se si të zbatoni një firewall bazë me Iptables në Ubuntu 20.04. Pasi të përfundojë, serveri juaj i murit të zjarrit duhet të ketë gati për përdorim sa vijon:iptables-persistent
i instaluar- U ruajt rregulli i paracaktuar në
/etc/iptables/rules.v4
- Një kuptim se si të shtoni ose rregulloni rregullat duke redaktuar skedarin e rregullave ose duke përdorur komandën
iptables
Serveri në të cilin keni vendosur shabllonin tuaj të murit të zjarrit do të shërbejë si muri i zjarrit dhe ruteri për rrjetin tuaj privat. Për qëllime demonstrimi, hosti i dytë do të konfigurohet me një server në internet që është i aksesueshëm vetëm duke përdorur ndërfaqen e tij private. Ju do të konfiguroni makinën e murit të zjarrit për të përcjellë kërkesat e marra në ndërfaqen e saj publike në serverin e uebit, të cilin do ta arrijë në ndërfaqen e tij private.
Detajet e hostit
Përpara se të filloni, duhet të dini se cilat ndërfaqe dhe adresa po përdoren nga të dy serverët tuaj.
Gjetja e detajeve të rrjetit tuaj
Për të marrë detajet e sistemeve tuaja, filloni duke gjetur ndërfaqet e rrjetit tuaj. Ju mund të gjeni ndërfaqet në makinat tuaja dhe adresat e lidhura me to duke ekzekutuar sa vijon:
- ip -4 addr show scope global
Sample Output2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 203.0.113.1/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 10.0.0.1/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft foreverProdhimi i theksuar tregon dy ndërfaqe (
eth0
dheeth1
) dhe adresat e caktuara për secilën (203.0.113.1
dhe10.0.0.1
përkatësisht). Për të zbuluar se cila nga këto ndërfaqe është ndërfaqja juaj publike, ekzekutoni këtë komandë:- ip route show | grep default
Outputdefault via 111.111.111.111 dev eth0Informacioni i ndërfaqes nga kjo dalje (
eth0
në këtë shembull) do të jetë ndërfaqja e lidhur me portën tuaj të paracaktuar. Kjo është pothuajse me siguri ndërfaqja juaj publike.Gjeni këto vlera në secilën nga makinat tuaja dhe përdorni ato për t'i ndjekur së bashku me pjesën tjetër të këtij udhëzuesi.
Shembuj të të dhënave të përdorura në këtë udhëzues
Për t'i bërë gjërat më të qarta, ne do të përdorim adresat e mëposhtme të zbrazëta dhe detyrat e ndërfaqes gjatë gjithë këtij tutoriali. Ju lutemi zëvendësoni vlerat tuaja me ato të renditura në vijim:
Detajet e rrjetit të serverit në ueb:
- Adresa IP publike:
203.0.113.1
- Adresa IP private:
10.0.0.1
- Ndërfaqja publike:
eth0
- Ndërfaqja private:
eth1
Detajet e rrjetit të murit të zjarrit:
- Adresa IP publike:
203.0.113.2
- Adresa IP private:
10.0.0.2
- Ndërfaqja publike:
eth0
- Ndërfaqja private:
eth1
Vendosja e serverit në internet
Filloni të lidheni me hostin e serverit tuaj të internetit dhe duke u identifikuar me përdoruesin tuaj
sudo
.Instalimi i Nginx
Hapi i parë është të instaloni Nginx në hostin e serverit tuaj të internetit dhe ta mbyllni atë në mënyrë që të dëgjojë vetëm ndërfaqen e tij private. Kjo do të sigurojë që serveri juaj i uebit do të jetë i disponueshëm vetëm nëse konfiguroni saktë përcjelljen e portit.
Filloni duke përditësuar cache-in lokal të paketës:
- sudo apt update
Më pas, përdorni
apt
për të shkarkuar dhe instaluar softuerin:- sudo apt install nginx
Kufizimi i Nginx në Rrjetin Privat
Pasi të instalohet Nginx, hapni skedarin e konfigurimit të parazgjedhur të bllokut të serverit për të siguruar që ai të dëgjojë vetëm ndërfaqen private. Hapni skedarin duke përdorur redaktuesin tuaj të preferuar të tekstit. Këtu do të përdorim
nano
:- sudo nano /etc/nginx/sites-enabled/default
Brenda, gjeni direktivën
dëgjo
. Duhet të renditet dy herë radhazi drejt majës së konfigurimit:server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; . . . }
Në direktivën e parë
dëgjo
, shtoni adresën IP private të serverit tuaj të internetit dhe një dy pika përpara80
për t'i thënë Nginx të dëgjojë vetëm në ndërfaqen private. Ne po demonstrojmë vetëm përcjelljen IPv4 në këtë udhëzues, kështu që ju mund të hiqni direktivën e dytë të dëgjimit, e cila është konfiguruar për IPv6.Më pas, modifikoni direktivat
dëgjo
si më poshtë:server { listen 10.0.0.1:80 default_server; . . . }
Ruani dhe mbyllni skedarin kur të keni mbaruar. Nëse keni përdorur
nano
, mund ta bëni këtë duke shtypurCTRL + X
, më pasY
dheENTER
.Tani testoni skedarin për gabime sintaksore:
- sudo nginx -t
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successfulNëse nuk ka gabime në dalje, rinisni Nginx për të aktivizuar konfigurimin e ri:
- sudo systemctl restart nginx
Verifikimi i kufizimit të rrjetit
Në këtë pikë, është e dobishme të verifikoni nivelin e aksesit që keni në serverin tuaj të internetit.
Nga serveri juaj i murit të zjarrit, përpiquni të hyni në serverin tuaj të internetit nga ndërfaqja private me komandën e mëposhtme:
- curl --connect-timeout 5 10.0.0.1
Nëse është i suksesshëm, dalja juaj do të rezultojë në mesazhin e mëposhtëm:
Output<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> . . .Nëse përpiqeni të përdorni ndërfaqen publike, do të merrni një mesazh që thotë se nuk mund të lidhet:
- curl --connect-timeout 5 203.0.113.1
Outputcurl: (7) Failed to connect to 203.0.113.1 port 80: Connection refusedKëto rezultate priten.
Konfigurimi i Firewall-it në Forward Port 80
Tani do të punoni në zbatimin e përcjelljes së portit në makinën tuaj të murit të zjarrit.
Aktivizimi i përcjelljes në kernel
Gjëja e parë që duhet të bëni është të aktivizoni përcjelljen e trafikut në nivelin e kernelit. Si parazgjedhje, shumica e sistemeve e kanë përcjelljen të fikur.
Për të aktivizuar përcjelljen e portit vetëm për këtë sesion, kryeni sa vijon:
- echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Output1Për të aktivizuar përgjithmonë përcjelljen e portit, do t'ju duhet të redaktoni skedarin
/etc/sysctl.conf
. Ju mund ta bëni këtë duke hapur skedarin me privilegjesudo
:- sudo nano /etc/sysctl.conf
Brenda skedarit, gjeni dhe çkomentoni rreshtin që lexohet si më poshtë:
net.ipv4.ip_forward=1
Ruani dhe mbyllni skedarin kur të keni mbaruar.
Pastaj aplikoni cilësimet në këtë skedar. Fillimisht ekzekutoni komandën e mëposhtme:
- sudo sysctl -p
Outputnet.ipv4.ip_forward = 1Pastaj ekzekutoni të njëjtën komandë, por zëvendësoni flamurin
-p
me--system
:- sudo sysctl --system
Output. . . * Applying /usr/lib/sysctl.d/50-pid-max.conf ... kernel.pid_max = 4194304 * Applying /etc/sysctl.d/99-cloudimg-ipv6.conf ... net.ipv6.conf.all.use_tempaddr = 0 net.ipv6.conf.default.use_tempaddr = 0 * Applying /etc/sysctl.d/99-sysctl.conf ... net.ipv4.ip_forward = 1 * Applying /usr/lib/sysctl.d/protect-links.conf ... fs.protected_fifos = 1 fs.protected_hardlinks = 1 fs.protected_regular = 2 fs.protected_symlinks = 1 * Applying /etc/sysctl.conf ... net.ipv4.ip_forward = 1Shtimi i rregullave të përcjelljes në murin bazë të zjarrit
Më pas, ju do të konfiguroni murin tuaj të zjarrit në mënyrë që trafiku që rrjedh në ndërfaqen tuaj publike (
eth0
) në portën80
do të përcillet në ndërfaqen tuaj private (eth1
).Muri i zjarrit që keni konfiguruar në tutorialin parakusht e ka zinxhirin tuaj
FORWARD
të vendosur në trafikunDROP
si parazgjedhje. Ju duhet të shtoni rregulla që do t'ju lejojnë të përcillni lidhjet në serverin tuaj të internetit. Për hir të sigurisë, ju do ta mbyllni këtë mjaft fort në mënyrë që të lejohen vetëm lidhjet që dëshironi të përcillni.Në zinxhirin
FORWARD
, do të pranoni lidhje të reja të destinuara për portin80
që vijnë nga ndërfaqja juaj publike dhe udhëtojnë në ndërfaqen tuaj private. Lidhjet e reja identifikohen nga shtrirjaconntrack
dhe do të përfaqësohen në mënyrë specifike nga një paketë TCP SYN si në vijim:- sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
Kjo do të lejojë paketën e parë, që synon të krijojë një lidhje, përmes murit të zjarrit. Do t'ju duhet gjithashtu të lejoni çdo trafik të mëvonshëm në të dy drejtimet që rezulton nga ajo lidhje. Për të lejuar trafikun
ESTABLISHED
dheRELATED
ndërmjet ndërfaqeve tuaja publike dhe private, ekzekutoni komandat e mëposhtme. Së pari për ndërfaqen tuaj publike:- sudo iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Pastaj për ndërfaqen tuaj private:
- sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Kontrolloni dy herë nëse politika juaj në zinxhirin
FORWARD
është caktuar nëDROP
:- sudo iptables -P FORWARD DROP
Në këtë pikë, ju keni lejuar që trafiku i caktuar midis ndërfaqeve tuaja publike dhe private të vazhdojë përmes murit tuaj të zjarrit. Megjithatë, ju nuk i keni konfiguruar rregullat që në fakt do t'i tregojnë
iptables
se si të përkthejnë dhe drejtojnë trafikun.Shtimi i saktë i rregullave NAT në paketat direkte
Më pas, do të shtoni rregullat që do t'i tregojnë
iptables
se si të drejtojnë trafikun tuaj. Ju duhet të kryeni dy operacione të veçanta në mënyrë qëiptables
të ndryshojnë saktë paketat në mënyrë që klientët të mund të komunikojnë me serverin e uebit.Operacioni i parë, i quajtur
DNAT
, do të bëhet në zinxhirinPREROUTING
të tabelësnat
.DNAT
është një operacion që ndryshon adresën e destinacionit të një pakete në mënyrë që të mundësojë që ajo të drejtojë saktë ndërsa kalon midis rrjeteve. Klientët në rrjetin publik do të lidhen me serverin tuaj të murit të zjarrit dhe nuk do të kenë njohuri për topologjinë e rrjetit tuaj privat. Prandaj, ju duhet të ndryshoni adresën e destinacionit të secilës paketë në mënyrë që kur të dërgohet në rrjetin tuaj privat, ajo të dijë se si të arrijë saktë në serverin tuaj të internetit.Meqenëse po konfiguroni vetëm përcjelljen e portit dhe nuk po kryeni NAT në çdo paketë që godet murin tuaj të zjarrit, do të dëshironi të përputheni me portën
80
në rregullin tuaj. Ju do të përputhni paketat që synojnë portin80
me adresën IP private të serverit tuaj të internetit (10.0.0.1
në shembullin e mëposhtëm):- sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
Ky proces kujdeset për gjysmën e figurës. Paketa duhet të drejtohet saktë në serverin tuaj të internetit. Megjithatë, për momentin, paketa do të ketë ende adresën origjinale të klientit si adresën e burimit. Serveri do të përpiqet të dërgojë përgjigjen drejtpërdrejt në atë adresë, gjë që do ta bëjë të pamundur krijimin e një lidhjeje legjitime TCP.
Në DigitalOcean, paketat që lënë një Droplet me një adresë burimi të ndryshëm në të vërtetë do të hidhen nga hipervizori, kështu që paketat tuaja në këtë fazë nuk do të arrijnë asnjëherë te serveri i uebit (i cili do të rregullohet duke zbatuar SNAT përkohësisht). Kjo është një masë kundër mashtrimit e vendosur për të parandaluar sulmet ku kërkohet që sasi të mëdha të dhënash të dërgohen në kompjuterin e viktimës duke falsifikuar adresën e burimit në kërkesë. Për të mësuar më shumë, lexoni këtë përgjigje në komunitetin tonë.
Për të konfiguruar rrugën e duhur, duhet gjithashtu të modifikoni adresën burimore të paketës pasi ajo largohet nga muri i zjarrit gjatë rrugës për në serverin e uebit. Duhet të modifikoni adresën e burimit në adresën IP private të serverit tuaj të murit të zjarrit (
10.0.0.2
në shembullin e mëposhtëm). Përgjigja më pas do të dërgohet përsëri në murin e zjarrit, i cili më pas mund ta përcjellë atë tek klienti siç pritej.Për të aktivizuar këtë funksionalitet, shtoni një rregull në zinxhirin
POSTROUTING
të tabelësnat
, i cili vlerësohet menjëherë përpara se paketat të dërgohen në rrjet. Ju do të përputhni paketat e destinuara për serverin tuaj të internetit sipas adresës IP dhe portit:- sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 10.0.0.1 -j SNAT --to-source 10.0.0.2
Pasi të zbatohet ky rregull, serveri juaj i uebit duhet të jetë i aksesueshëm duke drejtuar shfletuesin tuaj të internetit në adresën publike të makinës suaj të murit të zjarrit:
- curl 203.0.113.2
Output<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> . . .Konfigurimi i transferimit të portit tuaj tani ka përfunduar.
Rregullimi i grupit të rregullave të përhershme
Tani që keni konfiguruar përcjelljen e portit, mund ta ruani këtë në grupin tuaj të përhershëm të rregullave.
Nëse nuk ju intereson humbja e komenteve që janë në grupin tuaj aktual të rregullave, përdorni komandën
netfilter-persistent
për të përdorur shërbiminiptables
dhe për të ruajtur rregullat tuaja:- sudo service netfilter-persistent save
Output* Saving netfilter rules... run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save [ OK ]Nëse dëshironi të ruani komentet në skedarin tuaj, hapeni dhe modifikoni manualisht:
- sudo nano /etc/iptables/rules.v4
Do t'ju duhet të rregulloni konfigurimin në tabelën
filtri
për rregullat e zinxhiritFORWARD
që u shtuan. Do t'ju duhet gjithashtu të rregulloni seksionin që konfiguron tabelënnat
në mënyrë që të mund të shtoni rregullat tuajaPREROUTING
dhePOSTROUTING
. Përmbajtja do të ngjajë me sa vijon:*filter # Allow all outgoing, but drop incoming and forwarding packets by default :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Custom per-protocol chains :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Acceptable UDP traffic # Acceptable TCP traffic -A TCP -p tcp --dport 22 -j ACCEPT # Acceptable ICMP traffic # Boilerplate acceptance policy -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Drop invalid packets -A INPUT -m conntrack --ctstate INVALID -j DROP # Pass traffic to protocol-specific chains ## Only allow new connections (established and related should already be handled) ## For TCP, additionally only allow new SYN packets since that is the only valid ## method for establishing a new TCP connection -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 # Reject anything that's fallen through to this point ## Try to be protocol-specific w/ rejection message -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 # Rules to forward port 80 to our web server # Web server network details: # * Public IP Address: 203.0.113.1 # * Private IP Address: 10.0.0.1 # * Public Interface: eth0 # * Private Interface: eth1 # # Firewall network details: # # * Public IP Address: 203.0.113.2 # * Private IP Address: 10.0.0.2 # * 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 # End of Forward filtering rules # Commit the changes 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] # Rules to translate requests for port 80 of the public interface # so that we can forward correctly to the web server using the # private interface. # Web server network details: # * Public IP Address: 203.0.113.1 # * Private IP Address: 10.0.0.1 # * Public Interface: eth0 # * Private Interface: eth1 # # Firewall network details: # # * Public IP Address: 203.0.113.2 # * Private IP Address: 10.0.0.2 # * Public Interface: eth0 # * Private Interface: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1 -A POSTROUTING -d 10.0.0.1 -o eth1 -p tcp --dport 80 -j SNAT --to-source 10.0.0.2 # End of NAT translations for web server traffic 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
Ruani dhe mbyllni skedarin pasi të keni shtuar përmbajtjen dhe të keni rregulluar vlerat për të pasqyruar mjedisin tuaj të rrjetit.
Tjetra, testoni sintaksën e skedarit tuaj të rregullave:
- sudo sh -c "iptables-restore -t < /etc/iptables/rules.v4"
Nëse nuk zbulohen gabime, ngarkoni grupin e rregullave:
- sudo service netfilter-persistent reload
Output* Loading netfilter rules... run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start [ OK ]Tani provoni që serveri juaj i uebit është ende i aksesueshëm përmes adresës IP publike të murit tuaj të zjarrit:
- curl 203.0.113.2
Kjo duhet të funksionojë njësoj si më parë.
konkluzioni
Deri tani, duhet të jeni të kënaqur me përcjelljen e porteve në një server Linux me
iptables
. Procesi përfshin lejimin e përcjelljes në nivelin e kernelit, vendosjen e aksesit për të lejuar përcjelljen e trafikut të portës specifike midis dy ndërfaqeve në sistemin e murit të zjarrit dhe konfigurimin e rregullave NAT në mënyrë që paketat të mund të drejtohen saktë. Ky mund të duket si një proces i vështirë, por tregon gjithashtu fleksibilitetin e kornizës së filtrimit të paketavenetfilter
dhe murit të zjarritiptables
. Kjo mund të përdoret për të maskuar topologjinë e rrjetit tuaj privat duke lejuar që trafiku i shërbimit të rrjedhë lirshëm nëpër makinën tuaj të murit të zjarrit të portës.