Назад | Перейти на главную страницу

Невозможно получить доступ к Node Server из внешней сети

У меня есть виртуальная машина с двумя общедоступными IP-адресами. Я установил узел контроллера OpenStack на виртуальную машину. У меня есть доступ из внешней сети к службам Horizon и Keystone, работающим на веб-сервере apache2 на портах 80 и 5000 соответственно.

Однако, когда я запускаю службу Node.js Express на порту 3010, я не могу получить к ней доступ из внешней сети. Я могу получить к нему доступ с локального хоста и с других виртуальных машин, работающих на том же хосте.

Я попытался поместить в iptables следующие правила:

sudo iptables -A INPUT -p tcp -m tcp --dport 3010 -j ACCEPT

sudo ip6tables -A INPUT -p tcp -m tcp --dport 3010 -j ACCEPT

Ниже приводится результат работы sudo iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
neutron-linuxbri-INPUT  all  --  anywhere             anywhere            
nova-api-INPUT  all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             controller           tcp dpt:3010

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
neutron-filter-top  all  --  anywhere             anywhere            
neutron-linuxbri-FORWARD  all  --  anywhere             anywhere            
nova-filter-top  all  --  anywhere             anywhere            
nova-api-FORWARD  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
neutron-filter-top  all  --  anywhere             anywhere            
neutron-linuxbri-OUTPUT  all  --  anywhere             anywhere            
nova-filter-top  all  --  anywhere             anywhere            
nova-api-OUTPUT  all  --  anywhere             anywhere            

Chain neutron-filter-top (2 references)
target     prot opt source               destination         
neutron-linuxbri-local  all  --  anywhere             anywhere            

Chain neutron-linuxbri-FORWARD (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-INPUT (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-OUTPUT (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-local (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-sg-chain (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain neutron-linuxbri-sg-fallback (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere             /* Default drop rule for unmatched traffic. */

Chain nova-api-FORWARD (1 references)
target     prot opt source               destination         

Chain nova-api-INPUT (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             controller           tcp dpt:8775

Chain nova-api-OUTPUT (1 references)
target     prot opt source               destination         

Chain nova-api-local (1 references)
target     prot opt source               destination         

Chain nova-filter-top (2 references)
target     prot opt source               destination         
nova-api-local  all  --  anywhere             anywhere 

Ниже приводится результат работы sudo netstat -nap | grep 3010

tcp6    0    0    :::3010    :::*    LISTEN    7538/node 

что то же самое как sudo netstat -nap | grep 80

tcp6    0    0    :::80    :::*    LISTEN    2932/apache2

который также совпадает с sudo netstat -nap | grep 5000

tcp6    0    0    :::5000    :::*    LISTEN    2932/apache2

Я даже не могу telnet на 3010 из внешней сети.

У меня есть доступ только к виртуальной машине, но не к ее хосту. Поэтому я не могу установить NAT или переадресацию портов на хосте.

Кроме того, я не думаю, что для портов 80 и 5000 установлены какие-либо правила переадресации портов, поскольку эти службы были автоматически запущены OpenStack после создания на виртуальной машине (и у меня нет доступа к хосту, поэтому я не могу установить эти правила переадресации портов себя).

Ufw также отключен. Я проверил, используя его sudo ufw status, который отображается как неактивный.

Мне нужно знать, что я могу сделать, чтобы получить доступ к службе, работающей на порту 3010, из внешней сети.

Я ненавижу iptables -L вывод. не уверен, как кто-нибудь это читает. iptables-save король и iptables -S обычно подойдет в крайнем случае. (Только личные анекдоты).

Давайте пройдемся по процессу устранения неполадок:

Iptables

Насколько я могу судить, единственное DROP заявление в вашем брандмауэре никогда не упоминается. (Напр .: недоступен). Если порт 80 работает без специальной инструкции брандмауэра, можно с уверенностью сказать, что проблема не в брандмауэре. Если вы хотите быть полностью уверены, отключите брандмауэр. Промыть столы и полностью открыть. Я предполагаю, что соединение по-прежнему не работает.

Прослушивание

Поскольку netstat сообщает, что процесс прослушивает данный порт, мы можем предположить, что порт был привязан к нему.

Это оставляет нам два направления поиска и устранения неисправностей. Внутрь к приложению и наружу к вашему [конечному пользователю] соединению.

Принятие

Приложение необходимо привязать к порту, чтобы LISTEN. Как только это будет сделано, приложение должно ACCEPT любые входящие соединения. Я сомневаюсь, что есть проблема именно в этом виде спорта, но есть вероятность, что здесь есть какая-то ошибка в логике приложения, которая где-то зависает и не позволяет принимать соединения.

ssh user@yourserver.example.com
> telnet 127.0.0.1 3010

Если вы установили соединение, это не проблема ACCEPT в приложении.

Внешние влияния

Если вы можете установить соединение с сервером с сервера, значит, мешает какой-то внешний объект. Изменение приложения для прослушивания на другом порту может позволить трафику проходить, но вы все равно должны определить, находится ли мешающий брандмауэр и т. Д. В вашем помещении или где-то между вашим собственным DMARC и вашим сервером.

Если все это не удается, вы можете попробовать:

 -A INPUT -m tcp -p tcp --dport 3010 -j LOG
 -A OUTPUT -m tcp -p tcp --sport 3010 -j LOG

просто чтобы посмотреть, не происходит ли что-нибудь странное со стеком TCP, которое может указать вам на решение. tcpdump является альтернативой правилам iptables.