Score:2

วิธีเข้าถึงบริการที่ทำงานบนโฮสต์จาก WSL2 (การเชื่อมต่อถูกปฏิเสธ)

ธง cn

ฉันมีซีลีเนียมทำงานบนเครื่องโฮสต์ และแอปของฉันอยู่ในคอนเทนเนอร์นักเทียบท่า (ภายใน WSL2)

ฉันกำลังพยายามให้แอปเชื่อมต่อกับซีลีเนียมซึ่งกำลังฟังอยู่ที่พอร์ต 4445 มันเคยใช้งานได้ไม่กี่เดือนที่ผ่านมา ฉันคิดว่ามีบางอย่างเปลี่ยนไปใน WSL

โฮสต์กำลังฟังอยู่ที่ 4445:

PS> netstat -ano | ค้นหาstr :4445
  TCP 0.0.0.0:4445 0.0.0.0:0 กำลังฟัง 11604
  TCP [::]:4445 [::]:0 กำลังฟัง 11604

ฉันสามารถเข้าถึงซีลีเนียมจากเครื่องโฮสต์ windows:

> curl -X โพสต์ http://DESKTOP-HED9HVG:4445/wd/hub
{"สถานะ":".....}

แต่ไม่ใช่จาก WSL2:

$ curl -X โพสต์ http://172.22.241.214:4445/wd/hub
curl: (7) ไม่สามารถเชื่อมต่อกับพอร์ต 172.22.241.214 4445: การเชื่อมต่อถูกปฏิเสธ

ฉันลองใช้หลายตัวเลือกสำหรับ ip ที่ฉันใช้ใน curl:

  • ไอพีแอดเดรส eth0 ไอพี
  • $(ชื่อโฮสต์)
  • ที่อยู่ IP จากผลลัพธ์ของ ipconfig /ทั้งหมด | ค้นหา IPv4
  • ผลลัพธ์ที่อยู่ IP ของ เส้นทาง -n | grep UG | หัว -n1 | awk '{พิมพ์ $2}'

ฉันติดตั้ง tcptraceroute บน WSL และเรียกใช้ นี่คือผลลัพธ์:

$ tcptraceroute $ (ชื่อโฮสต์) 4445
อุปกรณ์ที่เลือก, ที่อยู่ 127.0.0.1, พอร์ต 53915 สำหรับแพ็กเก็ตขาออก
ติดตามเส้นทางไปยัง DESKTOP-WXYZ1 (127.0.1.1) บนพอร์ต TCP 4445, 30 hops สูงสุด
 1 DESKTOP-WXYZ1.localdomain (127.0.1.1) [ปิด] 0.075 ms 0.082 ms 0.074 ms

อย่างไรก็ตาม การ ping จาก WSL ไปยังโฮสต์นั้นใช้งานได้:

$ ping $ (ชื่อโฮสต์)
PING DESKTOP-WXYZ1.localdomain (127.0.1.1) 56(84) ไบต์ของข้อมูล
64 ไบต์จาก DESKTOP-WXYZ1.localdomain (127.0.1.1): icmp_seq=1 ttl=64 เวลา=0.053 ms

ฉันพยายามปิดการใช้งานไฟร์วอลล์ของ windows ทั้งหมด แต่ก็ไม่ได้ช่วยอะไร ฉันยังเพิ่มกฎใน "Windows Defender Firewall" เพื่อเปิดใช้งานพอร์ต 4445 โดยเฉพาะ มันยังไม่ได้ช่วย

ข้อมูลเกี่ยวกับ WSL:

>wsl -l -v
  ชื่อรุ่นของรัฐ
* Ubuntu-20.04 ทำงาน 2
  นักเทียบท่าเดสก์ท็อปกำลังทำงาน 2
  docker-desktop-data กำลังรัน 2

มีความคิดวิธีแก้ปัญหานี้หรือไม่?

Score:2
ธง jp

ดูคำแนะนำที่นี่

https://docs.microsoft.com/en-us/windows/wsl/networking#accessing-windows-networking-apps-from-linux-host-ip

หากคุณต้องการเข้าถึงแอพเครือข่ายที่ทำงานบน Windows (เช่น แอพที่ทำงานบนเซิร์ฟเวอร์ NodeJS หรือ SQL) จากการกระจาย Linux ของคุณ (เช่น Ubuntu) คุณต้องใช้ที่อยู่ IP ของเครื่องโฮสต์ของคุณ แม้ว่านี่จะไม่ใช่สถานการณ์ทั่วไป คุณสามารถทำตามขั้นตอนเหล่านี้เพื่อให้มันใช้งานได้

รับที่อยู่ IP ของเครื่องโฮสต์ของคุณโดยเรียกใช้คำสั่งนี้จากการแจกจ่าย Linux ของคุณ: แมว /etc/resolv.conf คัดลอกที่อยู่ IP ตามหลังคำ: เนมเซิร์ฟเวอร์ เชื่อมต่อกับเซิร์ฟเวอร์ Windows โดยใช้ที่อยู่ IP ที่คัดลอก ภาพด้านล่างแสดงตัวอย่างนี้โดยการเชื่อมต่อกับเซิร์ฟเวอร์ Node.js ที่ทำงานอยู่ใน Windows ผ่าน curl

คุณจะต้องอนุญาตการเชื่อมต่อขาเข้ากับพอร์ตนั้นในโฮสต์ (ผ่านกฎไฟร์วอลล์)

cn flag
มีการจับกับเรื่องนี้ หากคุณใช้งาน docker daemon บน wsl เซิร์ฟเวอร์ชื่อ resolv.conf จะชี้ไปที่เกตเวย์ wsl ใน wsl ไม่ใช่ ip โฮสต์ของ windows จริง
jp flag
คุณยังสามารถเรียกใช้บริการของคุณบนโฮสต์และคำขอจากภายใน WSL จะถูกส่งไปยังพวกเขา
cn flag
คุณจะเข้าถึงได้อย่างไร ฉันถือว่าผ่าน host.docker.internal? นั่นคือเดสก์ท็อปนักเทียบท่าเฉพาะและแม้ว่าจะไม่ใช่ (โดยใช้วิธีแก้ปัญหาโฮสต์เกตเวย์) ก็จะมองหาบริการบน WSL เป็นโฮสต์สำหรับ daemon ไม่ใช่บริการที่ทำงานบน windows
jp flag
คุณสามารถเข้าถึงได้ผ่าน IP โดยตรง รายการ DNS คือ `ชื่อโฮสต์' ของโฮสต์ IP นั้นเปิดเผยบริการบนโฮสต์ Windows ไม่ใช่ WSL สิ่งนี้ไม่เกี่ยวข้อง / เฉพาะเจาะจงกับนักเทียบท่า คุณกำลังพยายามเข้าถึงบริการบนโฮสต์จากภายในคอนเทนเนอร์หรือไม่
cn flag
ฉันคิดว่าคุณสื่อสารผิดพลาด ฉันกำลังพูดถึงการเข้าถึงบริการ windows จากคอนเทนเนอร์ที่ทำงานบน daemon ที่โฮสต์ด้วย wsl คำขอ wsl จะส่งไปยังบริการ windows คำขอคอนเทนเนอร์จะค้นหาบริการบน wsl คือสิ่งที่ฉันพบ
Score:0
ธง cn

หลังจากพยายามหลายครั้ง วิธีแก้ปัญหาก็มาจากความคิดเห็นที่ไม่ชัดเจนในปัญหา GitHub: https://github.com/Microsoft/WSL/issues/1032#issuecomment-891618766

โดยทั่วไป:

หากคุณใช้ Docker Desktop ด้วย คุณสามารถเข้าถึงโฮสต์ Windows ของคุณด้วย host.docker.internal
Score:0
ธง cn

ฉันประสบปัญหานี้จริง ๆ ในโครงการที่ฉันกำลังทำงานอยู่และไม่สามารถใช้เดสก์ท็อปนักเทียบท่าได้

สิ่งที่ฉันต้องทำคือสร้างไฟร์วอลล์และกฎ portproxy เพื่อเลี่ยงผ่านไฟร์วอลล์ wsl และ windows คุณต้องมี ip ของอะแดปเตอร์อีเธอร์เน็ตโฮสต์ ดังนั้นให้เรียกใช้ ipconfig ใน windows เพื่อรับ คุณจะต้องมีพอร์ตการฟังสำหรับบริการบน windows และ WSL ip (ifconfig ใน wsl ค้นหาค่า ivp4 inet ของ eth0)

คำสั่งสำหรับกฎไฟร์วอลล์จาก powershell บนโฮสต์:

ใหม่-NetFireWallRule -DisplayName 'การปลดล็อกไฟร์วอลล์ WSL' -ทิศทางขาออก -LocalPort your_port_here -การดำเนินการอนุญาต -โปรโตคอล TCP

ใหม่-NetFireWallRule -DisplayName 'การปลดล็อกไฟร์วอลล์ WSL' -ทิศทางขาเข้า -LocalPort your_port_here -การดำเนินการอนุญาต -โปรโตคอล TCP

เมื่อข้ามไฟร์วอลล์ windows แล้ว คุณสามารถ "ส่งต่อ" พอร์ตไปยัง wsl จากพรอมต์ของ windows ได้เช่นกัน:

อินเทอร์เฟซ netsh portproxy เพิ่ม v4tov4 listenport=your_port_here listenaddress=host_ip_here connectport=your_port_here connectaddress=wsl_ip_here

เมื่อคุณเรียกใช้คำสั่งทั้งหมดแล้ว คุณควรจะสามารถเข้าถึงบริการโฮสต์ผ่าน <host_ip>:<host_port> จากคอนเทนเนอร์

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา