포트가 열려 있지만 연결이 거부되었습니다


21

Ubuntu 12.04에서 포트 3000을 열려고하는데 웹 서버가 수신 대기 중입니다. 나는 여가 활동 구역에서 약간 벗어 났으며 성공하지 않고 문제를 해결하기 위해 많은 시간을 보냈습니다.

방화벽에서 포트가 열려있는 것 같습니다.

$> sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
...
3000/tcp                   ALLOW       Anywhere
3000/tcp                   ALLOW       Anywhere (v6)

서버가 해당 포트에서 올바르게 듣고 있습니다.

$> netstat -an | grep "LISTEN "
...
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN     
...

wget색인 페이지 도 괜찮습니다.

$> wget localhost:3000
Connecting to localhost (localhost)|127.0.0.1|:3000... connected.
HTTP request sent, awaiting response... 200 OK

그리고 수신 된 파일에는 내가 기대하는 것 ( "hello world":)이 포함되어 있습니다.

그러나 다른 컴퓨터에서 시도 하거나을 wget mydomain.com:3000얻는 경우 "connection refused"nmap은 포트가 열려 있지 않다고 알려줍니다.

$> nmap -A -T4 mydomain.com
Host is up (0.00032s latency).
...
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.9p1 Debian 5ubuntu1 (protocol 2.0)
...
Service Info: OS: Linux

다음에 무엇을 시도 해야할지 생각하십니까 ???

편집하다

traceroute가 제공하는 내용은 다음과 같습니다.

$> traceroute mydomain.com
traceroute to mydomain.com (176.31.x.x), 30 hops max, 60 byte packets
 1  mydomain.com (176.31.x.x)  0.034 ms  0.013 ms  0.010 ms

ufw를 비활성화하고 다시 시도하십시오. 그래도 작동하지 않으면 원격 컴퓨터와 서버 사이에 다른 방화벽 / 장치가있는 것입니다.
ish

나는 이미 시도했다 .. 그것을 해결하지 못했습니다 :(
sebpiq

"원격 컴퓨터와 서버 사이에 다른 방화벽 / 장치가 있습니다." : 이것은 가능성이 거의 없습니다. 서버에서 두 번째 wget을 시도하여 네트워크를 통해 왕복 여행했습니다.
sebpiq

응? serverseb에서 wget serverseb.com을 입력하고 멋진 iptables 라우팅 마법없이 왕복 여행을 할 수는 없습니다. traceroute mydomain.com원격 컴퓨터에서 출력을 붙여 넣으십시오 . 프라이버시를 위해 마지막 (서버) IP의 마지막 두 옥텟을 ** 아웃 할 수 있습니다.
ish

traceroute로 수정
sebpiq

답변:


24

서버가 로컬 호스트 인터페이스에서만 수신 대기중인 경우 원격 컴퓨터에서 액세스 할 수 없습니다. netstat 출력에 127.0.0.1:3000 만 나열되어 있기 때문에 이것은 주요 문제인 것으로 보입니다.

또한 "mydomain.com"이 컴퓨터의 올바른 IP 주소로 확인되어 연결되면 해당 컴퓨터의 외부 인터페이스와 통신 할 수 있어야합니다.


이름을 사용하여 컴퓨터에 ssh 할 수 있으므로 여기에서 이름 확인이 문제가되지 않습니다. 서버가 어디서나들을 수 있도록하려면 어떻게해야합니까?
sebpiq

1
@sebpiq이 해상도는 프로그램마다 다릅니다. 프로그램의 리스너를 name { eth0또는 이와 유사한 것), IP 주소 (192.168.1.99 또는 이와 유사한 것) 또는 MAC 주소로 올바른 인터페이스에 바인딩해야 합니다. 이것은 프로그램에 따라 다릅니다.
Monica Monica 복원-ζ--

Uugh ... 미친 소리 : S 나는 그것에 대해 구글하려고합니다. 내 서버는 node.js이므로 어떤 인터페이스에 연결해야하는지에 대한 정보가 있는지 확인하겠습니다.
sebpiq

예피 !!! @ObsessiveFOSS와 도비는 너무 감사합니다! 내 node.js 서버는 실제로 로컬 호스트에서만 청취했습니다. 나는 그것이 그렇게하고 있다는 것을 몰랐고, 튜토리얼 중 아무도 그것을 언급하지 않았습니다.
sebpiq

@sebpiq 문제 없습니다. :-)
Monica Monica 복원-ζ--

13

최근 nodejs HTTPS 서버에서이 문제가 발생했으며 이에 대한 해결책은 "localhost", "127.0.0.1"또는 도메인 이름을 사용하지 않는 것이 었습니다. "0.0.0.0"을 사용했습니다

나는 이것이 와일드 카드의 역할을한다고 믿습니다. 이제 도메인 이름을 통한 공개 해결이 가능하며 "localhost"와도 작동합니다.

편집 : 여기 0.0.0.0 주제의 serverfault 페이지에 대한 링크가 있습니다 : /server/78048/whats-the-difference-between-ip-address-0-0-0-0-and- 127-0-0-1


정확히 "0.0.0.0"을 사용 하시겠습니까?
Adaephon

@Adaephon 내 경우에는 노드 기반 웹 서버를 만들었습니다. 내 코드에서 로 변경 }).listen(3000, '127.0.0.1'); 해야 }).listen(3000, '0.0.0.0');했습니다.
Sami Fouad

@Adaephon 그래서 그것이 얼마나 도움이되었는지 잘 모르겠지만 IP / 호스트 이름을 정의하는 곳마다 0.0.0.0을 사용해보십시오.
Sami Fouad

내 게시물을 방문해 주시겠습니까? stackoverflow.com/questions/37922804/…
Kar19

1
0.0.0.0 (또는 이진 표현 0)은 소켓 인터페이스의 관점에서 모든 사람의 말을 듣는 것으로 간주됩니다. 다른 IP를 제공 할 수 있으며 해당 IP가있는 인터페이스 만 수신합니다. 예를 들어, 127.0.0.1을 제공하면 127. *. *. * IP (로컬 호스트 실제로) 또는 127.0.0.1에 대해 액세스 할 수있는 심각하게 병치 된 라우팅 테이블이있는 다른 컴퓨터에서만 연결을 수신 할 수 있습니다 (이를 테스트하기 위해) 마지막 경우!)
Paul Stelian

3

AWS 또는 다른 클라우드 서비스를 사용하고있을 가능성이 있습니까? 이 경우 포트는 OS 구성 수준 또는 그 이후에 열어야합니다. 특히 AWS에서는 포트 3000에 대한 액세스 권한을 열어야하는 "보안 그룹"을 찾아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.