Simple port forwarding using nftables

By | 24 Oct 2024

After adding a new penguin to my zoo and moving around a few services, I had the need to re-route HTTPS traffic to a different host for doing all the SSL handling (which would then send a request back – but via HTTP on a different port). The simplest way to do this is to use the built-in capabilities of the default packet filter. In my case this is nftables.

A quick search brought up Jens Depuydt’s very detailed post. It’s easy to follow and after some tweaking I ended up running these commands to setup my forwarding:

# sudo nft flush ruleset
# sudo nft add table nat
# sudo nft 'add chain nat prerouting { type nat hook prerouting priority -100 ; }'
# sudo nft 'add rule nat prerouting ip daddr 192.168.0.XXX tcp dport { 443 } dnat 192.168.0.YYY:443'Code language: PHP (php)

(Masquerading messed with Docker containers on that system not being able to reach external destinations properly. And it wasn’t needed for my use-case anyways.)

Due to Docker being installed on that host, my net.ipv4.ip_forward value was already set to 1.

After verifying that the forwarding works as expected, it was time to make this config permanent. There were already a few lines in my /etc/nftables.conf, so I’ve decided to append this new config by running:

# sudo nft list ruleset | sudo tee -a /etc/nftables.confCode language: PHP (php)

And, finally, I needed to enable the nftables service so the config is properly read and applied at bootup:

# sudo systemctl enable nftablesCode language: PHP (php)

After a proper reboot (and getting a bit nervous because Docker took its bloody time to start) everything was still working as expected – including the new port forwarding.

Leave a Reply

Your email address will not be published. Required fields are marked *

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)