La directive REDIRECT d'iptables est la méthode appropriée pour le transfert de port sur la même machine :
sudo iptables -t nat -A PREROUTING -p tcp -d 192.168.47.5 --dport 7777 -j REDIRECT --to-port 3000
À titre d'exemple de démonstration et de vérification, je vais utiliser un ordinateur situé à l'adresse 192.168.111.122 et rediriger le port 7777 vers le port 22, où se trouve sshd. Donc (remarquez que j'ai ajouté un qualificatif d'interface réseau) :
sudo iptables -t nat -A PREROUTING -i enp3s0 -p tcp -d 192.168.111.122 --dport 7777 -j REDIRECT --to-port 22
Maintenant, j'utilise un autre ordinateur à 192.168.111.1 pour le vérifier (note : je n'essaie pas vraiment de faire du telnet, je vérifie juste s'il peut se connecter) :
doug@DOUG-64:~$ telnet 192.168.111.122 7777
Trying 192.168.111.122...
Connected to 192.168.111.122.
Escape character is '^]'.
SSH-2.0-OpenSSH_8.1p1 Ubuntu-5
Invalid SSH identification string.
Connection closed by foreign host.
doug@DOUG-64:~$
O.K. ça semble O.K. Essayez ssh :
doug@DOUG-64:~$ ssh -p 7777 192.168.111.122
doug@192.168.111.122's password:
Welcome to Ubuntu Focal Fossa (development branch) (GNU/Linux 5.5.0-rc6-stock x86_64)
... a bunch deleted ...
Last login: Fri Feb 7 15:32:45 2020 from 192.168.111.1
doug@s18:~$
doug@s18:~$ logout
Connection to 192.168.111.122 closed.
doug@DOUG-64:~$
Et vérifiez également les communications au niveau des paquets, pendant une session, via une session tcpdump (ou wireshark, si vous préférez) sur 192.168.111.122 :
doug@s18:~/temp-git-git$ sudo tcpdump -n -nn -tttt -i enp3s0 port 7777
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes
2020-02-07 15:37:16.480311 IP 192.168.111.1.45918 > 192.168.111.122.7777: Flags [S], seq 494277163, win 29200, options [mss 1460,sackOK,TS val 349415894 ecr 0,nop,wscale 7], length 0
2020-02-07 15:37:16.480329 IP 192.168.111.122.7777 > 192.168.111.1.45918: Flags [S.], seq 2825406220, ack 494277164, win 65160, options [mss 1460,sackOK,TS val 2718854230 ecr 349415894,nop,wscale 7], length 0
2020-02-07 15:37:16.480600 IP 192.168.111.1.45918 > 192.168.111.122.7777: Flags [.], ack 1, win 229, options [nop,nop,TS val 349415894 ecr 2718854230], length 0
2020-02-07 15:37:16.486525 IP 192.168.111.122.7777 > 192.168.111.1.45918: Flags [P.], seq 1:33, ack 1, win 510, options [nop,nop,TS val 2718854236 ecr 349415894], length 32
2020-02-07 15:37:16.486668 IP 192.168.111.1.45918 > 192.168.111.122.7777: Flags [.], ack 33, win 229, options [nop,nop,TS val 349415896 ecr 2718854236], length 0
2020-02-07 15:37:18.016165 IP 192.168.111.1.45918 > 192.168.111.122.7777: Flags [P.], seq 1:3, ack 33, win 229, options [nop,nop,TS val 349416278 ecr 2718854236], length 2
2020-02-07 15:37:18.016175 IP 192.168.111.122.7777 > 192.168.111.1.45918: Flags [.], ack 3, win 510, options [nop,nop,TS val 2718855766 ecr 349416278], length 0
2020-02-07 15:37:18.016262 IP 192.168.111.122.7777 > 192.168.111.1.45918: Flags [P.], seq 33:67, ack 3, win 510, options [nop,nop,TS val 2718855766 ecr 349416278], length 34
2020-02-07 15:37:18.016408 IP 192.168.111.122.7777 > 192.168.111.1.45918: Flags [FP.], seq 67:69, ack 3, win 510, options [nop,nop,TS val 2718855766 ecr 349416278], length 2
2020-02-07 15:37:18.016428 IP 192.168.111.1.45918 > 192.168.111.122.7777: Flags [.], ack 67, win 229, options [nop,nop,TS val 349416278 ecr 2718855766], length 0
2020-02-07 15:37:18.016589 IP 192.168.111.1.45918 > 192.168.111.122.7777: Flags [F.], seq 3, ack 70, win 229, options [nop,nop,TS val 349416278 ecr 2718855766], length 0
2020-02-07 15:37:18.016600 IP 192.168.111.122.7777 > 192.168.111.1.45918: Flags [.], ack 4, win 510, options [nop,nop,TS val 2718855766 ecr 349416278], length 0
12 packets captured
12 packets received by filter
0 packets dropped by kernel
doug@s18:~/temp-git-git$ sudo iptables -t nat -v -x -n -L
Chain PREROUTING (policy ACCEPT 38 packets, 4409 bytes)
pkts bytes target prot opt in out source destination
4 240 REDIRECT tcp -- enp3s0 * 0.0.0.0/0 192.168.111.122 tcp dpt:7777 redir ports 22
Chain INPUT (policy ACCEPT 40 packets, 4329 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2 packets, 228 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 2 packets, 228 bytes)
pkts bytes target prot opt in out source destination
doug@s18:~/temp-git-git$
Les compteurs de paquets sont très utiles. Notez que le chemin PREROUTING ne sera parcouru qu'une seule fois par connexion (je l'avais fait 4 fois, lorsque j'ai exécuté la commande ci-dessus).
Si vous faites une erreur et que vous devez supprimer vos règles et recommencer, faites-le :
sudo iptables -t nat -F
pour effacer les règles de la table nat. Cette réponse devra peut-être être intégrée dans un ensemble de règles iptables plus important ou dans un contexte UFW.
EDIT : Oh, au fait :
doug@s18:~/temp-git-git$ grep . /proc/sys/net/ipv4/conf/*/forwarding
/proc/sys/net/ipv4/conf/all/forwarding:0
/proc/sys/net/ipv4/conf/default/forwarding:0
/proc/sys/net/ipv4/conf/enp3s0/forwarding:0
/proc/sys/net/ipv4/conf/lo/forwarding:0
doug@s18:~/temp-git-git$ grep . /proc/sys/net/ipv4/ip_forward
0