พอร์ตดูเหมือนว่าจะเปิด แต่การเชื่อมต่อถูกปฏิเสธ


21

ฉันพยายามเปิดพอร์ต 3000 บน Ubuntu 12.04 เพราะฉันมีเว็บเซิร์ฟเวอร์ฟังอยู่ ฉันออกจากโซน confort ของฉันที่นี่และใช้เวลาหลายชั่วโมงในการพยายามแก้ไขปัญหาโดยไม่ประสบความสำเร็จ

พอร์ตดูเหมือนว่าจะเปิดในไฟร์วอลล์:

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

ฮะ? คุณไม่สามารถพิมพ์ wget serverseb.com จาก serverseb และทำให้การเดินทางไปกลับโดยไม่ต้องใช้เวทมนตร์เส้นทาง iptables แฟนซี กรุณา pastebin เอาท์พุทของtraceroute mydomain.comจากคอมพิวเตอร์ระยะไกล คุณสามารถ ** ออกสอง octet ล่าสุดของ IP ล่าสุด (เซิร์ฟเวอร์) เพื่อความเป็นส่วนตัว
ish

แก้ไขด้วย traceroute
sebpiq

คำตอบ:


24

หากเซิร์ฟเวอร์ของคุณกำลังฟังบนอินเตอร์เฟส localhost เท่านั้นคุณจะไม่สามารถเข้าถึงได้จากคอมพิวเตอร์ระยะไกล สิ่งนี้ดูเหมือนจะเป็นปัญหาหลักของคุณเนื่องจากมีเพียง 127.0.0.1:3000 เท่านั้นที่แสดงรายการในเอาต์พุต netstat ของคุณ

คุณจะต้องตรวจสอบให้แน่ใจว่า "mydomain.com" แก้ไขเป็นที่อยู่ IP ที่ถูกต้องสำหรับเครื่องของคุณเช่นการเชื่อมต่อจะทำให้เกิดการสื่อสารกับอินเทอร์เฟซภายนอกของเครื่องนั้น


ฉันสามารถ ssh กับเครื่องโดยใช้ชื่อของมันดังนั้นฉันเดาว่าการแก้ไขชื่อไม่ใช่ปัญหาที่นี่ ฉันจะทำให้เซิร์ฟเวอร์นั้นรับฟังได้จากทุกที่ได้อย่างไร
sebpiq

1
@sebpiq ความละเอียดนี้เป็นแบบเฉพาะโปรแกรม คุณต้องผูกผู้ฟังของโปรแกรมเข้ากับอินเตอร์เฟสที่ถูกต้องโดยใช้ชื่อ { eth0หรือบางอย่างเช่นนั้น) ที่อยู่ IP (192.168.1.99 หรืออะไรทำนองนั้น) หรือที่อยู่ MAC ขึ้นอยู่กับโปรแกรม
Reinstate Monica - ζ--

uugh ... ฟังดูบ้า: S ฉันจะลอง google ดู เซิร์ฟเวอร์ของฉันคือ node.js ดังนั้นฉันจะตรวจสอบว่ามีข้อมูลเกี่ยวกับอินเทอร์เฟซที่ฉันต้องการเชื่อมต่อหรือไม่
sebpiq

Yeepee !!! @ObsessiveFOSS และ dobey ขอบคุณมาก! เซิร์ฟเวอร์ node.js ของฉันเป็นจริงฟังบน localhost เท่านั้น ฉันไม่รู้ว่ามันทำแบบนั้นและไม่มีการสอนใดที่กล่าวถึง
sebpiq

@sebpiq ไม่มีปัญหา :-)
Reinstate Monica - ζ--

13

ฉันมีปัญหานี้เมื่อเร็ว ๆ นี้กับเซิร์ฟเวอร์ HTTPS nodejs และวิธีการแก้ปัญหาก็คือไม่ต้องใช้ "localhost", "127.0.0.1" หรือแม้กระทั่งชื่อโดเมน มันคือการใช้ "0.0.0.0"

ฉันเชื่อว่าสิ่งนี้ทำหน้าที่เป็นสัญลักษณ์แทนตอนนี้อนุญาตให้มีการลงมติสาธารณะผ่านชื่อโดเมนและยังทำงานกับ "localhost"

แก้ไข: นี่คือลิงค์ไปยังหน้า serverfault ในหัวข้อ 0.0.0.0: /server/78048/whats-the-difference-between-ip-address-0-0.0.0 127-0-0-1


ใช้ "0.0.0.0" ที่ไหนกันแน่?
Adaephon

@Adaephon ในกรณีของฉันฉันสร้างเว็บเซิร์ฟเวอร์ที่ใช้ Node ฉันต้องเปลี่ยน: }).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. *. *. * IPs (localhost จริง ๆ ) หรือจากคอมพิวเตอร์เครื่องอื่น ๆ ที่มีตารางเส้นทางที่ไม่เรียบร้อยซึ่งจะเข้าถึง 127.0.0.1 (เพื่อทดสอบสิ่งนี้) กรณีสุดท้าย!)
Paul Stelian

3

มีโอกาสใดบ้างที่คุณใช้ AWS หรือบริการคลาวด์อื่น ๆ ? ในกรณีที่พอร์ตควรจะเปิดในระดับการกำหนดค่า inctance (OS) หรือหลัง โดยเฉพาะอย่างยิ่งใน AWS คุณควรมองหา "กลุ่มความปลอดภัย" ซึ่งคุณควรเปิดการเข้าถึงพอร์ต 3000

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.