ค้นหาเว็บไซต์

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


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

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

netsh portproxy

โหมดซึ่งทำงานบน Windows ทุกรุ่นตั้งแต่ Win XP ไปจนถึงรุ่นปัจจุบันของ Windows 11 และ Windows Server 2022

วิธีเปิดใช้งานการส่งต่อพอร์ตบน Windows ด้วย Netsh Portproxy

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

ไวยากรณ์คำสั่งมีดังนี้:

netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport

ที่ไหน

  • listenaddress - เป็นที่อยู่ IP ภายในเครื่องเพื่อรับฟังการเชื่อมต่อขาเข้า (มีประโยชน์หากคุณมี NIC หลายตัวในเครือข่ายย่อย/VLAN ที่แตกต่างกัน หรือที่อยู่ IP หลายรายการบนอินเทอร์เฟซเดียว)

  • listenport - หมายเลขพอร์ต TCP ภายในที่จะฟัง (การเชื่อมต่อกำลังรอ)

  • ที่อยู่เชื่อมต่อ - คือที่อยู่ IP ภายในหรือระยะไกล (หรือชื่อ DNS) ที่คุณต้องการเปลี่ยนเส้นทางการเชื่อมต่อขาเข้า

  • connectport - เป็นพอร์ต TCP ที่ใช้เชื่อมต่อ

    listenport

    ถูกส่งต่อไปที่.

ใช้

netsh interface portproxy add
v4tov6

/

v6tov4

/

v6tov6

ตัวเลือก คุณสามารถสร้างกฎการส่งต่อพอร์ตระหว่างที่อยู่ IPv4 และ IPv6

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

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

netstat -na|find "3340"

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

Test-NetConnection -ComputerName localhost -Port 3340

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

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

โดยที่ 10.10.1.110 - ที่อยู่ IP ปัจจุบันของคอมพิวเตอร์ของคุณซึ่งมีการกำหนดค่าการส่งต่อพอร์ต

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

netstat -ano | findstr :3340

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

ตรวจสอบสถานะการใช้บริการได้ที่

services.msc

คอนโซลหรือใช้คำสั่ง PowerShell:

Get-Service iphlpsvc

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

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

เพื่อให้การส่งต่อพอร์ตทำงานบน Windows Server 2003/XP คุณต้องตั้งค่าพารามิเตอร์ IPEnableRouter เพิ่มเติมเป็น 1 ภายใต้คีย์รีจิสทรี HKEY_LOCAL_MACHINE\ System\CurrentControlSet\services\ Tcpip\พารามิเตอร์

Set-ItemProperty -Path HKLM:\system\CurrentControlSet\services\Tcpip\Parameters -Name IpEnableRouter -Value 1

ตัวเลือกนี้ยังช่วยให้คุณเปิดใช้งานการกำหนดเส้นทางระหว่างเครือข่ายย่อยต่างๆ ใน Hyper-V

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

tasklist | findstr 636

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

10.10.1.110:3340

ในตัวอย่างนี้ ต้องเปิดพอร์ต TCP/3340 ในไฟร์วอลล์ Windows Defender ก่อน (ดูส่วนถัดไปของบทความ)

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

กฎการส่งต่อพอร์ต Portproxy เป็นแบบถาวรและไม่ถูกล้างเมื่อคุณรีสตาร์ท Windows กฎเหล่านี้ถูกเก็บไว้ในรีจิสทรี คุณสามารถแสดงรายการกฎการส่งต่อ netsh ในรีจิสทรีโดยใช้ PowerShell:

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp

หากคุณต้องการส่งต่อการเชื่อมต่อ 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

โปรดทราบว่าโหมด portproxy ใน Windows ไม่สนับสนุนการบันทึก IP ต้นทางในแพ็คเก็ตเครือข่ายที่ส่งต่อ หากคุณส่งต่อพอร์ต 443 จากอุปกรณ์ Windows ไปยังเว็บเซิร์ฟเวอร์ภายใน การเชื่อมต่อขาเข้าทั้งหมดจะปรากฏบนเซิร์ฟเวอร์เป้าหมายว่ามาจากที่อยู่ IP เดียวกัน (จากโฮสต์ Windows ของคุณที่เปิดใช้งาน netsh portproxy) หากคุณจำเป็นต้องใช้การส่งต่อ IP ต้นทาง คุณต้องใช้ NAT บนไฟร์วอลล์ภายนอกหรือบน Hyper-V (อธิบายด้านล่าง)

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

การกำหนดค่ากฎไฟร์วอลล์สำหรับโหมดการส่งต่อพอร์ตใน 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

หรือใช้ New-NetFirewallRule PowerShell cmdlet:

New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP -LocalPort 3340 -Action Allow

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

หากคุณปิดใช้งานกฎ portproxy อย่าลืมลบกฎไฟร์วอลล์ที่เหลือดังต่อไปนี้:

netsh advfirewall firewall del rule name="RDP_3340"

หรือลบกฎไฟร์วอลล์ด้วย PowerShell:

Remove-NetFirewallRule -Name RDP_3340

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

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

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

หากต้องการแสดงรายการกฎการส่งต่อพอร์ต 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

เคล็ดลับ คุณยังสามารถแสดงรายการกฎการส่งต่อพอร์ตทั้งหมดใน 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

หากคุณต้องการเปลี่ยนการตั้งค่าของกฎ portproxy ที่มีอยู่ ให้ใช้คำสั่งต่อไปนี้:

netsh interface portproxy set v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3300 connectaddress=10.10.1.110

ในตัวอย่างนี้ เราได้เปลี่ยนหมายเลขพอร์ตเป้าหมาย portproxy เป็น 3300

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

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

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

netsh interface portproxy reset

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

connectaddress

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

rrasmgmt.msc

) หรือด้วยคำสั่ง:

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

รายการกฎการส่งต่อพอร์ต NAT ใน Windows Server สามารถแสดงได้ดังนี้:

netsh routing ip nat show interface

หากคุณติดตั้ง WSL (Windows Subsystem for Linux) บนคอมพิวเตอร์ของคุณ คุณสามารถสร้างสคริปต์ PowerShell อย่างง่ายเพื่อสร้างกฎการส่งต่อพอร์ตไปยังเครื่องเสมือน WSL 2 (WSL2 VM มีอะแดปเตอร์อีเทอร์เน็ตเสมือนของตนเองพร้อมที่อยู่ IP เฉพาะ) :

wsl --shutdown;
netsh interface portproxy reset;
$wsl_ipaddr = wsl -d Ubuntu-20.04 hostname -I;
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=$wsl_ipaddr ;
netsh interface portproxy show all;
exit;

คุณลักษณะโดยนัยอีกประการหนึ่งของ portproxy คือความสามารถในการทำให้บริการเครือข่ายระยะไกลมีลักษณะเหมือนทำงานในเครื่อง ตัวอย่างเช่น คุณต้องการส่งต่อการเชื่อมต่อจากโลคัลพอร์ต 9090 ไปยังเซิร์ฟเวอร์ HTTPS ระยะไกล (

google.com:443

)

netsh interface portproxy add v4tov4 listenport=9090 connectport=443 connectaddress=google.com protocol=tcp

ตอนนี้ หน้าการค้นหาของ Google จะเปิดขึ้นหากคุณไปที่ http://localhost:9090/ ในเบราว์เซอร์ของคุณ (คุณต้องละเว้นข้อผิดพลาด SSL_ERROR_BAD_CERT_DOMAIN) ดังนั้นแม้เบราว์เซอร์จะเข้าถึงที่อยู่ของเครื่องคอมพิวเตอร์ มันก็เปิดหน้าเว็บจากเว็บเซิร์ฟเวอร์ภายนอก

Windows ไม่สามารถส่งต่อช่วงของพอร์ต TCP หากคุณต้องการส่งต่อหลายพอร์ต คุณจะต้องสร้างกฎการเปลี่ยนเส้นทางพอร์ตพร็อกซีหลายรายการด้วยตนเอง

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

การส่งต่อพอร์ตด้วยกฎ NAT บน Hyper-V Virtual Switch

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

สร้างสวิตช์เสมือน Hyper-V:

New-VMSwitch -SwitchName NAT_Switch -SwitchType Internal

ตั้งค่าที่อยู่ IP สำหรับสวิตช์เสมือนใหม่:

New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24  -InterfaceAlias "vEthernet (NAT_Switch)"

เปิดใช้งาน NAT สำหรับเครือข่ายนี้:

New-NetNat -Name NATNetwork -InternalIPInterfaceAddressPrefix 192.168.100.0/24

เชื่อมต่อ VM กับ NAT_Switch ของคุณและกำหนดที่อยู่ IP แบบคงที่ (เช่น 192.168.10.80) ตั้งค่าที่อยู่ IP ของสวิตช์เสมือน Hyper-V (ในกรณีนี้คือ 192.168.100.1) เป็นเกตเวย์เริ่มต้นสำหรับการเชื่อมต่อเครือข่ายของเครื่องเสมือน

ขณะนี้คุณสามารถเปิดใช้งานการส่งต่อพอร์ตจากโฮสต์ Hyper-V ไปยังเครื่องเสมือน:

Add-NetNatStaticMapping -NatName NATNetwork443 -Protocol TCP  -ExternalIPAddress 0.0.0.0/24  -ExternalPort 443  -InternalIPAddress 192.168.10.80  -InternalPort 443

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

หากคุณต้องการสร้างกฎการส่งต่อพอร์ตสำหรับพอร์ตที่ไม่ได้มาตรฐาน อย่าลืมเปิดใน Windows Firewall:

New-NetFirewallRule -DisplayName "HyperV_Nat_444" -Direction Inbound -LocalPort 444 -Protocol TCP -Action Allow -Enabled True

คุณสามารถแสดงรายการกฎการส่งต่อพอร์ต NAT/PAT บนโฮสต์ Hyper-V ได้ดังนี้:

Get-NetNat

บทความที่เกี่ยวข้อง