วิธีการเชื่อมต่อกับ guest VM จากระบบโฮสต์


15

ฉันมีการติดตั้งเว็บเซิร์ฟเวอร์ VM และฉันได้ติดตั้งและเริ่ม Apache VM มีอินเทอร์เฟซเครือข่ายบริดจ์และสามารถ ping จากโฮสต์โดยใช้ 192.168.0.2

อย่างไรก็ตามหากฉันพิมพ์ที่อยู่ IP เดียวกันนั้นลงในเบราว์เซอร์บนเครื่องโฮสต์ฉันคาดหวังว่าจะเห็นหน้า Apache เริ่มต้นที่สร้างขึ้นบน VM แต่แทนที่จะได้รับcan't connect to 192.168.0.2ในเบราว์เซอร์เครื่องโฮสต์

ฉันพลาดอะไรบางอย่างไปอย่างชัดเจน ใครรู้ว่าฉันพลาดหรือทำผิดอะไร

ผลผลิตจาก VM netstat -tnlp

tcp     0     0 0.0.0.0:22        0.0.0.0:*     LISTEN     950/sshd
tcp     0     0 127.0.0.1:25      0.0.0.0:*     LISTEN    1026/master
tcp     0     0 :::22                  :::*     LISTEN     904/sshd
tcp     0     0 ::1:25                 :::*     LISTEN     980/master

ภาพคร่าวๆของสิ่งที่ฉันคิดว่ากิจกรรมเครือข่าย / การเชื่อมต่อจะมีลักษณะ

                               ป้อนคำอธิบายรูปภาพที่นี่


หากคุณเห็นเท่านั้น:::80Apache จะรับฟังการเชื่อมต่อ IPv6 เท่านั้น คุณลองตรวจสอบListenคำสั่งแล้วหรือยัง?
Lekensteyn

ลองเพิ่มการ-pตั้งค่าสถานะเพื่อnetstatตรวจสอบว่าคุณ Apache กำลังฟังบนพอร์ต 80 และไม่ใช่บริการอื่น ๆ คุณสามารถเรียกใช้curl localhostจากแขก อะไรgrep -C3 -rni Listen /etc/httpd/แสดง
Lekensteyn

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

คำตอบ:


14

ปัญหา # 1 - ประเภทเครือข่าย VM

เครือข่ายมี 3 โหมด:

  1. NAT
  2. โฮสต์เท่านั้น
  3. สะพาน

รายละเอียดเกี่ยวกับการตั้งค่า

ใช้เมื่อใด?

  • # 1 : สำหรับการพัฒนาแอพ Facebook / เว็บที่อยู่บนเซิร์ฟเวอร์อื่น ๆ
  • # 2 : หากคุณต้องการสร้างแอปของคุณเองและทดสอบจากโฮสต์ VirtualBox (ไม่ใช่แค่เกสต์ VM)
  • # 3 : หากคุณต้องการสร้างแอพและทดสอบจากระบบอื่น ๆ บน LAN

ปัญหา # 2 - การบล็อกไฟร์วอลล์

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

ปิดการใช้งานชั่วคราว

บน CentOS คุณใช้คำสั่งนี้เพื่อปิดการใช้งาน

$ /etc/init.d/iptables stop

ตรวจสอบว่าฟังจาก Apache

คุณสามารถยืนยันได้ว่ากำลังฟังพอร์ตนี้อยู่

$ netstat -antp | grep :80 | head -1 | column -t
tcp  0  0  :::80  :::*  LISTEN  3790/httpd

ยืนยันการปิดไฟร์วอลล์

ไฟร์วอลล์สามารถยืนยันได้ว่าเปิดกว้าง

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination      

หากสามารถแก้ไขปัญหาของคุณได้คุณสามารถเพิ่มกฎที่อนุญาตการรับส่งข้อมูลผ่าน TCP พอร์ต 80 อย่างถาวร

การเพิ่มกฎสำหรับพอร์ต TCP 80

$ /etc/init.d/iptables restart
$ iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$ /etc/init.d/iptables save

หมายเหตุ:สิ่งนี้จะทำให้กฎคงอยู่ระหว่างการรีบูต

ไฟร์วอลล์ยอมรับพอร์ต TCP 80

ระบบที่เปิดพอร์ต 80 จะมีลักษณะดังนี้:

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:8834 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

ปัญหา # 3 - ฟัง Apache หรือไม่

ในปัญหาข้างต้นเราเห็นว่า Apache กำลังฟังอยู่ แต่บางครั้งมันถูกตั้งค่าผิดพลาดเพื่อให้ฟังได้เพียง 1 ที่อยู่ IP หรือว่ากำลังฟังบนอินเทอร์เฟซเครือข่ายอื่น netstatสามารถใช้คำสั่งเพื่อตรวจสอบสิ่งนี้รวมถึงตรวจสอบไฟล์การกำหนดค่า Apache

$ netstat -anpt | grep :80 | column -t
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  1750/httpd

สิ่งนี้แสดงให้เห็นว่า Apache กำลังฟังบนอินเตอร์เฟสทั้งหมด (IP 0.0.0.0)

ฉันจะไม่ทำซ้ำสิ่งที่คำตอบของ@ Lekensteynซึ่งครอบคลุมประเด็นนี้โดยเฉพาะในรายละเอียดเพิ่มเติมที่นี่

อ้างอิง


ตอนนี้ฉันสับสนอย่างสมบูรณ์ ฉันได้รับ VM ในโหมด bridged แล้วฉันสามารถ ping VM จากโฮสต์ได้ แต่ฉันไม่สามารถไปที่ที่อยู่ IP เดียวกันจากเว็บเบราว์เซอร์บนโฮสต์ได้แม้ว่า VM จะมี apache ติดตั้งและเริ่มทำงานแล้วฉันควรเห็นit worked!หน้าอาปาเช่
oshirowanen

@oshirowanen - ขอบคุณที่ไม่ทำให้ผิดหวังเพราะเราพยายามแก้ไขปัญหา 8-) ตรวจสอบให้แน่ใจว่า Apache ทำงานบน CentOS /etc/init.d/httpd statusแล้วควรแสดงว่ากำลังทำงานอยู่
slm

1
ฉันหยุดไฟร์วอลล์บน VM และตอนนี้ฉันสามารถดูหน้า IP เริ่มต้นเมื่อใช้เว็บเบราว์เซอร์บนเครื่องโฮสต์เพื่อเข้าถึง url ของ VM !!!
oshirowanen

1
@oshirowanen - WOOHOO! ตกลงดังนั้นปัญหาทั้งหมดเป็นเพียงไฟร์วอลล์ฉันจะเพิ่มคำสั่งเพื่อเพิ่มกฎลงในไฟร์วอลล์ของคุณคุณยังสามารถทำให้ถาวรด้วยคำสั่ง/sbin/service iptables saveนี้
slm

ใช่ ฉันทำการติดตั้ง CentOS ให้น้อยที่สุดและไม่ควรสันนิษฐานว่าไฟร์วอลล์ถูกปิดใช้งานโดยค่าเริ่มต้น ... ตามจริงแล้วไฟร์วอลล์ไม่ได้อยู่ในใจของฉัน ขอบคุณที่สละเวลาช่วย
oshirowanen

2

มีแนวโน้มว่าการติดตั้ง Apache ของคุณจะได้รับการกำหนดค่าให้รับฟังบนโฮสต์ในเครื่องเท่านั้น คุณสามารถตรวจสอบได้โดยทำงานในแขกของคุณ:

$ netstat -tnl | grep :80
Proto Recv-Q Send-Q Local Address      Foreign Address  State
tcp        0      0 0.0.0.0:80         0.0.0.0:*        LISTEN
tcp6       0      0 :::80              :::*             LISTEN

ถ้ามันบอกว่า0.0.0.0:80มันฟังในอินเทอร์เฟซทั้งหมด ในกรณีของคุณฉันคาดหวัง127.0.0.1:80แทน ในการแก้ปัญหานี้ให้แก้ไขการกำหนดค่า Apache ของคุณ (บางที่/etc/httpd/conf/) และเปลี่ยนแปลง:

Listen 127.0.0.1:80

ถึง:

Listen 80

คุณสามารถใช้nmapเพื่อตรวจสอบบริการที่มีในเครื่องของคุณ ควรมีลักษณะดังนี้:

$ nmap 192.168.0.2

Starting Nmap 6.40 ( http://nmap.org ) at 2014-01-11 15:22 CET
Nmap scan report for localhost (192.168.0.2)
Host is up (0.0036s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.21 seconds

2

บน CentOS 7 firewalld ได้แทนที่ iptables เป็นไฟร์วอลล์เริ่มต้น

ฉันต้องใช้

systemctl stop firewalld

เพื่อหยุดไฟร์วอลล์ชั่วคราวเพื่อทดสอบการเชื่อมต่อจากโฮสต์ไปยัง CentOS VM

ดูเพิ่มเติมได้ที่นี่: /programming/24756240/how-can-i-use-iptables-on-centos-7

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