จะอนุญาตการเชื่อมต่อระยะไกลไปยัง Flask ได้อย่างไร?


30

127.0.0.1:5000ภายในระบบที่ทำงานบนเครื่องเสมือนฉันสามารถเข้าถึงเซิร์ฟเวอร์ที่ใช้ใน

แม้ว่าที่อยู่ 'ระยะไกล' ของ vm คือ 192.168.56.101 (ping และ ssh ทำงานได้ดี) ฉันไม่สามารถเข้าถึงเซิร์ฟเวอร์ด้วย 192.168.50.101,5000 ไม่ได้มาจากเครื่องเสมือนหรือจากเครื่องท้องถิ่น

ฉันเดาว่ามีบางอย่างที่ป้องกันการเชื่อมต่อระยะไกล

นี่คือ / etc / network / interfaces:

auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0

ufw ไม่ทำงาน

ฉันจะแก้ไขปัญหานี้ได้อย่างไร

คำตอบ:


48

ก่อนอื่น - ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ HTTP ของคุณกำลังฟังอยู่ 192.168.50.101:5000หรือทุกที่ ( 0.0.0.0:5000) โดยตรวจสอบผลลัพธ์ของ:

netstat -tupln | grep ':5000'

หากไม่มีให้ศึกษาเอกสารของ Flaskเพื่อผูกกับที่อยู่อื่นที่ไม่ใช่ localhost

ถ้าเป็นเช่นนั้นอนุญาตการรับส่งข้อมูลโดยใช้ iptables:

iptables -I INPUT -p tcp --dport 5000 -j ACCEPT

จากเอกสารของ Flask:

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

หากคุณปิดการใช้งานการดีบักหรือไว้วางใจผู้ใช้ในเครือข่ายของคุณคุณสามารถทำให้เซิร์ฟเวอร์นั้นเปิดเผยต่อสาธารณะได้อย่างง่ายดายเพียงแค่เปลี่ยนวิธีการโทรเป็น run()ดังนี้:

app.run(host='0.0.0.0')

1) ผลลัพธ์คือ 127.0.0.1,5000 0.0.0.0:* LISTEN ซึ่งหมายความว่าเซิร์ฟเวอร์ไม่ฟังที่อยู่อื่น ๆ ที่โฮสต์ท้องถิ่น? 2) ฉันลองใช้ ufw อนุญาต 5,000 ไม่ได้ผล
Ilya Smagin

นี่คือเหตุผลที่ฉันแนะนำให้ดูที่เอกสารของ Flask เพื่อกำหนดค่าให้ฟังที่อยู่ทั้งหมด คุณเคยดูไหม การอนุญาตผ่านไฟร์วอลล์เพียงอย่างเดียวจะไม่สามารถแก้ไขได้
Marcin Kaminski

ใช่ขอบคุณฉันเข้าใจแล้วดูแล้ว ใช้ช่องสัญญาณท้องถิ่นแล้ว (ฉันรู้ว่ามันมากเกินไป แต่ใช้งานได้) เพียงพยายามที่จะเข้าใจว่าผลลัพธ์ของ netstat "127.0.0.1,5000 0.0.0.0:* LISTEN" หมายถึงอะไร
Ilya Smagin

คุณไม่ต้องการช่องสัญญาณท้องถิ่น :) สิ่งที่เอาต์พุต netstat แสดงให้คุณเห็นคือเซิร์ฟเวอร์ HTTP ของคุณกำลังรับการเชื่อมต่อจากเครื่องโลคอลของคุณเท่านั้น ดูเหมือนว่าคุณจะต้องเปลี่ยนตัวแปร SERVER_NAME ในการกำหนดค่าของ Flask
Marcin Kaminski

2
สร้างบัญชีที่นี่เพียงเพื่อชื่นชอบคำถามและเลิกตอบคำถามนี้!
Hephaestus


4

ฉันเพิ่งมีปัญหาเดียวกัน ในการแก้ปัญหาฉันได้อัปเดตวิธีเรียกใช้แอปพลิเคชัน

 app.run(debug=True,host='0.0.0.0')

การใช้โฮสต์ = 0.0.0.0 ให้ฉันเข้าถึงแอปของฉันผ่านเครือข่ายท้องถิ่นของฉัน

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