3、使用Windows命令來實現埠轉發

FLy_鵬程萬里發表於2018-06-10

0x00 前言
在Windows系統中,從XP開始就內嵌了一個設定網路埠轉發的功能。依靠這個功能,任何到本地埠的TCP連線(ipv4或者ipv6)都能夠被轉發到任意一個本地埠,甚至是遠端主機的某個埠。並且,Windows系統並不需要去開啟監聽這個轉發埠的服務。

在Linux中,配置埠轉發十分容易,使用iptables配置規則即可。但是在Windows伺服器中,遠端訪問控制協議(RRAS)通常被用作埠轉發,但是有一種更簡單的配置方法,並且這種配置方法適用於windows的任意版本。

0x01 基礎命令
使用Portproxy模式下的Netsh命令即能實現Windows系統中的埠轉發,轉發命令如下

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

解釋一下這其中的引數意義
1.listenaddress -- 等待連線的本地ip地址
2.listenport -- 本地監聽的TCP埠(待轉發)
3.connectaddress -- 被轉發埠的本地或者遠端主機的ip地址
4.connectport -- 被轉發的埠

這裡舉個例子,我們的任務是將一個RDP服務(遠端桌面協議)轉發到任意埠,比如說3340(埠其實可以在服務設定中進行更改,但是這裡我們使用RDP協議來實現一個簡單點的埠轉發例子)。那麼好,我們需要將進來的流量轉發到3340埠(標準埠是3389)
以管理員身份輸入下面的命令列:

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命令來驗證3340埠是否正在監聽中

netstat -ano | findstr :3340

注意:
如果這條命令沒有返回任何資訊,或者說通過netsh介面並沒有實現埠轉發的功能,那麼需要檢視下系統是否開啟了iphlpsvc(ip Helper)服務。


並且需要在網路配置中檢視埠轉發規則是否被建立、IPv6的支援是否開啟。

這些都是實現埠轉發的必備因素,沒有了IP Helper服務,沒有了IPv6的支撐,埠重定向就沒辦法得到實現。

這裡可以輸入命令來檢視哪項程式正在通過PID號來監聽這個埠(在本例中,涉及的PID號為636)
tasklist | findstr 636
那麼下面我們從遠端主機來嘗試連線這個新轉發的埠3340,這裡3340埠就等同於原來的3389埠,這裡連線的地址為10.10.1.110:3340


連線應該就可以建立成功。

注意:連線時請確保防火牆(Windows防火牆或者其他的第三方防護軟體)允許外部連線到一個全新的埠,如果不允許,那麼只能自行新增一個新的Windows防火牆規則,命令如下:

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

當通過Windows防火牆介面為3340埠建立一個新的規則時,這個埠需要保證沒有被任何程式佔用,也就是說此埠僅供網路驅動使用。
你可以創立任意的Windows埠轉發規則,所有的netsh介面下的埠代理規則都是永久的,並且儲存在系統中(不受開機重啟的影響)
下面的命令是用來展示系統中的所有轉發規則:
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`


注意:
埠轉發的設定也可以通過命令列來進行檢視
netsh interface portproxy dump

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


如果想要刪掉一個特定的埠轉發規則,使用如下的命令:

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

如果想要清空當前所有的配置規則,命令如下:
netsh interface portproxy reset

注意:這些轉發規則僅僅適用於TCP埠,對於UDP的埠轉發,使用上面的方法是無效的。還有在配置規則時,不能將127.0.0.1作為連線地址。

0x02 進階命令
如果你想要轉發TCP連線到一臺遠端主機,使用下面的命令即可:

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

這條規則將會轉發RDP請求(也就是3389埠)到一臺ip地址為192.168.1.101的遠端主機上。

另一條埠轉發的好處就是,這看上去在本地,我們就以使用任意一個遠端主機的服務。
這裡舉個例子,我們想要轉發本地的5555埠到遠端主機157.166.226.25(CNN的官網地址)

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

輸入完命令後,現在我們在本地瀏覽器訪問http://localhost:5555/

那麼我們就可以發現訪問的其實是CNN的預設主頁。所以儘管我們訪問的是本地埠,實際上這裡訪問的是一個遠端頁面。

埠轉發同時可以用來將一個外部地址的某個埠轉發到同機上的虛擬機器裡。

0x03 後記
同時有這樣一種特例,那就是在Windows Server 2012 R2中,埠轉發規則有可能會在系統重啟後被重置,在這種情況下,你需要在網路協議中檢查是否存在配置不當,導致網路的間斷性斷開,或者當系統重啟時是否出現了ip地址的變換(推薦使用靜態ip)。在一個工作組裡,我通常是在windows任務計劃程式裡新增了一個實現埠轉發的指令碼。

在Windows 2003/XP中,你必須在登錄檔(HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters)中找到並設定IPEnableRouter引數為1才能實現埠轉發。

外文原文連結:http://woshub.com/port-forwarding-in-windows/

相關文章