web-dev-qa-db-fra.com

Transfert de port & NAT avec nftables

J'ai une passerelle OpenWrt (19,07 construit à soi-même, le noyau 4.14.156) qui se trouve sur une adresse IP publique devant mon réseau privé. J'utilise nftables (non iptables).

Je voudrais exposer un port non standard sur l'adresse publique et le transmettre à un port standard sur une machine derrière la passerelle. Je pense que cela était appelé transfert de ports: cela ressemblerait à votre machine de passerelle fournissait, disons, service http, mais c'était vraiment une machine derrière la passerelle sur une adresse privée.

Voici ma configuration NFTABLES. À ces fins, mon "service standard" est sur le port 1234 et je souhaite permettre au public d'y accéder à la passerelle: 4321.

#!/usr/sbin/nft -ef
# 
# nftables configuration for my gateway
#

flush ruleset

table raw {
        chain prerouting {
                type filter hook prerouting priority -300;
                tcp dport 4321 tcp dport set 1234 log prefix "raw " notrack;
        }
}

table ip filter {
        chain output {
                type filter hook output priority 100; policy accept;
                tcp dport { 1234, 4321 } log prefix "output ";
        }

        chain input {
                type filter hook input priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "input " accept;
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "forward " accept;
        }
}

table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200;
        }

        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                tcp dport { 1234, 4321 } log prefix "nat-post ";
                oifname "eth0" masquerade;
        }
}

En utilisant cette configuration, les machines externes peuvent accéder à la machine privée à gateway:1234. La journalisation montre nat-pre Syn Packet à partir d'une adresse IP externe à passerelle, puis forward de l'adresse IP externe à interne, puis nat-post de l'extérieur à interne et de "connexion existante" s'occupe du reste des paquets.

Machines externes qui se connectent à gateway:4321 Connectez-vous comme raw, où le 4321 est modifié en 1234. Ensuite, le paquet SYN est transféré sur le serveur interne, le paquet Syn Répondre revient et ... rien!

Je pense que le problème est que je ne fais pas la configuration NFTABLES qui changerait le internal:1234 retour à gateway:4321, que la machine distante attend. Même si masquerade change internal:1234 à gateway:1234, la machine distante ne s'attend pas à cela et de le jeter probablement.

Des idées pour cette configuration?

3
Dave M.

Vous ne traduisez pas le numéro de port. Lorsque la connexion externe est au port 1234, ce n'est pas un problème. Mais lorsqu'il est à 4321, le DNAT traverse le port 4321 sur le serveur interne, pas le port 1234. Essayez

tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200:1234;

Vous n'avez pas besoin de traduire les paquets de réponse revenus de votre serveur interne. Ceci est fait automatiquement à l'aide de l'entrée dans la table de suivi de la connexion créée sur le premier paquet SYN.

4
Steve Brandli