Port tampaknya terbuka, tetapi koneksi ditolak

21

Saya mencoba untuk membuka port 3000 di Ubuntu 12.04, karena saya memiliki server web yang mendengarkannya. Saya sedikit keluar dari zona nyaman saya di sini, dan menghabiskan banyak waktu mencoba menyelesaikan masalah tanpa hasil.

Port tampaknya terbuka di firewall:

$> sudo ufw status
Status: active

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

Server mendengarkan dengan baik pada port itu:

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

Dan saya bahkan dapat wgetmemperbaiki halaman indeks:

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

Dan file yang diterima berisi apa yang saya harapkan ("hello world" :).

Namun, ketika mencoba dari komputer lain, atau jika wget mydomain.com:3000saya mendapatkannya "connection refused", dan nmap memberi tahu saya bahwa port tidak terbuka:

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

Tahu apa yang harus saya coba selanjutnya ???

EDIT

Inilah yang memberi 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
sebpiq
sumber
Nonaktifkan ufw, coba lagi. Jika itu tidak berhasil, ada firewall / perangkat lain antara komputer jarak jauh dan server Anda.
ish
Saya sudah mencoba .. tidak menyelesaikannya :(
sebpiq
"ada firewall / perangkat lain antara komputer jarak jauh dan server Anda." : ini sangat tidak mungkin. Saya mencoba wget kedua dari server sehingga membuat perjalanan pulang pergi melalui jaringan.
sebpiq
Hah? Anda tidak dapat mengetik wget serverseb.com dari servereb dan mendapatkannya untuk melakukan perjalanan pulang-pergi tanpa sihir perutean iptables yang bagus. Tolong tempelkan keluaran dari traceroute mydomain.comkomputer jarak jauh. Anda dapat ** mengeluarkan dua oktet terakhir dari IP (server) terakhir untuk privasi.
ish
diedit dengan traceroute
sebpiq

Jawaban:

24

Jika server Anda hanya mendengarkan antarmuka localhost, Anda tidak akan dapat mengaksesnya dari komputer jarak jauh. Ini tampaknya menjadi masalah utama Anda, karena hanya 127.0.0.1:3000 terdaftar di output netstat Anda.

Anda juga perlu memastikan bahwa "mydomain.com" menyelesaikan ke alamat IP yang benar untuk mesin Anda, sehingga menghubungkannya akan menghasilkan komunikasi dengan antarmuka eksternal mesin itu.

dobey
sumber
Saya bisa ssh ke mesin menggunakan namanya, jadi saya kira resolusi nama bukan masalah di sini. Bagaimana saya bisa membuat server mendengarkan dari mana saja?
sebpiq
1
@sebpiq Resolusi ini khusus untuk program. Anda perlu mengikat pendengar program ke antarmuka yang tepat dengan nama { eth0, atau sesuatu seperti itu), alamat IP (192.168.1.99, atau sesuatu seperti itu), atau alamat MAC. Ini tergantung pada programnya.
Pasang kembali Monica - ζ--
Uugh ... kedengarannya gila: S Saya akan mencoba google tentang hal itu. Server saya adalah node.js, jadi saya akan memeriksa apakah ada info tentang antarmuka apa yang harus saya hubungkan.
sebpiq
Yeepee !!! @ObsessiveFOSS dan dobey terima kasih BEGITU! Server node.js saya sebenarnya hanya mendengarkan di localhost. Saya tidak tahu itu melakukan seperti itu, dan tidak ada tutorial yang menyebutkannya.
sebpiq
@sebpiq Tidak masalah. :-)
Reinstate Monica - 20--
13

Saya punya masalah baru-baru ini dengan server HTTPS nodejs, dan solusi untuk itu adalah tidak menggunakan "localhost", "127.0.0.1" atau bahkan nama domain. Itu menggunakan "0.0.0.0"

Saya percaya ini bertindak sebagai wildcard, sekarang memungkinkan untuk resolusi publik melalui nama domain dan juga berfungsi dengan "localhost"

Sunting: Berikut ini tautan ke halaman serverfault pada topik 0.0.0.0: /server/78048/whats-the-difference-between-ip-address-0-0-0-0--- 127-0-0-1

Sami Fouad
sumber
Gunakan "0.0.0.0" di mana tepatnya?
Adaephon
@Adaephon Nah dalam kasus saya, saya membuat server web berbasis Node. Saya harus mengubah: }).listen(3000, '127.0.0.1'); ke }).listen(3000, '0.0.0.0'); dalam kode saya.
Sami Fouad
@Adaephon Jadi saya tidak yakin berapa banyak bantuan itu, tetapi di mana pun Anda mendefinisikan IP / Hostname, coba 0.0.0.0 sebagai gantinya.
Sami Fouad
bisakah kamu mengunjungi posting saya? stackoverflow.com/questions/37922804/…
Kar19
1
0.0.0.0 (atau lebih tepatnya representasi biner 0) dianggap sebagai mendengarkan semua orang dari sudut pandang antarmuka soket. Anda dapat memberikan IP lain dan itu hanya akan mendengarkan antarmuka di mana Anda memiliki IP itu. Misalnya, jika Anda memberikan 127.0.0.1 Anda hanya dapat menerima koneksi dari 127. *. *. * IP (localhost really), atau dari komputer lain dengan tabel routing yang benar-benar rusak yang akan mengakses Anda untuk 127.0.0.1 (untuk menguji ini kasus terakhir!)
Paul Stelian
3

Apakah ada kemungkinan Anda menggunakan AWS atau layanan cloud lainnya? Dalam hal ini port harus dibuka pada level konfigurasi inctance (OS) atau setelahnya. Khususnya di AWS Anda harus mencari "Grup Keamanan" di mana Anda harus membuka akses ke port 3000

Гдето Якутский
sumber