คุณสามารถกำหนดค่า network ports forwarding ใน Windows ทุกเวอร์ชันโดยไม่ใช้เครื่องมือภายนอก โดยใช้กฎการส่งต่อพอร์ต คุณสามารถเปลี่ยนเส้นทางการเชื่อมต่อ TCP เข้าขา (IPv4 หรือ IPv6) จากพอร์ต TCP ท้องถิ่นไปยังหมายเลขพอร์ตอื่นใด หรือแม้แต่พอร์ตบนคอมพิวเตอร์ระยะไกล นอกจากนี้ ไม่จำเป็นที่ Windows จะต้องมีบริการที่ listen บนพอร์ต TCP เฉพาะเจาะจง การส่งต่อพอร์ต Windows มักใช้เพื่อข้ามไฟร์วอลล์ หรือซ่อนโฮสต์ภายในหรือบริการจากเครือข่ายภายนอก (NAT/PAT)
ในโลก Linux การส่งต่อพอร์ตตั้งค่าได้อย่างง่ายดายโดยใช้ iptables or 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
โดยที่
- listenaddress – คือที่อยู่ IP ท้องถิ่นที่ listen สำหรับการเชื่อมต่อเข้าขา (มีประโยชน์หากคุณมี NIC หลายตัวหรือที่อยู่ IP หลายตัวบนอินเตอร์เฟซเดียว);
- listenport – หมายเลขพอร์ต TCP ท้องถิ่นที่ listen (รอการเชื่อมต่อ);
- connectaddress – คือที่อยู่ IP ท้องถิ่นหรือระยะไกล (หรือชื่อ DNS) ที่คุณต้องการเปลี่ยนเส้นทางการเชื่อมต่อเข้าขา;
- connectport – คือพอร์ต TCP ที่การเชื่อมต่อจาก
listenportจะถูกส่งต่อไป
โดยใช้ตัวเลือก netsh interface portproxy add v4tov6/v6tov4/v6tov6 คุณสามารถสร้างกฎการส่งต่อพอร์ตระหว่างที่อยู่ IPv4 และ IPv6
สมมติว่าภารกิจของเราคือ ทำให้บริการ RDP ตอบสนองบนพอร์ตที่ไม่มาตรฐาน เช่น 3340 (พอร์ตสามารถเปลี่ยนได้ในการตั้งค่าบริการ Remote Desktop แต่เราใช้ RDP เพื่อ示範การส่งต่อพอร์ตให้ง่ายขึ้น) เพื่อทำเช่นนี้ เราต้องเปลี่ยนเส้นทางทราฟฟิกเข้าขาจาก TCP พอร์ต 3340 ไปยังพอร์ตท้องถิ่นอีกพอร์ตหนึ่ง — 3389 (นี่คือหมายเลขพอร์ต RDP เริ่มต้น)
โปรดทราบว่าหมายเลขพอร์ตท้องถิ่นที่คุณระบุใน listenport ไม่ควรถูก listen (ใช้) โดยบริการหรือกระบวนการอื่น ตรวจสอบว่าหมายเลขพอร์ตไม่ได้ถูกใช้:
netstat -na|find "3340"
หรือคุณสามารถตรวจสอบได้ว่าพอร์ตไม่ได้ listen ท้องถิ่นโดยใช้คอมมานด์เลต PowerShell Test-NetConnection:
Test-NetConnection -ComputerName localhost -Port 3340

เพื่อสร้างกฎการส่งต่อพอร์ตบน Windows 10 ให้รัน command prompt เป็น administrator และรันคำสั่งต่อไปนี้:
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 กำลัง listen บนพอร์ตท้องถิ่น 3340:
netstat -ano | findstr :3340

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

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

นี่คือข้อกำหนดเบื้องต้นสำหรับการทำงานที่ถูกต้องของการส่งต่อพอร์ต โดยไม่มีบริการ IP Helper และโดยไม่มีการเปิดใช้งานการรองรับ IPv6 การเปลี่ยนเส้นทางพอร์ตจะไม่ทำงาน
เพื่อให้การส่งต่อพอร์ตทำงานบน Windows Server 2003/XP คุณต้องเพิ่มเติมตั้งค่าพารามิเตอร์ IPEnableRouter เป็น 1 ในคีย์รีจิสทรี HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters
คุณสามารถค้นหาว่ากระบวนการใดกำลัง listen บนพอร์ตที่ระบุโดยใช้ PID (ในตัวอย่างของเรา PID คือ 636):
tasklist | findstr 636
ลองเชื่อมต่อกับพอร์ตนี้จากคอมพิวเตอร์ระยะไกลโดยใช้ RDP client ใดๆ พอร์ต 3340 ควรระบุเป็นหมายเลขพอร์ต RDP ระบุหลังจุดทวิภาคต่อจากที่อยู่เซิร์ฟเวอร์ RDP ตัวอย่างเช่น 10.10.1.110:3340

การเชื่อมต่อ 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 tunnel เพื่อส่งต่อพอร์ตท้องถิ่นไปยังเซิร์ฟเวอร์ระยะไกล
จัดการกฎการส่งต่อพอร์ตใน Windows
Important ตรวจสอบให้แน่ใจว่าไฟร์วอลล์ของคุณ (Microsoft Windows Defender Firewall หรือไฟร์วอลล์ภายนอกที่มักรวมอยู่ในซอฟต์แวร์ antivirus) อนุญาตการเชื่อมต่อเข้าขาไปยังพอร์ตใหม่ คุณสามารถเพิ่มกฎ allow ใหม่ให้ Windows Defender Firewall ด้วยคำสั่ง:
netsh advfirewall firewall add rule name="forwarded_RDPport_3340" protocol=TCP dir=in localip=10.1.1.110 localport=3340 action=allow
หรือใช้คอมมานด์เลต PowerShell New-NetFirewallRule:
New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP –LocalPort 3340 -Action Allow
เมื่อสร้างกฎไฟร์วอลล์เข้าขาสำหรับพอร์ต 3340 ผ่านอินเตอร์เฟซกราฟิกของ Windows Defender Firewall ไม่จำเป็นต้องเชื่อมโยงโปรแกรมใดๆ กับมัน พอร์ตนี้ถูก listen เฉพาะโดย network driver
คุณสามารถสร้างกฎการส่งต่อพอร์ต Windows ได้ไม่จำกัดจำนวน กฎ netsh interface portproxy ทั้งหมดเป็น persistent และจัดเก็บในระบบหลังจากรีสตาร์ท Windows
ยังมีกรณีที่ใน Windows Server 2012 R2 กฎการส่งต่อพอร์ตถูกรีเซ็ตหลังจากรีบูทเซิร์ฟเวอร์ ในกรณีนี้ คุณต้องตรวจสอบว่ามีการตัดการเชื่อมต่อเป็นระยะบนอินเตอร์เฟซเครือข่ายหรือไม่ และที่อยู่ IP เปลี่ยนเมื่อ OS บูท (ดีกว่าใช้ static IP แทน dynamic DHCP) เป็น workaround ฉันต้องเพิ่ม batch script ไปยัง Windows Task Scheduler พร้อมกฎ netsh interface portproxy ที่รันเมื่อเริ่มต้นระบบ
เพื่อแสดงรายการกฎการส่งต่อพอร์ต 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

Tip คุณยังสามารถแสดงรายการการตั้งค่าการส่งต่อพอร์ตใน 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

เพื่อลบกฎการส่งต่อพอร์ตเฉพาะ:
netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110
เพื่อลบกฎการแมปปิงทั้งหมดที่มีอยู่และล้างตารางกฎการส่งต่อพอร์ตให้หมด:
netsh interface portproxy reset
Important แผนภาพการส่งต่อนี้ทำงานได้เฉพาะพอร์ต TCP คุณจะไม่สามารถส่งต่อพอร์ต UDP ดרךนี้ได้ นอกจากนี้ คุณไม่สามารถใช้ loopback interface 127.0.0.1 เป็น connectaddress ได้
คุณสามารถใช้ Windows Server พร้อมบทบาท RRAS และ NAT ที่ติดตั้งแล้ว เพื่อกำหนดค่าการส่งต่อพอร์ตสำหรับการจราจร UDP คุณสามารถกำหนดค่าการส่งต่อพอร์ตระหว่างอินเตอร์เฟซเซิร์ฟเวอร์โดยใช้ graphical snap-in (rrasmgmt.msc) หรือด้วยคำสั่ง:
netsh routing ip nat add portmapping Ethernet1 udp 0.0.0.0 53 192.168.100.100 53
คุณสมบัติ portproxy อีกอย่างคือโอกาสในการทำให้ดูเหมือนว่าบริการเครือข่ายระยะไกลใดๆ กำลังทำงานในท้องถิ่น
ตัวอย่างเช่น ให้เปลี่ยนเส้นทางการเชื่อมต่อจากพอร์ตท้องถิ่น 5555 ไปยัง HTTP server ระยะไกลที่มีที่อยู่ 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 จะเปิด ดังนั้นแม้เบราว์เซอร์จะเข้าถึงคอมพิวเตอร์ท้องถิ่น มันก็จะเปิดหน้าจากเว็บเซิร์ฟเวอร์ภายนอก

กฎการส่งต่อพอร์ตยังสามารถใช้เพื่อส่งต่อพอร์ตจากที่อยู่ IP ภายนอกของ physical NIC ไปยังพอร์ตของเครื่องเสมือนที่รันบนโฮสต์เดียวกัน ใน Hyper-V คุณสามารถกำหนดค่าการส่งต่อพอร์ตบนระดับ Virtual Switch (ดูด้านล่าง)
Windows ไม่สามารถส่งต่อช่วงพอร์ต TCP ได้ หากคุณต้องการส่งต่อพอร์ตหลายพอร์ต คุณจะต้องสร้างกฎการส่งต่อ portproxy หลายกฎด้วยตนเอง วิธีที่ง่ายที่สุดคือสร้างรายการคำสั่ง netsh interface portproxy add ด้วยหมายเลขพอร์ตที่ต่างกันใน notepad แล้ววางลงใน command prompt เพื่อรัน
การส่งต่อพอร์ตใน Hyper-V Server
เมื่อใช้บทบาท Hyper-V บนคอมพิวเตอร์ของคุณ (สามารถติดตั้งได้ทั้ง Windows 10 และ Windows Server หรือเป็น Hyper-V Server ฟรี) คุณสามารถกำหนดค่ากฎ DNAT port forwarding โดยใช้ PowerShell สมมติว่าคุณต้องการเปลี่ยนเส้นทาง HTTPS traffic ทั้งหมดที่ Hyper-V host รับ ไปยังที่อยู่ IP ของเครื่องเสมือนที่รันบนโฮสต์ เพื่อทำเช่นนี้ ให้ใช้คำสั่ง Hyper-V StaticMapping
ก่อนอื่น คุณต้องสร้าง Virtual Switch พร้อม NAT:
New-VMSwitch -Name "HTTPS-NAT" -SwitchType NAT -NATSubnetAddress 192.168.100.0/24
จากนั้นคุณต้องเชื่อมต่อ VM ที่จำเป็นกับ vswitch ที่ระบุ และเปิดใช้งานกฎการแปลที่อยู่สำหรับเครื่องเสมือนทั้งหมดที่เชื่อมต่อผ่าน Hyper-V virtual switch นี้:
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 host จะถูกส่งต่อไปยังที่อยู่ IP ส่วนตัวของเครื่องเสมือน