8 votes

DNAT vers 127.0.0.1 avec iptables / Contrôle d'accès à la destination pour un proxy SOCKS transparent

J'ai un serveur fonctionnant sur mon réseau local qui fait office de routeur pour les ordinateurs de mon réseau. Je veux maintenant faire en sorte que les requêtes TCP sortantes vers certaines adresses IP soient tunnelisées par une connexion SSH, sans donner aux personnes de mon réseau la possibilité d'utiliser ce tunnel SSH pour se connecter à des hôtes arbitraires.

L'approche que j'avais en tête jusqu'à présent consistait à avoir une instance de chaussettes rouges écoutant sur localhost et pour rediriger toutes les requêtes sortantes vers les adresses IP que je veux détourner vers cette instance de redsocks. J'ai ajouté la règle iptables suivante :

iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:12345

Apparemment, le noyau Linux considère les paquets provenant d'une adresse non 127.0.0.0/8 vers une adresse 127.0.0.0/8 comme des "paquets martiens" et les supprime. Ce qui a fonctionné, cependant, était de faire écouter redsocks sur eth0 au lieu de lo et ensuite de faire en sorte qu'iptables DNAT les paquets vers l'adresse eth0 à la place (ou en utilisant une règle REDIRECT). Le problème est que chaque ordinateur de mon réseau peut alors utiliser l'instance de redsocks pour se connecter à tous les hôtes sur Internet, mais je veux limiter son utilisation à un certain ensemble d'adresses IP.

Existe-t-il un moyen de faire en sorte qu'iptables envoie les paquets DNAT vers 127.0.0.1 ? Sinon, quelqu'un a-t-il une idée de la façon dont je pourrais atteindre mon objectif sans ouvrir le tunnel à tout le monde ?

更新しました。 J'ai également essayé de changer la source des paquets, sans succès :

iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -d 1.2.3.4 -j SNAT --to-source 127.0.0.1
iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -d 127.0.0.1 -j SNAT --to-source 127.0.0.1

7voto

Pieter Points 618

J'ai trouvé la solution à l'échec de mon dnat vers 127.0.0.1(loopback), j'ai eu la réponse sur le canal irc de netfilter.

Il y a un paramètre sysctl qui permet à dnat de boucler. Pour l'autoriser

sysctl -w net.ipv4.conf.eth0.route_localnet=1

et pour vérifier le réglage

cat /proc/sys/net/ipv4/conf/eth0/route_localnet

5voto

hardwork Points 101

Vous ne pouvez pas faire cette astuce avec le réseau 127/8 car il est spécialement conçu dans le noyau linux. Mais vous pouvez créer une interface réseau fictive, lui attribuer une adresse IP, lier votre service à cette adresse et faire du NAT.

root@vm8583:~# ip link add bogus type dummy
root@vm8583:~# sysctl net.ipv4.conf.eth0.arp_ignore=3
root@vm8583:~# ip addr add 10.0.0.1/32 bogus scope host
root@vm8583:~# ip link set bogus up
root@vm8583:~# ip link show bogus
4: bogus: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT 
    link/ether 5e:8b:38:f3:46:ce brd ff:ff:ff:ff:ff:ff

Remarque, vous devrez peut-être définir net.ipv4.conf.eth0.arp_ignore=3 donc votre le serveur ne répond pas aux requêtes ARP pour 10.0.0.1 entrant via eth0 :

arp_ignore - INTEGER
    Define different modes for sending replies in response to
    received ARP requests that resolve local target IP addresses:
. . .
    3 - do not reply for local addresses configured with scope host,
    only resolutions for global and link addresses are replied
    4-7 - reserved

1voto

mgorven Points 29736

Vous pouvez essayer de désactiver filtrage du chemin inverse à la place (ce qui, selon l'AFAICT, est ce que signifie le terme "martien"). Vous pouvez faire cela avec echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter en tant que racine. (Il se peut que vous ne puissiez le désactiver que sur l'ordinateur de l'utilisateur. lo mais j'essaierais de la désactiver complètement dans un premier temps).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X