--- tags: VPN --- # 頭過身就過 - 穿梭網路的各種姿勢 # 路由器開放 以內網架設主機提供服務,再於路由器設定由內網主機直接向外網用戶開放。 以外網用戶端的角度看,路由器的外網IP為代表整個內網的唯一地址,而現有的TCP/UDP架構中識別方式為IP:PORT的組合,因此只要能將外網IP:PORT對應到某個內網IP:PORT即可連線。 * 內網IP: 10.x.x.x 100.x.x.x 172.x.x.x 192.168.x.x ## NAT轉發 在路由器中針對某個PORT連線直接指定轉特定IP:PORT服務。 ## DMZ 在路由器中指定一個或一組內網IP,所有未指定的連線需求全部丟往此主機群。 # 轉發封包 在兩端的網路中各放置一台設備執行特殊的程式,該服務不處理封包內容僅再打包後透過一般路由規則送往另一端的設備。接收的設備再透過同樣的程式將封包還原後繼續傳送。這種做法就好像在兩台設備間建立一條虛擬通道,所有進入通道的內容會完好如初的從通道的另一端出來。 此類設備有人稱作旁路由,在此以跳板稱之。在此把通道進入端稱為跳板用戶端,通道的出口端稱為跳板主機端。跳板主機端必須是可由外網連入或至少可由跳板用戶端連入的,跳板用戶端則無限制。 ## VPN 虛擬區網 (EoIP) (TUN/TAP) 透過建立虛擬網卡的方式把所有資料打包到遠端再解開 概念做法: 在通道兩端建立虛擬橋接器(L2),所有流向此的封包直接打包後傳送到另一端 安全性可透過Router底層的IPSec保護,或更上層的SSL包裝 方便性可透過Nat穿透進行調整 ### 軟體解決方案 * [OpenVPN](https://openvpn.net/) * [ZeroTier](https://www.zerotier.com/) * [Tailscale](https://tailscale.com/) * [SoftEther](https://www.softether.org/) 開源的VPN軟體 ### 虛擬網卡解決方案 * [Tun2Socks](https://github.com/xjasonlyu/tun2socks) * [Leaf](https://github.com/eycorsican/leaf) ## Proxy 跳板連線 以socket轉送的方式轉發TCP或UDP封包,建立服務的時候即指定轉發的對象 網路環境須架構在跳板主機端可直連的前提 ### netcat 在跳板主機端執行下列指令以建立服務: ``` nc.traditional -l -p <SERVER_PORT> -c "nc <REMOTE_IP> <REMOTE_PORT>" ``` 在跳板用戶端執行下列指令以轉發服務: ``` nc.traditional -l -p <LOCAL_PORT> -c "nc <SERVER_IP> <SERVER_PORT>" ``` 之後在跳板用戶端的區網電腦只要連上<LOCAL_IP>:<LOCAL_PORT>即透過跳板主機端連到<REMOTE_IP>:<REMOTE_PORT> ### socat 在跳板主機端執行下列指令以建立服務: ``` socat tcp-listen:<SERVER_PORT>,reuseaddr,fork tcp:<REMOTE_IP>:<REMOTE_PORT> ``` 在跳板用戶端執行下列指令以建立服務: ``` socat tcp-listen:<LOCAL_PORT>,reuseaddr,fork tcp:<SERVER_IP>:<SERVER_PORT> ``` 之後在跳板用戶端的區網電腦只要連上<LOCAL_IP>:<LOCAL_PORT>即透過跳板主機端連到<REMOTE_IP>:<REMOTE_PORT> ### SSH 在跳板主機端啟用SSH Server,並於sshd_config中打開Port forwarding ``` AllowTcpForwarding yes ``` 在跳板用戶端執行下列指令以建立服務: ``` ssh -L <LOCAL_PORT>:<REMOTE_IP>:<REMOTE_PORT> -g -C -f -N user@<SERVER_IP> ``` 之後在跳板用戶端的區網電腦只要連上<LOCAL_IP>:<LOCAL_PORT>即透過跳板主機端連到<REMOTE_IP>:<REMOTE_PORT> ## Reverse Proxy 反向跳板 與Proxy方式相似,只是此次目的為從位於跳板主機端的設備連線到位於跳板用戶端的設備 ### SSH 在跳板主機端啟用SSH Server,並於sshd_config中打開Port forwarding ``` AllowTcpForwarding yes ``` 在跳板用戶端執行下列指令以建立服務: ``` ssh -R <LOCAL_PORT>:<REMOTE_IP>:<REMOTE_PORT> -C -f -N user@server ``` 之後在跳板主機端的區網電腦只要連上<SERVER_IP>:<LOCAL_PORT>即透過跳板用戶端連到<REMOTE_IP>:<REMOTE_PORT> ### ngrok 軟體註冊後會提供一個主機的IP/PORT,所有流量從主機轉發 * 1.x版本開源,可自建主機 * 2.x版本不開源,主機端由官方負責 ### 花生殼、nat123 * 中國版的反向跳板,做法與ngrok相似 ### frp * 開源且仍活躍的軟體 [github](https://github.com/fatedier/frp) * 支援不同協議的包裝,靈活度較高 ## Tunnel 穿梭通道 以http或socks5代理的方式轉發,此服務可連往不特定的對象 ### Squid Proxy * 偏向多人環境使用的代理方法,搭配iptables轉發可以達到透明代理的目的 ### SSH 在跳板主機端啟用SSH Server,並於sshd_config中打開Port forwarding ``` AllowTcpForwarding yes ``` 在跳板用戶端執行下列指令以建立服務: ``` ssh -D <LOCAL_PORT> -g -C -f -N user@server ``` 之後在跳板用戶端的區網電腦只要透過socks5://<LOCAL_IP>:<2LOCAL_PORT>即可經由跳板主機端連到其他地方。 ### ShadowSocks ShadowSocksR * https://github.com/shadowsocksr-rm/shadowsocksr-libev ### V2Ray * https://github.com/v2fly/v2ray-core ### Trojan-go * https://github.com/p4gefau1t/trojan-go