9 votes

Comment puis-je rediriger les ports HTTP et SSH vers mon serveur interne à l'aide d'iptables ?

Je n'ai pas de routeur et j'ai donc transformé mon système Linux CentOS 6.4 en routeur, transférant le trafic du réseau public vers mon réseau local. Il possède deux cartes NIC, une pour l'adresse IP publique (eth1) et une autre pour l'adresse IP privée (eth2).

J'ai un serveur connecté à mon réseau local, disons à l'adresse suivante 192.168.1.2 .

Routeur

  • eth1 : x.x.x.x l'adresse IP publique
  • eth2 : 192.168.1.1 l'adresse du routeur interne

Lorsque quelqu'un d'un réseau extérieur exécute ssh sur l'IP publique, il doit être redirigé vers le serveur :

ssh x.x.x.x ou en utilisant PuTTY

J'ai désactivé les pare-feu SELinux et iptables sur le serveur. J'ai essayé quelques modifications d'iptables sur le routeur du système Linux, mais la requête SSH n'est toujours pas redirigée :

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22

Je souhaite également transférer tout le trafic HTTP (80) vers mon serveur interne à l'aide d'iptables depuis le même routeur du système Linux.

8voto

cheezsteak Points 113

Tout d'abord, assurez-vous que le transfert de paquets est activé dans le noyau.

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

Vous pouvez également la rendre permanente en ajoutant la ligne ci-dessous à /etc/sysctl.conf

net.ipv4.ip_forward = 1

Vous devez effectuer cette opération sur une machine Linux faisant office de routeur. Vous pouvez essayer la règle suivante sur le routeur.

iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j  DNAT --to-destination 192.168.1.2:22

Indiquez-nous également le résultat de vos règles NAT à partir du routeur.

iptables -t nat -L -n -v

3voto

sancro Points 51

Sur la base de cette étonnante DigitalOcean sur la façon de transférer des ports, j'ai décidé de le réécrire ici.

J'ai passé de nombreuses heures à faire des recherches sur la façon dont cela fonctionne Je suis nouveau sous linux et les débuts ne sont pas toujours faciles Voici un exemple de mes serveurs et de sa redirection de port :

Serveur pare-feu (2 cartes NIC) - détails du réseau :

  • Adresse IP publique : xx.xx.xx.xx
  • Adresse IP privée : yy.yy.yy.yy
  • Interface publique : eth0
  • Interface privée : eth1

Interne (par exemple, ssh, web) (1 carte NIC) - détails du réseau :

  • Adresse IP privée : zz.zz.zz.zz
  • Interface privée : eth0

Solution :

Activer le transfert de paquets dans le noyau :

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

Définir les variables :

# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"

# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"

# Services:
SSH="22"
HTTP="80"

Iptables port forwarding (avec -m conntrack) :

iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip

Quelques notes :

  • "..-s $ADMIN -d $FW_eth0_ip " (1ère ligne) - ajouté uniquement pour des raisons de sécurité - cela signifie que seule l'IP ADMIN peut accéder à SSH (si ce n'est pas nécessaire, vous pouvez le supprimer).
  • -m conntrack est identique à -m état
  • Je recommande de changer le port par défaut de SSH pour un autre port, comme 1xxxx (dans /etc/ssh/sshd_config).
  • vérifier Liste des numéros de port TCP et UDP
  • J'utilise le port 15xx1 pour accéder à SSH sur le serveur Firewall, et le port 15xxx2 pour l'accès interne.

Terminal :

# access firewall server
$ ssh sancro@xx.xx.xx.xx -p 15xx1

# access internal server
$ ssh sancro@xx.xx.xx.xx -p 15xx2

Plus de détails sur les règles utilisées sont parfaitement décrits dans le tutoriel mentionné.

C'est tout ce que j'ai à dire, j'espère que cela vous aidera.

1voto

Gabriel Talavera Points 1357

Tout d'abord, activez le routage dans la passerelle Linux :

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

Ajoutez ensuite les règles suivantes avec votre interface réseau (par exemple, eth1) et les ports souhaités :

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Vérifiez vos règles avec iptables -L -v Les colonnes pkts et bytes indiquent les règles qui sont respectées.

1voto

Noam Manos Points 267

Bien que cette question concerne iptables, si vous avez également FirewallD, voici comment accéder à HTTP sur le réseau interne.

Autorisez d'abord le trafic http dans le pare-feu de votre serveur interneD :

# firewall-cmd --permanent --add-service=http

Transférer ensuite le trafic http de l'adresse IP externe vers le port 80 de l'adresse IP interne :

# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11

La même chose peut être faite pour le service SSH.

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