การกำหนดค่าการส่งต่อพอร์ตใน 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 addv4tov6/
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










