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
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
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
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.
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
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
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.
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.
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
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