การส่งต่อพอร์ตของ Vagrant ไม่ทำงาน [ปิด]


108

ฉันทำงานเป็นปัญหาเล็ก ๆ ในตอนท้ายของคู่มือเริ่มต้นสำหรับ vagrantฉันกำลังทำงานกับ CentOS basebox ที่มี Apache2 ทำงานอยู่ (การจัดเตรียมผ่าน Puppet) ฉันได้ตั้งค่าการส่งต่อพอร์ตสำหรับคำขอทางเว็บโดยใช้บรรทัดต่อไปนี้Vagrantfile:

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

แต่เมื่อฉันร้องขอไปยังพอร์ตนั้นพวกเขาล้มเหลว ข้อผิดพลาดที่รายงานโดย Safari คือ 'Safari ไม่สามารถเปิดหน้า“ http: // localhost: 4567 / ” ได้เนื่องจากเซิร์ฟเวอร์ยกเลิกการเชื่อมต่อโดยไม่คาดคิด'

ฉันได้vagrant reloadและเห็น "[ค่าเริ่มต้น] - web: 80 => 4567 (อะแดปเตอร์ 1)" ในการเลื่อนฉันควรจะเริ่มแก้ไขปัญหานี้ที่ไหน ขอบคุณ.


1
อะไรcurl -v 'http://localhost:4567/'เอ่ย? บางครั้ง Safari ก็ดูดีเกินไปในการซ่อนข้อความแสดงข้อผิดพลาด
Steve Losh

2
นอกจากนี้curl 'http://localhost:80'จาก VM เองยังใช้งานได้หรือไม่ หากไม่เป็นเช่นนั้นปัญหาไม่ใช่การส่งต่อพอร์ต
Steve Losh

4
@Steve Losh curlจากภายใน VM กำลังทำงาน จากโฮสต์ให้ฉันcurl (52) Empty reply from server
Hank Gay

การโหลดซ้ำของคนจรจัดช่วยฉันในคำถามที่คล้ายกัน ...
haudoing

สำหรับฉันกรณีนี้ใช้ symfony 3: - เมื่อเรียกใช้เซิร์ฟเวอร์ sudo php bin / console: เรียกใช้ซึ่งทำให้เซิร์ฟเวอร์ทำงานบน127.0.0.1:8000ฉันไม่สามารถเข้าถึงจากเว็บเบราว์เซอร์ curl ในเครื่องเสมือนที่เข้าถึงได้ เมื่อวิ่ง sudo PHP -S 0.0.0.0:8000 ในสารบบเว็บผมสามารถเข้าถึง127.0.0.1:8082/app_dev.php ไม่เข้าใจว่าทำไมถึงเกิดขึ้น แต่ได้ผล
Darius.V

คำตอบ:


80

ฉันจะให้คำตอบที่แท้จริงแทนความคิดเห็นเพิ่มเติม

สิ่งแรก: ลองcurl 'http://localhost:80'จากภายใน VM หากไม่ได้ผลแสดงว่าไม่ใช่การส่งต่อพอร์ตอย่างแน่นอน

ถัดไป: ลองcurl -v 'http://localhost:4567/'จากเครื่องโฮสต์ของคุณ Curl อาจให้ข้อความแสดงข้อผิดพลาดที่ดีกว่า Safari

ฉันตรวจสอบว่าไม่มีไฟร์วอลล์ที่ตั้งค่าการ จำกัด การเข้าถึงพอร์ต 80 Vagrant VM (Ubuntu) เริ่มต้นไม่ได้มาพร้อมกับการตั้งค่าไฟร์วอลล์ แต่คุณบอกว่าคุณกำลังใช้อย่างอื่นดังนั้นมันอาจจะคุ้มค่า เพื่อตรวจสอบ.

หากไม่เป็นเช่นนั้นให้ลองสร้างสิ่งอื่นนอกเหนือจาก Apache ที่ระบุไว้ในพอร์ต 80 Python มาพร้อมกับเซิร์ฟเวอร์ HTTP แบบธรรมดาที่คุณสามารถใช้ได้ - ไปที่โฟลเดอร์ที่มีindex.htmlและเรียกใช้sudo python -m SimpleHTTPServer 80จากนั้นลองกดปุ่มนั้นด้วย curl จากทั้งสองกล่อง หากได้ผลอาจเป็นปัญหาการกำหนดค่า Apache ฉันไม่มีประสบการณ์เพียงพอกับ Apache ที่จะช่วยได้หากเป็นเช่นนั้น (ฉันใช้ nginx)


14
โดยทั่วไปฉันดูดที่ RedHat และiptables. ฉันตรวจสอบเพื่อให้แน่ใจว่านโยบายเริ่มต้นใช้ACCEPTสำหรับการเชื่อมต่อขาเข้า แต่ไม่ได้ใส่ใจกับห่วงโซ่กฎที่กำหนดเองของ RedHat ซึ่งมีREJECTกฎที่รับทั้งหมดเป็นกฎสุดท้ายในห่วงโซ่ tl; dr ฉันมีไฟร์วอลล์ขวางทางและไม่ได้สังเกต
Hank Gay

ขอบคุณ! กฎไฟร์วอลล์ที่ส่อเสียดคือสิ่งที่ทำให้เกิดปัญหาของฉันใน RHEL 5.5
Roosh

ฉันพิมพ์ความคิดเห็นของ Robert อีกครั้งด้านล่างเนื่องจากเป็นวิธีที่ไม่สำคัญในการตรวจสอบ: เรียกใช้service iptables stopในฐานะรูทเพื่อแยกแยะปัญหาไฟร์วอลล์ของ Guest อย่างรวดเร็ว เปิดใช้งานได้ในภายหลังหากจำเป็น
Arnaud Meuret

1
มีปัญหาเดียวกันกับภาพเซนโตสแปลก ๆ iptablesถูก จำกัด เกือบทุกอย่าง ฉันทำตามคู่มือ iptable centosนี้(วิธีแก้ปัญหาในส่วนที่ 3 การเขียนชุดกฎง่ายๆ ) และมันก็ใช้งานได้ดี :)
GabLeRoux

สำหรับผมที่ขดเป็นคนที่ทำงานอยู่ภายในดังนั้นผมจึงเปิดการใช้งานเครือข่ายในVagrantfileและคำสั่งวิ่งvagrant reload
abhirathore2006

266

ฉันต้องการเพิ่มหมายเหตุเพิ่มเติมว่ามักเกิดจากเซิร์ฟเวอร์ภายใน VM เนื่องจากเชื่อมโยงกับ127.0.0.1ซึ่งเป็นแบบวนกลับ คุณจะต้องตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ถูกผูกไว้เพื่อ0.0.0.0ให้อินเทอร์เฟซทั้งหมดสามารถเข้าถึงได้

เซิร์ฟเวอร์แอปในตัวบางตัวเช่นเซิร์ฟเวอร์การพัฒนาของ Django และเซิร์ฟเวอร์ Ruby บางตัวมีค่าเริ่มต้นเป็น127.0.0.1ค่าเริ่มต้นดังนั้นจึงเป็นสิ่งที่ต้องระวัง

นอกเหนือจากนั้นสิ่งที่สตีฟพูดยังคงเป็นจริง: ตรวจสอบให้แน่ใจว่าใช้งานได้จากภายใน VM และลองใช้เซิร์ฟเวอร์ง่ายๆอื่น ๆ เพื่อลองดูว่าเป็นปัญหาการกำหนดค่าหรือไม่


8
นี่คือการแก้ไขที่จำเป็นสำหรับปืนลูกซองที่ใช้ webrick
Ronze

สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้ ในการผูก Torquebox เป็น 0.0.0.0 ให้รันด้วย: ทอร์คบ็อกซ์รัน -b 0.0.0.0
Bartek Skwira

3
ใช่นี่คือปัญหา ต้องผูกกับ 0.0.0.0 ฉันสงสัยว่ามีวิธีที่ Vagrant สามารถทำให้ปัญหานี้หมดไปโดยอัตโนมัติในอนาคตได้หรือไม่?
CMCDragonkai

1
ปัญหาเดียวกันกับ sinatra และ webrick: "set: bind '0.0.0.0'" แก้ไขปัญหาได้
pragmatic_programmer

นี่คือการแก้ไขสำหรับฉัน
sixty4bit

33

ฉันมีปัญหาเดียวกันกับ CentOS 6.3 w / NGINX และพบคำตอบอยู่ใน iptables บนกล่อง vagrant

จากการทุบตีกล่องคนเร่ร่อนให้ทำตามขั้นตอนเหล่านี้:

รายการแรกกฎ iptable ปัจจุบัน

iptables -L -v

จากนั้นล้างกฎปัจจุบัน:

iptables -F

อนุญาตการเชื่อมต่อ SSH บนพอร์ต tcp 22

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

ตั้งค่านโยบายเริ่มต้นสำหรับ INPUT, FORWARD และ OUTPUT chain

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

ตั้งค่าการเข้าถึงสำหรับ localhost

iptables -A INPUT -i lo -j ACCEPT

ยอมรับแพ็คเก็ตที่เป็นของการเชื่อมต่อที่จัดตั้งขึ้นและเกี่ยวข้อง

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

บันทึกการตั้งค่า

/sbin/service iptables save

รายการกฎที่แก้ไข

iptables -L -v

Curl localhost: [port #] หรือกดในเบราว์เซอร์ของคุณจากคนจรจัดภายนอก

ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า CentOS iptable ได้ที่นี่:

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

โชคดี.


2
ขอขอบคุณที่เขียนสิ่งนี้ขึ้นมา ฉันมีปัญหาเดียวกันนี้ใน Fedora 18 ดังนั้นจึงไม่เฉพาะกับ CentOS ฉันหวังว่าจะช่วยคนอื่น :)
Benjamin Oakes

4
นี่คือฉันบน CentOS service iptables stop
Robert

2
iptables -Fทำเพื่อฉันคนเดียว
code_monk

ฉันพบวิธีแก้ปัญหาที่มั่นคงด้วยคำสั่ง exec ที่ระบุไว้ในบล็อกโพสต์นี้เพื่อแก้ปัญหาเดียวกันนี้techie-notebook.blogspot.com/2014/05/…ฉันต้องแทนที่เส้นทางของฉันด้วยส่วน $ {os_path} ตามที่ฉันทำ ไม่มีตัวแปรนั้น
Joshua Fricke

27

ทางออกที่ดีกว่าสำหรับฉันคือการปิดใช้งานไฟร์วอลล์

service iptables stop
chkconfig iptables off

+1 ทำงานให้ฉัน สำหรับการใช้อินสแตนซ์ VirtualBox ในเครื่องฉันไม่จำเป็นต้องใช้ไฟร์วอลล์
Eduardo

เป็นเคล็ดลับที่ดีหากคุณต้องการแก้ไขชั่วคราว
brrystrw

0

ฉันต้องการเพิ่มโน้ตอื่นเช่นมิทเชลเช่นกัน ถ้ากรณีของฉันฉันส่งต่อไปที่ 6789 จาก 80

$ curl -v http://localhost:6789

และฉันได้

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

จากนั้นฉันใช้ที่อยู่ IP แทนได้รับข้อความ html ที่ถูกต้อง

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