← Terug naar blog

Port forwarding achter NAT of CGNAT

SSH-logo

Er zijn meerdere manieren om een lokale poort via internet bereikbaar te maken. Deze methoden werken achter normale NAT-routers, maar ook achter Carrier Grade NAT (CGNAT). CGNAT wordt vaak gebruikt bij LTE/4G-internetverbindingen.

Methoden in dit artikel:

  • via SSH op je eigen webserver of VPS
  • via ngrok
  • via Serveo
  • via OpenVPN server op je webserver of VPS
    • VPN-methode 1: proxy op Apache 2
    • VPN-methode 2: port forward op de VPS

In de voorbeelden forwarden we lokale poort 8080 naar internetpoort 18080.

Port forward via OpenSSH op je VPS

Voor SSH port tunneling moet GatewayPorts op yes staan:

$ sshd -T|grep -i gatewayports
gatewayports yes

Staat daar no, pas dan /etc/ssh/sshd_config aan:

$ vi /etc/ssh/sshd_config
GatewayPorts yes

Herstart SSH:

$ systemctl restart ssh

Daarna kun je vanaf de lokale machine een reverse tunnel starten:

$ ssh -l root -R :18080:localhost:8080 my-vps.com

Serveo

Als je geen eigen VPS wilt gebruiken, kan Serveo handig zijn. Je hoeft niets te installeren en hebt geen account nodig:

$ ssh -R 18080:localhost:8080 serveo.net
Hi there
Forwarding TCP connections from serveo.net:18080

ngrok

Download ngrok via het dashboard, pak het zipbestand uit en authenticatieer de client:

$ unzip /path/to/ngrok.zip
$ ./ngrok authtoken 3e5iY2KftJ2844aWA6jDY_9fJFZAc1Hhq5bJ4eD1myV

Start daarna de tunnel:

$ ./ngrok http 8080

ngrok toont vervolgens een publieke URL die naar je lokale poort 8080 verwijst.

OpenVPN server configuratie

Bij een OpenVPN-oplossing verbind je de lokale machine met je VPS en forward je daarna via die VPN-verbinding.

Packet forwarding activeren

Op Linux moet IP forwarding aan staan:

$ echo 1 > /proc/sys/net/ipv4/ip_forward

$ vi /etc/sysctl.conf
net.ipv4.ip_forward=1

Voeg in server.conf onder andere toe:

client-to-client
keepalive 15 60
ping-timer-rem
ifconfig-pool-persist /etc/openvpn/ipp
sysctl -w net.ipv4.ip_forward=1

Herstart OpenVPN:

$ service openvpn start

VPN-methode 1: proxy op Apache 2

Voordeel van deze methode is dat je het Let’s Encrypt certificaat van je webserver kunt gebruiken. Intern in je lokale netwerk is HTTP vaak voldoende.

<IfModule mod_ssl.c>
        Listen 18080
        <VirtualHost *:18080>
                ProxyPreserveHost On
                ProxyRequests Off
                ServerName myserver.com
                SSLProxyEngine On

                ProxyPass "/" "http://192.168.1.5:8080/"
                ProxyPassReverse "/" "http://192.168.1.5:8080/"

                SSLEngine on
                SSLCertificateFile /etc/letsencrypt/live/myserver.com/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/myserver.com/privkey.pem
        </VirtualHost>
</IfModule>

Activeer de configuratie:

$ cd /etc/apache2/sites-enabled/
$ ln -s ../sites-available/application_example.conf
$ systemctl restart apache2.service

VPN-methode 2: port forward op de VPS

In dit voorbeeld heeft de lokale machine IP 192.168.1.5:

$ vi /etc/rc.local
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 18080 -j DNAT --to-destination 192.168.1.5:8080
iptables -t nat -A POSTROUTING -d 192.168.1.5/32 -p tcp -m tcp --dport 8080 -j MASQUERADE