Port forwarding, ook wel poortmapping genoemd, is een methode om externe apparaten verbinding te laten maken met een specifieke service binnen uw particuliere lokale netwerk (LAN). Zoals de naam al doet vermoeden, houdt het proces in dat verzoeken voor een specifieke poort worden doorgestuurd naar een andere poort of netwerk. Het wijzigt de bestemming van het pakket tijdens de overdracht en wordt beschouwd als een type netwerkadresvertaling (NAT)-bewerking.
Het inschakelen van port forwarding stelt apparaten of hosts die niet met het interne netwerk zijn verbonden in staat om met elkaar te communiceren, wat anders beperkt is wanneer het is uitgeschakeld. U kunt de voordelen van port forwarding benutten om doelwebsites te blokkeren, de beveiliging te verbeteren en naar eigen wens een omweg om de NAT-firewall te maken.
In deze handleiding leiden we u door de stappen voor het doorsturen van poorten met iptables in Linux.
Vereisten
Om deze handleiding te volgen, heeft u het volgende nodig:
- Ubuntu geïnstalleerd op uw systeem.
- Twee Ubuntu 20.04-hosts in hetzelfde datacenter met privé-netwerk ingeschakeld.
- Een niet-root gebruikersaccount ingesteld met sudo-rechten op elke machine.
Hostgegevens
Eerst moeten we de details van de interfaces en adressen van de werkende servers weten. Laten we de netwerkinterfaces van ons systeem controleren:
|
1 |
ip -4 addr show scope global |
U ziet de uitvoer:
|
1 2 3 4 5 6 7 8 9 |
Voorbeeld Uitvoer 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 |
Hier toont de gemarkeerde uitvoer twee interfaces, de eerste eth0 toegewezen aan het adres 192.51.100.45, en de tweede eth1 toegewezen aan het adres 192.168.1.5. Van deze twee interfaces is de ene openbaar en de andere privé. We zullen een opdracht uitvoeren om de twee te onderscheiden en de openbare interface te achterhalen, degene die is verbonden met uw standaardgateway. Typ om te onderscheiden:
|
1 |
ip route show | grep default= |
U ziet de uitvoer:
|
1 2 3 |
Uitvoer: ip route show | grep default |
Fictieve gegevens voor de handleiding
We zullen in deze handleiding fictieve adressen en interfacetoewijzingen gebruiken. Het staat u vrij om deze gegevens te gebruiken of te vervangen, zoals u dat wilt.
Netwerkgegevens webserver:
-
Openbaar IP-adres: 203.0.113.2
-
Privé-IP-adres: 192.0.2.2
-
Openbare interface: eth0
-
Privé-interface: eth1
Netwerkgegevens firewall:
-
Openbaar IP-adres: 203.0.113.15
-
Privé-IP-adres: 192.0.2.15
-
Openbare interface: eth0
-
Privé-interface: eth1
Webserver instellen
Laten we beginnen met onze webserverhost. Log eerst in met uw sudo gebruiker.
Nginx installeren
Eerst zullen we Nginx installeren op onze webserverhost en deze vergrendelen zodat deze alleen luistert naar de privé-interface. Dit zorgt ervoor dat onze webserver alleen beschikbaar is als we port forwarding op de juiste manier hebben ingesteld.
Werk vervolgens de lokale pakketcache bij en gebruik apt om Nginx te downloaden en te installeren:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Beperkingen toevoegen
Zodra we Nginx op onze webserverhost hebben geïnstalleerd, vergrendelen we deze om ervoor te zorgen dat deze alleen invoer van privé-interfaces accepteert en nergens anders vandaan. Dit zorgt er ook voor dat onze webservers alleen actief zijn als de port forwarding-configuratie correct is.
Om beperkingen toe te voegen, opent u het standaard configuratiebestand voor het serverblok /etc/nginx/sites-enabled/default in een teksteditor naar keuze (hier gebruiken we de nano-teksteditor), en typ:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
In de uitvoer zie je de listen-richtlijn twee keer verschijnen:

In deze handleiding gebruiken we de eerste richtlijn om IPv4-doorsturen te demonstreren. De tweede, die is geconfigureerd voor IPv6, kan worden verwijderd. Voeg het privé-IP-adres van je webserver toe met een dubbele punt net voor de 80 om Nginx te laten weten dat invoer alleen van de privé-interface mag worden geaccepteerd. Bewerk vervolgens de richtlijn:

Sla het bestand op en sluit het als je klaar bent. Controleer of er geen syntaxisfouten zijn voordat je verdergaat. Laten we het bestand testen:
|
1 |
sudo nginx -t |

Als er geen foutmelding wordt weergegeven, kun je Nginx herstarten en de nieuwe configuratie inschakelen:
|
1 |
sudo service nginx restart |
Verificatie van de netwerkbeperking
Laten we het toegangsniveau tot onze webserver verifiëren. Probeer toegang te krijgen tot de webserver via de privé-interface met behulp van het curl -commando:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Je ziet de uitvoer:

Als we proberen de openbare interface te gebruiken, kunnen we geen verbinding maken:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
Dit is precies wat we verwachtten.
De firewall configureren om poort 80 door te sturen
Laten we verdergaan met het implementeren van poortdoorsturing op onze firewall-machine.
Doorsturen inschakelen in de kernel
Standaard is poortdoorsturing op de meeste systemen UITGESCHAKELD. We zullen wijzigingen aanbrengen om poortdoorsturing IN te schakelen door een paar aanpassingen te doen. Er is ook een optie om poortdoorsturing permanent IN te schakelen met behulp van de sudo -rechten, zoals getoond in de volgende stappen.
Om verkeersdoorsturing op kernelniveau IN te schakelen, typ je:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Om poortdoorsturing permanent IN te schakelen, bewerk je het /etc/sysctl.conf-bestand. Open het bestand met sudo -rechten en typ:
|
1 |
sudo nano /etc/sysctl.conf |
Zoek daarin de regel die er als volgt uitziet en verwijder het commentaarteken:
|
1 |
net.ipv4.ip_forward=1 |
Sla het bestand op en sluit het als je klaar bent. Gebruik vervolgens de sysctl -commando's om de wijzigingen in de instellingen toe te passen zodat deze effectief worden:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Basis firewall-configuratie
Lees eerst de handleiding over hoe je een basis-firewall instelt op je machine. Na voltooiing heb je:
- Geïnstalleerd: iptables-persistent
- De standaardregelset opgeslagen in /etc/iptables/rules.v4
- Uitgebreide kennis van het toevoegen en wijzigen van regels met behulp van het iptables -commando
Je kunt ook kijken naar hoe je iptables-firewallregels kunt weergeven en verwijderen.
De doorstuurregels toevoegen
We configureren onze firewall om ervoor te zorgen dat verkeer dat binnenkomt op onze openbare interface ( eth0 ) op poort 80 wordt doorgestuurd naar onze privé-interface ( eth1). Standaard heeft onze basis-firewall een FORWARD chain die is ingesteld om verkeer te DROP -pen. Het toevoegen van firewallregels maakt het mogelijk om verbindingen door te sturen naar onze webserver. Voor extra beveiliging zullen we de firewallregels vergrendelen om alleen specifieke doorstuurverzoeken toe te staan.
In de FORWARD chain accepteren we nieuwe verbindingen die bestemd zijn voor poort 80 die afkomstig zijn van onze openbare interface en naar onze privé-interface gaan. We identificeren de nieuwe verbindingen met behulp van de conntrack extensie en vertegenwoordigen ze door een TCP SYN -pakket:
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
Je moet al het daaropvolgende verkeer in beide richtingen toestaan dat voortvloeit uit de inkomende verbinding. Typ de onderstaande commando's om ESTABLISHED en RELATED -verkeer toe te staan tussen onze openbare en privé-interfaces:
|
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 |
Laten we controleren of ons beleid op de FORWARD chain is ingesteld op DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Tot nu toe hebben we een paar regels toegevoegd die verkeer tussen onze openbare en privé-interfaces door onze firewall laten gaan. Echter, iptables is nog niet geïnformeerd om het verkeer te sturen omdat de configuratie van de firewallregels nog moet worden gedaan. In de volgende stappen zullen we de NAT-regels toevoegen en de permanente regelset aanpassen om het verkeer te sturen.
De NAT-regels toevoegen om pakketten te sturen
We zullen twee afzonderlijke bewerkingen uitvoeren zodat iptables de pakketten correct kan wijzigen en de communicatie met de clients en de webserver kan stroomlijnen.
DNAT is de eerste bewerking die begint met de PREROUTING chain van de nat tabel. De bewerking wijzigt het bestemmingsadres van het pakket en zorgt ervoor dat het correct wordt gerouteerd wanneer het tussen netwerken reist. De clients op het openbare netwerk maken echter verbinding met onze firewallserver en hebben geen informatie over de topologie van ons privénetwerk. Om informatie uit te wisselen met het privénetwerk, wijzigt u het bestemmingsadres van elk pakket zodat het onze bestemmingswebserver correct kan bereiken.
Het is cruciaal om op te merken dat we ons richten op het configureren van port forwarding. Het uitvoeren van NAT op elk pakket dat de firewall bereikt, maakt geen deel uit van onze handleiding. We zullen pakketten op poort 80 koppelen aan het privé-IP-adres van onze webserver:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
Het pakket wordt correct gerouteerd naar onze webserver met het oorspronkelijke adres van de client als bronadres. Ondanks pogingen van de server om het antwoord rechtstreeks naar dat adres te sturen, zal het niet mogelijk zijn om een legitieme TCP-verbinding tot stand te brengen.
Om een juiste routering te configureren, wijzigen we het bronadres van het pakket. Laten we het bronadres bewerken naar het privé-IP-adres van onze firewallserver. Na de wijziging wordt het antwoord teruggestuurd naar de firewall, die het weer doorstuurt naar de client.
Om deze functionaliteit in te schakelen, voegt u een regel toe aan de POSTROUTING chain van de nat tabel die wordt geëvalueerd vlak voordat pakketten op het netwerk worden verzonden. Koppel vervolgens de pakketten die bestemd zijn voor onze webserver op basis van IP-adres en poort:
|
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 |
Zodra deze regel van kracht is, zou onze webserver toegankelijk moeten zijn door onze webbrowser naar het openbare adres van onze firewallmachine te verwijzen:
|
1 |
curl 203.0.113.15 |
U ziet de uitvoer:

Onze port forwarding-configuratie is voltooid.
De permanente regelset aanpassen
Na het voltooien van de port forwarding-configuratie slaan we dit op in onze permanente regelset. Als u de opmerkingen in de huidige regelset wilt behouden, gebruikt u de iptables-persistent service om uw regels op te slaan:
|
1 |
sudo service iptables-persistent save |
U kunt het ook openen en handmatig bewerken om de opmerkingen in uw bestand te behouden:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Configureer vervolgens de filter tabel en de nat tabel om respectievelijk de FORWARD chain-regels en ROUTING regels toe te voegen. Het aanpassen van de nat tabel stelt ons in staat om PREROUTING and POSTROUTING regels toe te voegen, zoals in het onderstaande voorbeeld wordt getoond:
|
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/regels.v4 *filter # Sta al het uitgaande verkeer toe, maar weiger standaard inkomende en doorsturende pakketten :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Aangepaste ketens per protocol :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Acceptabel UDP-verkeer # Acceptabel TCP-verkeer -A TCP -p tcp --dport 22 -j ACCEPT # Acceptabel ICMP-verkeer # Standaard acceptatiebeleid -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Weiger ongeldige pakketten -A INPUT -m conntrack --ctstate INVALID -j DROP # Stuur verkeer door naar protocolspecifieke ketens ## Sta alleen nieuwe verbindingen toe (tot stand gebrachte en gerelateerde verbindingen zouden al moeten zijn afgehandeld) ## Sta voor TCP daarnaast alleen nieuwe SYN-pakketten toe, aangezien dat de enige geldige ## methode is om een nieuwe TCP-verbinding tot stand te brengen -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 # Weiger alles wat tot dit punt is doorgekomen ## Probeer protocolspecifiek te zijn met het weigeringsbericht -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 # Regels om poort 80 door te sturen naar onze webserver # Netwerkdetails webserver: # * Openbaar IP-adres: 203.0.113.2 # * Privé IP-adres: 192.0.2.2 # * Openbare interface: eth0 # * Privé-interface: eth1 # # Netwerkdetails firewall: # # * Openbaar IP-adres: 203.0.113.15 # * Privé IP-adres: 192.0.2.15 # * Openbare interface: eth0 # * Privé-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 # Einde van Forward-filterregels # Wijzigingen doorvoeren 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] # Regels om verzoeken voor poort 80 van de openbare interface te vertalen # zodat we correct kunnen doorsturen naar de webserver via de # privé-interface. # Netwerkdetails webserver: # * Openbaar IP-adres: 203.0.113.2 # * Privé IP-adres: 192.0.2.2 # * Openbare interface: eth0 # * Privé-interface: eth1 # # Netwerkdetails firewall: # # * Openbaar IP-adres: 203.0.113.15 # * Privé IP-adres: 192.0.2.15 # * Openbare interface: eth0 # * Privé-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 # Einde van NAT-vertalingen voor webserververkeer 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 |
Sla het bestand op en sluit het na het toevoegen van de bovenstaande waarden. Typ vervolgens de onderstaande opdracht om de syntaxis van uw regels te testen:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Als u geen fouten ziet, laadt u de regelset:
|
1 |
sudo service iptables-persistent reload |
Laten we controleren of onze webserver nog steeds toegankelijk is via het openbare IP-adres van uw firewall:
|
1 |
curl 203.0.113.15 |
Conclusie
Aan het einde van deze handleiding bent u vertrouwd met het doorsturen van poorten op een Linux-server met iptables. U kunt de mogelijkheden voor poortdoorsturing gebruiken om de topologie van uw privénetwerk te verbergen, terwijl u het serviceverkeer soepel door uw gateway-firewall laat stromen.
Omdat het proces expliciet afhankelijk is van uw netwerkbeveiliging en de gebruikte poorten, is het veilig. Er is mogelijk een risico als u geen beveiligingsfirewall of VPN-beveiliging op uw netwerk hebt. Daarom is het raadzaam om de firewall te configureren zoals besproken in deze handleiding. We hopen dat deze gids u helpt veilig te blijven op het internet wanneer u uw privénetwerk gebruikt.
Om meer firewall-oplossingen te ontdekken die u op uw systeem kunt implementeren, kunt u deze bronnen bekijken op onze blog:
- Een firewall configureren met UFW op Ubuntu 18.04
- Een firewall instellen met FirewallD op CentOS 7
- De basisprincipes van UFW: de essentiële firewall-opdrachten leren
Veel computerplezier!
Reacties
Nog geen reacties. Wees de eerste.