Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

การกำหนดค่าการส่งต่อพอร์ตบน Windows

คุณสามารถกำหนดค่าการส่งต่อพอร์ตเครือข่าย ใน Windows ทุกรุ่นโดยไม่ต้องใช้เครื่องมือของบุคคลที่สาม เมื่อใช้กฎการส่งต่อพอร์ต คุณสามารถเปลี่ยนเส้นทางการเชื่อมต่อ TCP ขาเข้า (IPv4 หรือ IPv6) จากพอร์ต TCP ในเครื่องไปยังหมายเลขพอร์ตอื่น หรือแม้แต่พอร์ตบนคอมพิวเตอร์ระยะไกล นอกจากนี้ ไม่จำเป็นสำหรับ Windows ที่จะต้องมีบริการที่รับฟังบนพอร์ต TCP เฉพาะ การส่งต่อพอร์ตของ Windows มักใช้เพื่อข้ามไฟร์วอลล์หรือเพื่อซ่อนโฮสต์ภายในหรือบริการจากเครือข่ายภายนอก (NAT/PAT)

ในโลกของ Linux การส่งต่อพอร์ตได้รับการกำหนดค่าค่อนข้างง่ายโดยใช้ iptables หรือ firewalld . ในระบบ Windows Server โดยทั่วไปจะใช้ Routing and Remote Access Service (RRAS) เพื่อกำหนดค่าการเปลี่ยนเส้นทางพอร์ต อย่างไรก็ตาม มีวิธีที่ง่ายกว่าในการกำหนดค่าการส่งต่อพอร์ต ซึ่งทำงานได้ดีใน Windows ทุกรุ่น

จะกำหนดค่าการส่งต่อพอร์ตใน Windows 10 โดยใช้ Netsh Portproxy ได้อย่างไร

คุณสามารถกำหนดค่าการส่งต่อพอร์ตใน Windows โดยใช้ Portproxy โหมดของ Netsh สั่งการ. ไวยากรณ์คำสั่งมีดังนี้:

netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport
ที่ไหน

  • ฟังที่อยู่ – เป็นที่อยู่ IP ในเครื่องเพื่อรับฟังการเชื่อมต่อขาเข้า (มีประโยชน์หากคุณมี NIC หลายตัวหรือที่อยู่ IP หลายรายการในอินเทอร์เฟซเดียว)
  • รับฟัง – หมายเลขพอร์ต TCP ฟังในเครื่อง (การเชื่อมต่อกำลังรออยู่);
  • ที่อยู่เชื่อมต่อ – เป็นที่อยู่ IP ในเครื่องหรือระยะไกล (หรือชื่อ DNS) ที่คุณต้องการเปลี่ยนเส้นทางการเชื่อมต่อขาเข้า
  • พอร์ตเชื่อมต่อ – เป็นพอร์ต TCP ที่เชื่อมต่อจาก listenport จะถูกส่งต่อไปยัง.
การใช้ netsh interface portproxy add v4tov6 /v6tov4 /v6tov6 คุณสามารถสร้างกฎการส่งต่อพอร์ตระหว่างที่อยู่ IPv4 และ IPv6

สมมติว่างานของเรา i คือทำให้บริการ RDP ตอบสนองบนพอร์ตที่ไม่ได้มาตรฐาน เช่น 3340 (พอร์ตสามารถเปลี่ยนแปลงได้ในการตั้งค่าของบริการ Remote Desktop แต่เรากำลังใช้ RDP เพื่อให้สาธิตพอร์ตได้ง่ายขึ้น การส่งต่อ) ในการดำเนินการนี้ เราจำเป็นต้องเปลี่ยนเส้นทางการรับส่งข้อมูลขาเข้าจากพอร์ต TCP 3340 ไปยังพอร์ตภายในเครื่องอื่น – 3389 (นี่คือหมายเลขพอร์ต RDP เริ่มต้น)

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

netstat -na|find "3340"

หรือคุณสามารถตรวจสอบว่าพอร์ตไม่ได้ฟังในเครื่องโดยใช้ PowerShell cmdlet Test-NetConnection:

Test-NetConnection -ComputerName localhost -Port 3340

การกำหนดค่าการส่งต่อพอร์ตบน Windows

ในการสร้างกฎการส่งต่อพอร์ตใน Windows 10 ให้เรียกใช้พรอมต์คำสั่งในฐานะผู้ดูแลระบบและเรียกใช้คำสั่งต่อไปนี้:

netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110

การกำหนดค่าการส่งต่อพอร์ตบน Windows

โดยที่ 10.10.1.110 – ที่อยู่ IP ปัจจุบันของคอมพิวเตอร์เครื่องนี้

ตอนนี้ ให้ใช้เครื่องมือ netstat เพื่อตรวจสอบว่า Windows กำลังฟังพอร์ต 3340 ในเครื่องหรือไม่:

netstat -ano | findstr :3340

การกำหนดค่าการส่งต่อพอร์ตบน Windows

หมายเหตุ . หากคำสั่งนี้ไม่คืนค่าใดๆ และการส่งต่อพอร์ตผ่านอินเทอร์เฟซ netsh portproxy ไม่ทำงาน ตรวจสอบให้แน่ใจว่าคุณมี iphlpsvc บริการ (IP Helper) ที่ทำงานบนคอมพิวเตอร์ของคุณ

การกำหนดค่าการส่งต่อพอร์ตบน Windows

ต้องเปิดใช้งานการรองรับ IPv6 บนอินเทอร์เฟซเครือข่ายที่สร้างกฎการส่งต่อพอร์ต

การกำหนดค่าการส่งต่อพอร์ตบน Windows

สิ่งเหล่านี้เป็นข้อกำหนดเบื้องต้นสำหรับการดำเนินการที่ถูกต้องของการส่งต่อพอร์ต หากไม่มีบริการตัวช่วย IP และไม่ได้เปิดใช้งานการรองรับ IPv6 การเปลี่ยนเส้นทางพอร์ตจะไม่ทำงาน

เพื่อให้การส่งต่อพอร์ตทำงานบน Windows Server 2003/XP คุณต้องตั้งค่า IPEnableRouter เพิ่มเติม พารามิเตอร์เป็น 1 ในรีจิสตรีคีย์ HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters

คุณสามารถค้นหาว่ากระบวนการใดกำลังฟังพอร์ตที่ระบุโดยใช้ PID (ในตัวอย่างของเราคือ PID คือ 636):

tasklist | findstr 636

มาลองเชื่อมต่อกับพอร์ตนี้จากคอมพิวเตอร์ระยะไกลโดยใช้ไคลเอนต์ RDP ควรระบุพอร์ต 3340 เป็นหมายเลขพอร์ต RDP มีการระบุหลังโคลอนตามที่อยู่เซิร์ฟเวอร์ RDP ตัวอย่างเช่น 10.10.1.110:3340

การกำหนดค่าการส่งต่อพอร์ตบน Windows

ควรสร้างการเชื่อมต่อ RDP สำเร็จ

หากคุณต้องการส่งต่อการเชื่อมต่อ TCP ขาเข้าไปยังคอมพิวเตอร์ระยะไกล ให้ใช้คำสั่งต่อไปนี้:

netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.100.101

กฎนี้จะเปลี่ยนเส้นทางการรับส่งข้อมูล RDP ขาเข้าทั้งหมด (จากพอร์ต TCP ในเครื่อง 3389) จากคอมพิวเตอร์เครื่องนี้ไปยังโฮสต์ระยะไกลที่มีที่อยู่ IP 192.168.1.100

นอกจากนี้ คุณสามารถใช้ช่องสัญญาณ Windows SSH เพื่อส่งต่อพอร์ตภายในเครื่องไปยังเซิร์ฟเวอร์ระยะไกลได้

การจัดการกฎการส่งต่อพอร์ตใน Windows

สำคัญ . ตรวจสอบให้แน่ใจว่าไฟร์วอลล์ของคุณ (ไฟร์วอลล์ Microsoft Windows Defender หรือไฟร์วอลล์ของบริษัทอื่นที่มักรวมอยู่ในซอฟต์แวร์ป้องกันไวรัส) อนุญาตให้มีการเชื่อมต่อขาเข้าไปยังพอร์ตใหม่ คุณสามารถเพิ่มกฎการอนุญาตใหม่ให้กับไฟร์วอลล์ Windows Defender โดยใช้คำสั่ง:

netsh advfirewall firewall add rule name=”forwarded_RDPport_3340” protocol=TCP dir=in localip=10.1.1.110  localport=3340 action=allow

หรือใช้ cmdlet ของ New-NetFirewallRule PowerShell:
New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP –LocalPort 3340 -Action Allow

เมื่อสร้างกฎไฟร์วอลล์ขาเข้าสำหรับพอร์ต 3340 ผ่านอินเทอร์เฟซกราฟิกของไฟร์วอลล์ Windows Defender ไม่จำเป็นต้องมีโปรแกรมเชื่อมโยงใดๆ พอร์ตนี้รับฟังโดยไดรเวอร์เครือข่ายเท่านั้น

คุณสามารถสร้างกฎการส่งต่อพอร์ตของ Windows จำนวนเท่าใดก็ได้ กฎพอร์ตพร็อกซีอินเทอร์เฟซ netsh ทั้งหมดจะคงอยู่และถูกเก็บไว้ในระบบหลังจากรีสตาร์ท Windows

นอกจากนี้ยังมีบางกรณีที่ใน Windows Server 2012 R2 กฎการส่งต่อพอร์ตถูกรีเซ็ตหลังจากเซิร์ฟเวอร์รีบูต ในกรณีนี้ คุณต้องตรวจสอบว่ามีการตัดการเชื่อมต่อเป็นระยะบนอินเทอร์เฟซเครือข่ายหรือไม่ และที่อยู่ IP เปลี่ยนแปลงเมื่อระบบปฏิบัติการบู๊ตหรือไม่ (ควรใช้ IP แบบคงที่แทน DHCP แบบไดนามิก) เพื่อแก้ปัญหา ฉันต้องเพิ่มแบตช์สคริปต์ใน Windows Task Scheduler ด้วยกฎพอร์ตพร็อกซีอินเทอร์เฟซ netsh ที่ทำงานเมื่อเริ่มต้นระบบ

หากต้องการแสดงรายการกฎการส่งต่อพอร์ต TCP ที่ใช้งานอยู่ทั้งหมดบน Windows ให้เรียกใช้คำสั่ง:

netsh interface portproxy show all

ในกรณีของเรามีกฎการส่งต่อเพียงหนึ่งกฎจากพอร์ตในเครื่อง 3340 ถึง 3389:

Listen on ipv4:             Connect to ipv4:
Address         Port        Address         Port
--------------- ----------  --------------- ----------
10.1.1.110     3340        10.1.1.110     3389

การกำหนดค่าการส่งต่อพอร์ตบน Windows

เคล็ดลับ . คุณยังสามารถแสดงรายการการตั้งค่าการส่งต่อพอร์ตใน portproxy ได้ดังนี้:

netsh interface portproxy dump

#========================
# Port Proxy configuration
#========================
pushd interface portproxy
reset
add v4tov4 listenport=3340 connectaddress=10.1.1.110 connectport=3389
popd
# End of Port Proxy configuration

การกำหนดค่าการส่งต่อพอร์ตบน Windows

ในการลบกฎการส่งต่อพอร์ตเฉพาะ:

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

หากต้องการลบกฎการแมปที่มีอยู่ทั้งหมดและล้างตารางกฎการส่งต่อพอร์ตโดยสมบูรณ์:

netsh interface portproxy reset

สำคัญ . รูปแบบการส่งต่อนี้ใช้ได้กับพอร์ต TCP เท่านั้น คุณจะไม่สามารถส่งต่อพอร์ต UDP ด้วยวิธีนี้ นอกจากนี้ คุณไม่สามารถใช้  อินเทอร์เฟซการวนรอบ 127.0.0.1 เป็น connectaddress .

คุณสามารถใช้ Windows Server โดยติดตั้งบทบาท RRAS และ NAT เพื่อกำหนดค่าการส่งต่อพอร์ตสำหรับการรับส่งข้อมูล UDP คุณสามารถกำหนดค่าการส่งต่อพอร์ตระหว่างอินเทอร์เฟซของเซิร์ฟเวอร์โดยใช้สแน็ปอินกราฟิก (rrasmgmt.msc ) หรือด้วยคำสั่ง:

netsh routing ip nat add portmapping Ethernet1 udp 0.0.0.0 53 192.168.100.100 53

คุณสมบัติ portproxy อีกประการหนึ่งคือโอกาสในการทำให้ดูเหมือนบริการเครือข่ายระยะไกลที่ทำงานอยู่ในเครื่อง

ตัวอย่างเช่น ให้เปลี่ยนเส้นทางการเชื่อมต่อจากพอร์ตในเครื่อง 5555 ไปยังเซิร์ฟเวอร์ HTTP ระยะไกลด้วยที่อยู่ IP 157.166.226.25 (เว็บไซต์ CNN):

netsh interface portproxy add v4tov4 listenport=5555 connectport=80 connectaddress= 157.166.226.25 protocol=tcp

ตอนนี้ ถ้าคุณไปที่ https://localhost:5555/ ในเบราว์เซอร์ของคุณ หน้าเริ่มต้นของ CNN จะเปิดขึ้น ดังนั้นแม้ว่าเบราว์เซอร์จะเข้าถึงคอมพิวเตอร์ในพื้นที่ แต่ก็เปิดหน้าจากเว็บเซิร์ฟเวอร์ภายนอก

การกำหนดค่าการส่งต่อพอร์ตบน Windows

กฎการส่งต่อพอร์ตยังสามารถใช้เพื่อส่งต่อพอร์ตจากที่อยู่ IP ภายนอกของ NIC จริงไปยังพอร์ตของเครื่องเสมือนที่ทำงานบนโฮสต์เดียวกัน ใน Hyper-V คุณสามารถกำหนดค่าการส่งต่อพอร์ตในระดับ Virtual Switch ได้ (ดูด้านล่าง)

Windows ไม่สามารถส่งต่อช่วงพอร์ต TCP ได้ หากคุณต้องการส่งต่อพอร์ตหลายพอร์ต คุณจะต้องสร้างกฎการส่งต่อพอร์ตพร็อกซีหลายรายการด้วยตนเอง วิธีที่ง่ายที่สุดคือการสร้างรายการ netsh interface portproxy add คำสั่งที่มีหมายเลขพอร์ตต่างกันในแผ่นจดบันทึก แล้ววางลงในพรอมต์คำสั่งเพื่อดำเนินการ

การส่งต่อพอร์ตในเซิร์ฟเวอร์ Hyper-V

เมื่อใช้บทบาท Hyper-V บนคอมพิวเตอร์ของคุณ (สามารถติดตั้งได้ทั้งบน Windows 10 และ Windows Server หรือเป็นเซิร์ฟเวอร์ Hyper-V ฟรี) คุณสามารถกำหนดค่ากฎการส่งต่อพอร์ต DNAT โดยใช้ PowerShell สมมติว่าคุณต้องการเปลี่ยนเส้นทางการรับส่งข้อมูล https ทั้งหมดที่โฮสต์ Hyper-V ของคุณได้รับไปยังที่อยู่ IP ของเครื่องเสมือนที่ทำงานบนโฮสต์ ในการดำเนินการนี้ ให้ใช้คำสั่ง Hyper-V StaticMapping

ก่อนอื่น คุณต้องสร้าง Virtual Switch ด้วย NAT:

New-VMSwitch -Name "HTTPS-NAT" -SwitchType NAT -NATSubnetAddress 192.168.100.0/24

จากนั้น คุณต้องเชื่อมต่อ VM ที่จำเป็นกับ vswitch ที่ระบุ และเปิดใช้งานกฎการแปลที่อยู่สำหรับเครื่องเสมือนทั้งหมดที่เชื่อมต่อผ่านสวิตช์เสมือน Hyper-V:

New-NetNat -Name HTTPS-NAT -InternalIPInterfaceAddressPrefix 192.168.100.0/24
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/24" -ExternalPort 443 -Protocol TCP -InternalIPAddress "192.168.100.77" -InternalPort 443 -NatName HTTPS-NAT

หลังจากดำเนินการคำสั่ง PowerShell เหล่านี้ การรับส่งข้อมูล HTTPS ทั้งหมดที่มาถึงพอร์ต 443 ของโฮสต์ Hyper-V จะถูกส่งต่อไปยังที่อยู่ IP ส่วนตัวของเครื่องเสมือน