Я хочу иметь доступ к серверу, который работает на моем локальном компьютере через Интернет. Я настроил переадресацию портов на моем маршрутизаторе:
Public Port Range: 80-80
Target IP Address: 192.168.0.4
Target Port Range: 80-80
Я проверил, открыты ли порты, с помощью http://www.yougetsignal.com/tools/open-ports/ , в котором говорится: Порт 80 открыт на ...
Я попробовал это и с сервером Apache, а также с сервером nodeJS на порту 3000, но у меня никогда не было доступа к серверу.
Я проверил, прослушивает ли моя машина эти порты с выходом netstat
netstat -ltn | grep 80
:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
Какие варианты я должен получить, чтобы разобраться в этом, какие-нибудь другие проверки, которые я мог бы выполнить?
Если это поможет, это конфигурация Apache.
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName lebensmittel-schulung.local
DocumentRoot /home/dominic/workspace/lebensmittel-schulung/public
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/dominic/workspace/lebensmittel-schulung/public>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
# Redirect www to non-www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1$1 [L,R=301]
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
Также был выполнен сброс настроек и перезагрузка моего маршрутизатора, чтобы избежать неправильной конфигурации
iptables до:
Chain INPUT (policy ACCEPT 1330K packets, 1422M bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
iptables после открытия порта 80 вручную
Chain INPUT (policy ACCEPT 68 packets, 9825 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
Это вывод tcpdump после выполнения запроса к моему общедоступному ip с того же компьютера, на котором работает сервер, хотя открытие порта 80 ничего не меняет. Я думаю, что это исходящий запрос, который перехватывается tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:46:42.402748 IP 192.168.0.4.34870 > chello080108157035.6.12.vie.surfer.at.http: Flags [S], seq 2878976956, win 29200, options [mss 1460,sackOK,TS val 4294937394 ecr 0,nop,wscale 7], length 0
21:46:42.405078 IP chello080108157035.6.12.vie.surfer.at.http > 192.168.0.4.34870: Flags [R.], seq 0, ack 2878976957, win 0, length 0
21:46:43.473378 IP 192.168.0.4.34871 > chello080108157035.6.12.vie.surfer.at.http: Flags [S], seq 1711479299, win 29200, options [mss 1460,sackOK,TS val 4294937661 ecr 0,nop,wscale 7], length 0
21:46:43.473897 IP 192.168.0.4.34872 > chello080108157035.6.12.vie.surfer.at.http: Flags [S], seq 2157458117, win 29200, options [mss 1460,sackOK,TS val 4294937662 ecr 0,nop,wscale 7], length 0
21:46:43.475335 IP chello080108157035.6.12.vie.surfer.at.http > 192.168.0.4.34871: Flags [R.], seq 0, ack 1711479300, win 0, length 0
21:46:43.476463 IP chello080108157035.6.12.vie.surfer.at.http > 192.168.0.4.34872: Flags [R.], seq 0, ack 2157458118, win 0, length 0
Предполагая, что конфигурация перенаправления портов на Вашем маршрутизаторе корректна, необходимо гарантировать несколько вещей:
Относительно последней точки - я не уверен, каковы Ваши правила iptables. Отправьте вывод
sudo iptables -vL INPUT -n
Если входящие соединения на 80/tcp действительно позволяются, но так или иначе Вы не можете получить доступ к своему веб-серверу от за пределами сети, Вы могли бы хотеть войти в веб-сервер и использовать tcpdump для получения входящего трафика, чтобы видеть, достигают ли какие-либо попытки подключения его.
Использование:
export ext_if=$(ip ro | awk '/^default via/ {print $5}')
sudo tcpdump -i ${ext_if} port 80
Если Вы не видите соединений, когда Вы пытаетесь соединиться со своим веб-сервером от за пределами Вашей сети, необходимо зафиксировать это сначала.
Если брандмауэр на Вашей машине не позволяет входящим соединениям достигать порта, 80/tcp, фиксирует это путем выполнения команды ниже и проверяет:
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
ОБНОВЛЕНИЕ: Вы также упомянули:
Это - вывод tcpdump после выполнения запроса к моему общедоступному IP от той же машины, на которой работает сервер
Это, вероятно, не будет работать. Путь Ваши взятия запроса:
192.168.0.4 =>
<public_ip> (doing source and destination NAT, aka port forwarding) =>
192.168.0.4
Как Вы видите в выводе tcpdump, существует 3 Запроса HTTP, инициируемые любым инструментом, Вы раньше открывали соединение с Вашим веб-сервером, маршрутизатор отклоняет все соединения путем отвечания пакетами с RST ("сброс", т.е. "уходят, закрывают соединение"), набор флага.
Насколько я знаю, много устройств, обеспечивающих NAT, не позволят Вам инициировать запрос из сети позади NAT к ее общедоступному IP-адресу и затем обратно к хосту позади того же NAT посредством перенаправления портов (целевой NAT).
Необходимо попытаться выполнить запрос от за пределами сети. Если у Вас нет внешнего хоста, где можно войти в систему и использовать т.е. wget/curl, чтобы выполнить запрос попробовать некоторые из многих веб-инструментов, чтобы сделать это, такие как http://www.infobyip.com/httpservertest.php
Если это будет работать, и Вы получаете результат, который содержит, по крайней мере, код состояния Запроса HTTP (т.е. 200, 302, 404, и т.д.) и некоторые заголовки ответа, такие как Сервер, Тип контента, то это подтвердит что:
Если Вы хотите смочь получить доступ к своему веб-серверу с помощью его общедоступного IP из той же сети, Вы могли бы также: