web-dev-qa-db-fra.com

apache n'accepte pas les connexions entrantes de l'extérieur de localhost

J'ai démarré un serveur CentOS sur rack et exécuté yum install httpd 'd. Puis services httpd start. Donc, juste les barebones.

Je peux accéder à son adresse IP à distance via ssh (22) sans problème, donc il n'y a pas de problème avec le DNS ou quoi que ce soit (je pense ...), mais lorsque j'essaie de me connecter sur le port 80 (via un navigateur ou autre), je reçois Connexion rejetée. 

De localhost, cependant, je peux utiliser telnet (80), ou même le lynx sur lui-même et être servi sans problème. Depuis l’extérieur (ma maison, mon école, un café local, etc.), telnet se connecte sur 22, mais pas sur 80. 

J'utilise netstat -tulpn (<- Je ne vais pas mentir, je ne comprends pas la partie -tulpn, mais c'est ce que l'Internet m'a dit de faire ...) et de voir 

tcp    0    0 :::80     :::*    LISTEN    -                   

comme je crois que je devrais. Le httpd.conf dit Listen 80

J'ai services httpd restart 'plusieurs fois.

Honnêtement, je ne sais pas quoi faire. Il n'y a AUCUN moyen pour que rackspace ait un pare-feu sur les demandes entrantes du port 80. J'ai l’impression que je manque quelque chose de stupide, mais j’ai démarré deux fois un serveur barebone et j’ai fait le minimum absolu pour que cela fonctionne en pensant que j’avais tout gâché avec mon bricolage, mais cela n’a pas fonctionné. 

Toute aide est grandement appréciée! (Et désolé pour le post long et pénible ...)

Edit On m'a demandé d'afficher le résultat de iptables -L. Alors la voici:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-Host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-Host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
54
Phildo

En cas pas encore résolu. Vos iptables disent:

état LIÉ, ÉTABLI

Ce qui signifie qu’il ne laisse passer que les connexions déjà établies ... qui sont établies par vous, pas par des machines distantes. Ensuite, vous pouvez voir des exceptions à cela dans les prochaines règles:

state NEW tcp dpt:ssh

Ce qui ne compte que pour ssh, vous devriez donc ajouter une règle/ligne similaire pour http, que vous pouvez faire comme ceci:

state NEW tcp dpt:80

Ce que vous pouvez faire comme ça:

Sudo iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

(Dans ce cas, je choisis d'ajouter la nouvelle règle à la quatrième ligne)

Rappelez-vous qu'après avoir édité le fichier, vous devriez l'enregistrer comme ceci:

Sudo /etc/init.d/iptables save
107
antonio.fornie

CentOS 7 utilise maintenant firewalld par défaut. Mais toutes les réponses se concentrent sur iptables. Je voulais donc ajouter une réponse liée à firewalld.

Puisque firewalld est un "wrapper" pour iptables, utiliser la réponse d’Antonio-Fornie semble toujours fonctionner, mais j’ai été incapable de "sauvegarder" cette nouvelle règle. Je ne pouvais donc pas me connecter à mon serveur Apache dès le redémarrage du pare-feu. Heureusement, il est en réalité beaucoup plus simple d’apporter un changement équivalent avec les commandes firewalld. Commencez par vérifier si firewalld est en cours d'exécution:

firewall-cmd --state

S'il est en cours d'exécution, la réponse comportera simplement une ligne indiquant "en cours d'exécution".

Pour autoriser temporairement les connexions http (port 80) sur la zone publique:

Sudo firewall-cmd --zone=public --add-service=http

Ce qui précède ne sera pas "enregistré". Lors du prochain redémarrage du service firewalld, il reviendra aux règles par défaut. Vous devez utiliser cette règle temporaire pour tester et vous assurer qu'elle résout votre problème de connexion avant de poursuivre. 

Pour autoriser de manière permanente les connexions http sur la zone publique:

Sudo firewall-cmd --zone=public --permanent --add-service=http

Si vous exécutez la commande "permanente" sans exécuter également la commande "temporaire", vous devrez redémarrer firewalld pour obtenir vos nouvelles règles par défaut (cela pourrait être différent pour les systèmes non CentOS):

 Sudo systemctl restart firewalld.service

Si cela ne résout pas vos problèmes de connexion, c'est peut-être parce que votre interface n'est pas dans la "zone publique". Le lien suivant est une excellente ressource pour en savoir plus sur firewalld. Il explique en détail comment vérifier, attribuer et configurer des zones: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos -7

14
Josh

SELinux empêche Apache (et donc tous les modules Apache) d'établir des connexions à distance par défaut.

# setsebool -P httpd_can_network_connect=1

Essayez avec le réglage ci-dessous dans la table iptables.config 

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Exécutez la commande ci-dessous pour redémarrer le service iptable

service iptables restart

remplacez le fichier httpd.config par

Listen 192.170.2.1:80

redémarrez Apache.

Essayez maintenant.

3
Raja

Si vous utilisez RHEL/CentOS 7 (l'OP n'était pas, mais je pensais partager la solution pour mon cas), vous devrez utiliser firewalld au lieu du service iptables mentionné dans d'autres réponses.

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

Et puis vérifiez qu'il fonctionne avec:

firewall-cmd --permanent --zone=public --list-all

Il devrait inscrire 80/tcp sous ports

2
Matt Pennington

c’est ce qui a fonctionné pour que Apache soit accessible de l’extérieur:

Sudo iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
Sudo service iptables restart
1
user4806038

Recherchez la directive LISTEN dans les fichiers de configuration Apache (httpd.conf, Apache2.conf, listen.conf, ...) et si vous voyez localhost ou 127.0.0.1, vous devez écraser votre adresse IP publique.

1
Pethical

Essayez de désactiver iptables: service iptables stop

Si cela fonctionne, activez le port TCP 80 selon vos règles de pare-feu: Exécutez system-config-selinux à partir de la racine et activez le port TCP 80 (HTTP) sur votre pare-feu.

1
dAm2K

cela fonctionnerait: 

iptables -I  RH-Firewall-1-INPUT -s 192.168.1.3  -p tcp -m tcp --dport 80 -j ACCEPT

suivi par 

Sudo /etc/init.d/iptables save
1
Mr.T

Définissez Apache pour répertorier une interface spécifique et porter quelque chose comme ci-dessous:

Listen 192.170.2.1:80

Recherchez également les entrées Iptables et TCP Wrappers susceptibles d'interférer sur l'hôte avec des hôtes externes accédant à ce port

Binding Docs pour Apache

0
nsfyn55