Penerusan port gelandangan tidak berfungsi [ditutup]

108

Saya mengalami masalah kecil di akhir panduan Memulai untukvagrant . Saya sedang mengerjakan basebox CentOS yang menjalankan Apache2 (penyediaan melalui Puppet). Saya telah menyiapkan penerusan port untuk permintaan web menggunakan baris berikut di Vagrantfile:

 config.vm.forward_port "web", 80, 4567

Tetapi ketika saya membuat permintaan ke port itu, mereka gagal. Kesalahan yang dilaporkan oleh Safari adalah 'Safari tidak dapat membuka halaman " http: // localhost: 4567 / " karena server tiba-tiba memutuskan koneksi.'

Saya melakukan vagrant reloaddan melihat "[default] - web: 80 => 4567 (adaptor 1)" di gulungan, jadi di mana saya harus mulai memecahkan masalah ini? Terima kasih.

Hank Gay
sumber
1
Apa yang curl -v 'http://localhost:4567/'dikatakannya? Terkadang Safari agak terlalu bagus dalam menyembunyikan pesan kesalahan.
Steve Losh
2
Juga, apakah curl 'http://localhost:80'dari VM itu sendiri berfungsi? Jika tidak, masalahnya bukan pada penerusan port.
Steve Losh
4
@ Steve Losh curldari dalam VM berfungsi. curldari tuan rumah memberi saya (52) Empty reply from server.
Hank Gay
Pengelana kembali membantu saya pada pertanyaan serupa ...
haudoing
Bagi saya kasusnya adalah dengan symfony 3: - ketika menjalankan sudo php bin / console server: run yang membuat server berjalan di 127.0.0.1:8000 maka saya tidak dapat mengakses dari browser web, curl di mesin virtual diakses. Ketika menjalankan sudo php -S 0.0.0.0:8000 di direktori web, saya dapat mengakses 127.0.0.1:8082/app_dev.php . Tidak mengerti mengapa ini terjadi, tetapi berhasil.
Darius.V

Jawaban:

80

Saya akan membuat ini jawaban yang sebenarnya, bukan hanya lebih banyak komentar.

Hal pertama: coba curl 'http://localhost:80'dari dalam VM. Jika itu tidak berhasil, maka itu jelas bukan port forwarding.

Berikutnya: coba curl -v 'http://localhost:4567/'dari mesin host Anda. Curl mungkin memberi Anda pesan kesalahan yang lebih baik daripada Safari.

Saya akan memeriksa bahwa tidak ada pengaturan firewall yang membatasi akses ke port 80. Vagrant VM (Ubuntu) default tidak dilengkapi dengan pengaturan firewall, tetapi Anda mengatakan Anda menggunakan sesuatu yang lain, jadi mungkin sepadan untuk memeriksa.

Jika bukan itu, coba buat sesuatu selain Apache yang terdaftar pada port 80. Python dikirimkan dengan server HTTP sederhana yang dapat Anda gunakan - buka folder dengan index.htmldan jalankan sudo python -m SimpleHTTPServer 80, lalu coba tekan dengan curl dari kedua kotak. Jika berhasil, mungkin itu masalah konfigurasi Apache. Saya tidak memiliki cukup pengalaman dengan Apache untuk membantu jika itu masalahnya (saya menggunakan nginx).

Steve Losh
sumber
14
Pada dasarnya, saya payah di RedHat dan iptables. Saya memeriksa untuk memastikan kebijakan default adalah ACCEPTuntuk koneksi masuk, tetapi tidak memperhatikan rantai aturan kustom RedHat, yang memiliki REJECTaturan penampung-semua sebagai aturan terakhir dalam rantai. tl; dr Saya memiliki firewall di jalan dan tidak menyadarinya.
Hank Gay
Terima kasih! Aturan firewall licik itulah yang menyebabkan masalah saya di RHEL 5.5.
Roosh
Saya mencetak ulang komentar Robert di bawah karena ini adalah cara yang sepele untuk memeriksa: Jalankan service iptables stopsebagai root untuk dengan cepat menyingkirkan masalah firewall Tamu. Aktifkan kembali nanti jika perlu.
Arnaud Meuret
1
memiliki masalah yang sama dengan gambar centos yang aneh; iptablesmembatasi hampir segalanya. Saya mengikuti panduan centos iptable ini (solusi di bagian 3 Menulis Set Aturan Sederhana ) dan itu bekerja seperti pesona :)
GabLeRoux
bagi saya curl bekerja di dalam jadi saya mengaktifkan jaringan Vagrantfiledan menjalankan perintahvagrant reload
abhirathore2006
266

Saya ingin menambahkan catatan tambahan bahwa seringkali hal ini disebabkan oleh server di dalam VM karena terikat 127.0.0.1, yaitu loopback. Anda akan ingin memastikan bahwa server terikat 0.0.0.0sehingga semua antarmuka dapat mengaksesnya.

Beberapa server aplikasi built-in seperti server pengembangan Django dan beberapa server Ruby default 127.0.0.1secara default jadi ini adalah sesuatu yang harus diperhatikan.

Selain itu, apa yang dikatakan Steve benar: Pastikan itu berfungsi dari dalam VM dan coba beberapa server sederhana lainnya untuk mencoba dan mencari tahu apakah itu masalah konfigurasi.

Mitchell
sumber
8
Ini adalah perbaikan yang diperlukan untuk senapan yang menjalankan webrick.
Ronze
Ini memecahkan masalah saya. Untuk mengikat Torquebox ke 0.0.0.0, jalankan dengan: torquebox run -b 0.0.0.0
Bartek Skwira
3
Ya, inilah masalahnya. Perlu mengikat ke 0.0.0.0. Saya ingin tahu apakah ada cara dimana Vagrant dapat secara otomatis menghilangkan masalah ini di masa depan?
CMCDragonkai
1
masalah yang sama dengan sinatra dan webrick: "set: bind, '0.0.0.0'" memecahkan masalah
pragmatic_programmer
ini adalah perbaikan untuk saya
enamty4bit
33

Saya memiliki masalah yang sama di CentOS 6.3 w / NGINX dan menemukan jawabannya ada di iptables di kotak gelandangan.

Dari pesta di kotak gelandangan, ikuti langkah-langkah berikut:

Daftar pertama aturan iptable saat ini

iptables -L -v

Kemudian hapus aturan saat ini:

iptables -F

Izinkan koneksi SSH pada tcp port 22

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Tetapkan kebijakan default untuk rantai INPUT, FORWARD dan OUTPUT

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Setel akses untuk localhost

iptables -A INPUT -i lo -j ACCEPT

Terima paket milik koneksi mapan dan terkait

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Simpan Pengaturan

/sbin/service iptables save

Buat daftar aturan yang diubah

iptables -L -v

Curl localhost: [port #] atau tekan di browser Anda dari luar gelandangan

Info lebih lanjut tentang konfigurasi iptable CentOS ditemukan di sini:

http://wiki.centos.org/HowTos/Network/IPTables

Semoga berhasil.

travyo
sumber
2
Terima kasih telah menulis ini. Saya mengalami masalah yang sama di Fedora 18, jadi tidak spesifik untuk CentOS. Saya harap itu membantu orang lain. :)
Benjamin Oakes
4
Ini saya di CentOS. service iptables stop
Robert
2
iptables -Fsendiri melakukannya untuk saya
code_monk
Saya menemukan solusi yang solid untuk ini dengan beberapa perintah exec yang tercantum di posting blog ini untuk menyelesaikan masalah yang sama ini techie-notebook.blogspot.com/2014/05/… Saya harus mengganti jalur saya dengan bagian $ {os_path} seperti yang saya lakukan variabel itu tidak tersedia.
Joshua Fricke
27

Solusi yang lebih baik bagi saya adalah menonaktifkan firewall

service iptables stop
chkconfig iptables off
edwinallenz.dll
sumber
+1 Bekerja untuk saya. Untuk menggunakan instance VirtualBox lokal, saya tidak membutuhkan firewall.
Eduardo
ini adalah trik yang bagus jika Anda ingin perbaikan sementara
brrystrw
0

Saya ingin menambahkan catatan lain seperti Mitchell juga. jika kasus saya, saya meneruskannya ke 6789 dari 80

$ curl -v http://localhost:6789

Dan saya mengerti

<HTML>
<HEAD><TITLE>Redirection</TITLE></HEAD>
<BODY><H1>Redirect</H1></BODY>

Kemudian, saya menggunakan alamat IP sebagai gantinya, itu mendapat pesan html yang benar.

Larry Cai
sumber