Apache не принимает входящие соединения из-за пределов локального хоста
Я загрузил сервер CentOS в rackspace и выполнил yum install httpd
'd. Тогда services httpd start
. Итак, просто баребоны.
Я могу получить доступ к его IP-адресу удаленно по ssh (22) без проблем, поэтому нет проблем с DNS или чем-нибудь (я думаю...), но когда я пытаюсь подключиться к порту 80 (через браузер или что-то еще ) Я получаю связь отказался.
Однако из localhost я могу использовать telnet (80) или даже lynx на себе и без проблем обслуживать. Снаружи (мой дом, моя школа, локальный кафе и т.д.), Telnet подключается к 22, но не 80.
Я использую netstat -tulpn
(< - я не собираюсь врать, я не понимаю часть -tulpn
, но то, что интернет сказал мне делать...) и см.
tcp 0 0 :::80 :::* LISTEN -
как мне кажется. httpd.conf
говорит Listen 80
.
У меня services httpd restart
'd много раз.
Честно говоря, я понятия не имею, что делать. Нет никакого способа, чтобы в rackspace был брандмауэр для входящих запросов 80-го порта. Я чувствую, что мне не хватает чего-то глупого, но я уже дважды загрузил сервер barebones и выполнил абсолютный минимум, чтобы получить это функционирование, думая, что я все испортил, но не работал.
Любая помощь очень ценится! (И извините за длинную ветку...)
Edit
Меня попросили опубликовать вывод iptables -L
. Итак, вот оно:
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
Ответы
Ответ 1
В случае, если он еще не решен. Ваши iptables говорят:
состояние RELATED, ESTABLISHED
Это означает, что он позволяет передавать только уже установленные соединения... созданные вами, а не удаленные машины. Затем вы можете увидеть исключения из этого в следующих правилах:
state NEW tcp dpt:ssh
Что считается только для ssh, поэтому вы должны добавить аналогичное правило/строку для http, которое вы можете сделать следующим образом:
state NEW tcp dpt:80
Что вы можете сделать следующим образом:
sudo iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
(В этом случае я хочу добавить новое правило в четвертую строку)
Помните, что после редактирования файла вы должны сохранить его следующим образом:
sudo /etc/init.d/iptables save
Ответ 2
CentOS 7 теперь использует firewalld по умолчанию. Но все ответы сосредоточены на iptables. Поэтому я хотел добавить ответ, связанный с firewalld.
Поскольку firewalld является "оберткой" для iptables, использование antonio-fornie-ответа по-прежнему работает, но я не смог "сохранить" это новое правило. Таким образом, я не смог подключиться к моему серверу apache, как только произошел перезапуск брандмауэра. К счастью, на самом деле гораздо проще сделать эквивалентное изменение с помощью команд firewalld. Сначала проверьте, работает ли firewalld:
firewall-cmd --state
Если он работает, ответ будет просто одной строкой, которая говорит "running".
Чтобы временно разрешить соединения http (порт 80) в общественной зоне:
sudo firewall-cmd --zone=public --add-service=http
Вышеуказанное не будет "сохранено", в следующий раз, когда перезапустится служба firewalld, он вернется к правилам по умолчанию. Вы должны использовать это временное правило для проверки и убедиться, что оно решит проблему с подключением, прежде чем двигаться дальше.
Чтобы навсегда разрешить http-соединения в общедоступной зоне:
sudo firewall-cmd --zone=public --permanent --add-service=http
Если вы выполняете "постоянную" команду, не выполняя "временную" команду, вам необходимо перезапустить firewalld, чтобы получить новые правила по умолчанию (это может отличаться для систем, отличных от CentOS):
sudo systemctl restart firewalld.service
Если это не решило проблемы с подключением, это может быть связано с тем, что ваш интерфейс не находится в "общественной зоне". Следующая ссылка - отличный ресурс для ознакомления с firewalld. В нем подробно рассматриваются способы проверки, назначения и настройки зон: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7
Ответ 3
SELinux не позволяет Apache (и, следовательно, всем модулям Apache) выполнять удаленные подключения по умолчанию.
# setsebool -P httpd_can_network_connect=1
Ответ 4
Попробуйте установить ниже в таблице iptables.config
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Запустите команду ниже, чтобы перезапустить службу iptable
service iptables restart
измените файл httpd.config на
Listen 192.170.2.1:80
перезапустите apache.
Попробуйте сейчас.
Ответ 5
Найдите директиву LISTEN в конфигурационных файлах apache (httpd.conf, apache2.conf, listen.conf,...), и если вы видите localhost или 127.0.0.1, вам необходимо перезаписать свой общедоступный ip.
Ответ 6
Попробуйте отключить iptables: service iptables stop
Если это работает, включите TCP-порт 80 в свои правила брандмауэра:
запустите system-config-selinux от root и включите TCP-порт 80 (HTTP) на вашем брандмауэре.
Ответ 7
это сработает:
- для REDHAT
use: cat "/etc/sysconfig/iptables"
iptables -I RH-Firewall-1-INPUT -s 192.168.1.3 -p tcp -m tcp --dport 80 -j ACCEPT
за которым следует
sudo /etc/init.d/iptables save
Ответ 8
это то, что сработало для нас, чтобы получить доступ к apache извне:
sudo iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
sudo service iptables restart
Ответ 9
Установите apache для отображения на конкретный интерфейс и введите что-то вроде ниже:
Listen 192.170.2.1:80
Также проверьте записи Iptables и TCP Wrappers, которые могут мешать хосту, если внешние хосты обращаются к этому порту
Связывание документов для Apache
Ответ 10
Если вы используете RHEL/CentOS 7 (OP не был, но я думал, что поделюсь решением для своего дела), тогда вам нужно будет использовать firewalld вместо сервиса iptables, упомянутого в других ответах.
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
И затем проверьте, что он работает с:
firewall-cmd --permanent --zone=public --list-all
Он должен перечислить 80/tcp
в разделе ports
Ответ 11
Отключить SELinux
$ sudo setenforce 0