最近用過的幾種內網穿透手段:N2N、v2ray

我本來就有準備一台VPN主機,外出或是可以提供親友翻GFW使用,不過最近遇到非常嚴格網路(發音為防君子不防小人)環境,索性研究了一下幾種比較低調的內網穿透(發音為你只好把自己當小人),在此留個紀錄備忘

所謂的內網穿透基本上就是把防火牆內的機器直接和防火牆外的機器連接起來,再次強調一下,內網穿透是合法手段,不是內網滲透,內網穿透只是在內網的電腦透過漏洞植入一隻程式(不對這是內網滲透)合法的擺一隻程式,連到外網,然後開始叫內網的機器挖礦,並且讓殭屍們組網互傳(不對這還是內網滲透),透過那隻程式代理操作內網,突破網管對網路的封鎖,而且因為是內網外聯的流量,網管根本檔不住,如同實體世界中持槍衛兵也不可能擋住內鬼一樣(糟糕好像一直繞不開內網滲透),實現自己手上所有機器都是連在一起的,不論待在哪一個網路環境都可以使用其他網路環境的資源,例如某T大新買的資料庫,校內網才能用,一穿透,一用一大把

權衡效能和安全性(這裡指的安全性個人資料安全以及封包特徵可能會被深度封包檢測後被網管發現,所以ngrok、teamviewer這種封包最後去哪的一律不考慮)之後,以下分享最近玩了兩套開源工具

  1. N2N
  2. V2ray

N2N

Github網址: https://github.com/ntop/n2n

N2N是一套非常妙的VPN,他把自己歸類在P2P VPN,主要的概念就是可以把許多待在內網內的機器串聯成一個大的區域網路,而且這些機器彼此傳輸資料基本不通過中央伺服器,在大量傳檔案的時候非常好用(對比我最早用的是把所有人都用openvpn連到中央伺服器的狀況)

N2N的基本架構是要先弄一台supernode(中央伺服器)當作位置紀錄簿,其餘的客戶端都是用edge,大部分光纖上網或家用IP分享器都走錐形NAT,在這個情況下,edge會先在內網做UDP打洞,然後連上supernode,下載同網路內其他edge的IP清單,這樣就能和其他edge直接P2P通訊,不過在大部分的公用網路(有時手機上網也算)中,NAT類型是對稱型,無法打洞,流量就會經過supernode,因此如果要玩N2N,最好的狀況就是supernode自己架,以免封包外流(關於對稱型NAT和錐形NAT與UDP打洞的關係,簡單的可以看這篇文章

N2N最大的優勢也就是他不是做端口映射,並且會建立一張網卡,這樣在OSI模型中大約在第2層(他真的是VPN),因此如果像是Windows UWP這種不吃proxy設定的程式也可以正常使用N2N

在編譯好N2N(其實也有編譯好的版本,但也可以硬核一下)之後,server端把supernode叫起來,client端一行指令搞定

Windows上的Powershell(會寫成這樣是因為我會寫一個script定期ping區網內的其他機器,所以得先把n2n連線指令送進背景,不然其實參考Linux上的寫法就好了):

Start-Job { 
	param($網卡名稱,$連上之後的虛擬IP位置)
	edge所在位置\edge.exe -d $網卡名稱 -r -c N2N群組,同群組的彼此可以互通 -k 密碼 -a $連上後的虛擬IP位置 -l supernode網址:port
} -Args $網卡名稱, $連上後的虛擬IP位置 -Name '隨便取個名字給背景任務用'

Linux上的shell script:

edge -d 網卡名稱 -c N2N的連線群組 -a 連上後的虛擬IP位置 -k 密碼 -l supernode位置:porrt -r &

手機端的邏輯類似,Android(不支援iOS)就裝個hiN2N的apk搞定(Github

最後是在Linux上,網卡名稱隨便打,在連線上的時候就會自己新增,Windows上得自己新增一個tap device,這也很簡單,隨便裝個openvpn就會自帶tap-windows,甚至你只要裝好openvpn但不用,那張openvpn網卡就可以拿來給n2n用了(如果太閒的話也是可以編譯一下tap windows啦…)

N2N的網路傳輸速度基本上和你所在地的網路穩定度關聯性比較大,寒假時我每天半夜讓帶出門的surface和台北家中的主機傳raw檔,民宿的公用網路大概5GB的raw檔走windows遠端桌面要傳個2小時吧XD

v2ray

這裡只需要v2ray-core: https://github.com/v2ray/v2ray-core

眾所皆知v2ray並不是主要拿來做內網穿透的,但v2ray有這個能力,而且v2ray的封包既然可以閃過GFW,普通機房邏輯上應該沒有問題才對,畢竟這次要做內網穿透最大的原因是某單位居然搞到一連上跳板機之後,整台電腦連google都上不了,第一次連線我連github金鑰都搞到從另外一台電腦找到之後,用手抄下來,再輸入進開發機,既然對方不講武德那也就少廢話,畢竟邏輯上某單位不可能全部買具有深度封包探測的防火牆,天天比照兩會期間的北京在拆封包組封包XD

既然有n2n,為何還需要v2ray?主要是某單位的環境嚴苛,居然有個令我百思不得其解的政策是主機裝好之後要交出root帳號密碼(更令我百思不得其解的是為什麼要開啟root遠端登入,這是哪來的ISO規定嗎…),對方網管心情好可能就會上去看一看,加上對方又開啟了我主機上的snmp(雖然看起來沒有掃硬體變更,但是這種事難說),如果走n2n,就得設定好防火牆規則(畢竟n2n是真的VPN),萬一被查到也不好,直接走反向代理,等於可以偽裝成其中一台主機,設定少很多。

v2ray的反向代理設定可以直接看官網文件,設定抄一下就搞定了,內網端的v2ray設定我只做了兩處修改,主要是內網端純粹拿來做ssh,避免轉發其他封包引來流量異常,兩處如下:

outbounds區塊加入黑洞,不要的流量全部丟進去

{
   "protocol": "blackhole",
   "tag": "blackout",
   "settings": {
	  "response": {
		  "type": "none"
	  }
   }
 }

routing區塊設定好誰該進黑洞,其實就是利用v2ray的白名單功能

  {
	 "type": "field",
	 "inboundTag": ["bridge"],
	 "ip": [
	   "內網的IP"
	 ],
	 "outboundTag": "out"
   },
   {
	  "type": "field",
	  "outboundTag": "blackout",
	  "network": "udp,tcp",
	  "inboundTag": ["bridge"]
   }

外網server端也是按照官方文件弄就好了,比較有趣的是client端設定,基本上不需要裝什麼其他的app,一樣都用v2ray-core,連上外網server端,唯一要注意的是inbound的port,網路上有些文件說得是1080(SOCKS port),其實沒啥必要,而且還會跟hyper-v保留port區段發生衝突,如果你的內網穿透不是只為了ssh,而是想直接打穿校園網,那就隨便指定一個port,Windows到傳統控制台的網際網路選項裡去改proxy位置即可

螢幕擷取畫面 2021-04-17 035304

(經過這一次之後我大概理解v2ray client app的功能其實就是自動幫你把這幾個地方設定好而已)

但既然我只是要連ssh,那連改變系統的網際網路設定都不用,畢竟我已經設定好,內網主機也不會代轉非內網網段的流量,那就只要一個指令(首先你得先把v2ray連上,不論是client端,內網主機,都得連上)

ssh -o ProxyCommand='connect的位置\connect.exe –S 127.0.0.1:v2ray的port位置 %h %p' 帳號@你要去的內網主機位置

這樣你就會看到v2ray那邊收到ssh來的請求,唯一要注意的是由於這是proxy代轉,每次連接都可能會發生ssh金鑰不符,解決方法就是到.ssh/known_hosts裡去刪除這台主機的金鑰,每次都重拿一份新的就搞定了

最後可以補充一下是網路上很多教學都說ProxyCommand要搭配netcat,但截至目前為止netcat windows版搭配proxy參數有bug,根本無法使用,直接用git官方帶的connect.exe(也可以在msys2中取得),最後是要注意ProxyCommand的windows版本必須給完整的程式路徑,否則會報錯(所以最多的坑居然是在client端?XD)

喔對,之前在考慮v2ray反向代理時,曾經考慮過ssh tunnel的作法,但基於之前和翻GFW的經驗,ssh tunnel第一是比較慢,第二是如果防火牆本身就不准外網使用ssh連到內網,那反過來的封包很有可能會被drop掉,既然如此,v2ray等翻牆小能手應該才是首選。

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料