NAT 技術
IP 轉換過程
- 10.0.0.10 要發送數據時,NAT 路由器將源地址從 10.0.0.10 替換成全局的 IP 202.244.174.37
- NAT 路由器收到外部的數據時, 又會把目標 IP 從 202.244.174.37 替換回10.0.0.10
- NAT 路由器內部有一張自動生成的用于地址轉換的表,當 10.0.0.10 第一次向 163.221.120.9發送數據時就會生成表中的映射關系
NAPT

代理服務器
代理服務(Proxy)是一種中間服務器,它充當中間人,轉發客戶端和目標服務器之間的請求和響應。代理服務器可以提供多種功能,如緩存、匿名訪問、訪問控制等。
客戶端將請求發送到代理服務器,代理服務器再將請求轉發到目標服務器。目標服務器的響應會通過代理服務器返回給客戶端。代理方式可以分為:
正向代理

工作原理
- 客戶端將請求發送給正向代理服務器。
- 正向代理服務器接收請求,并根據配置進行處理,如緩存查找、內容過濾等。
- 正向代理服務器將處理后的請求轉發給目標服務器。
- 目標服務器處理請求,并將響應返回給正向代理服務器。
- 正向代理服務器將響應返回給客戶端。
功能特點
- 緩存功能:正向代理服務器可以緩存經常訪問的資源,當客戶端再次請求這些資源時,可以直接從緩存中獲取,提高訪問速度。
- 內容過濾:正向代理可以根據預設的規則對請求或響應進行過濾,如屏蔽廣告、阻止惡意網站等。
- 訪問控制:通過正向代理,可以實現對特定網站的訪問控制,如限制員工在工作時間訪問娛樂網站。
- 隱藏客戶端身份:正向代理可以隱藏客戶端的真實 IP 地址,保護客戶端的隱私。
- 負載均衡:在多個目標服務器之間分配客戶端請求,提高系統的可擴展性和可靠性。
應用場景
- 企業網絡管理:企業可以通過正向代理實現對員工網絡訪問的管理和控制,確保員工在工作時間內專注于工作,避免訪問不良網站或泄露公司機密。
- 公共網絡環境:在公共場所如圖書館、學校等提供的網絡環境中,通過正向代理可以實現對網絡資源的合理分配和管理,確保網絡使用的公平性和安全性。
- 內容過濾與保護:家長可以通過設置正向代理來過濾不良內容,保護孩子免受網絡上的不良信息影響。
- 提高訪問速度:對于經常訪問的網站或資源,正向代理可以通過緩存機制提高訪問速度,減少網絡延遲。
- 跨境電商與海外訪問:對于跨境電商或需要訪問海外資源的企業和個人,正向代理可以幫助他們突破網絡限制,順暢地訪問海外網站和資源。
反向代理

基本原理
應用場景
- 負載均衡:反向代理服務器可以根據配置的負載均衡策略,將客戶端的請求分發到多個后端服務器上,以實現負載均衡。這有助于提升網站的整體性能和響應速度,特別是在高并發場景下。
- 安全保護:反向代理服務器可以隱藏后端 Web 服務器的真實 IP 地址,降低其被直接攻擊的風險。同時,它還可以配置防火墻、訪問控制列表(ACL)等安全策略,對客戶端的請求進行過濾和限制,以保護后端服務器的安全。
- 緩存加速:反向代理服務器可以緩存后端 Web 服務器的響應內容,對于重復的請求,它可以直接從緩存中返回響應,而無需再次向后端服務器發起請求。這可以大大減少后端服務器的負載,提升網站的響應速度。
- 內容過濾和重寫:反向代理服務器可以根據配置的規則對客戶端的請求進行過濾和重寫,例如添加或刪除請求頭、修改請求路徑等。這有助于實現一些特定的業務需求,如 URL 重寫、用戶認證等。
- 動靜分離:在大型網站中,通常需要將靜態資源和動態資源分開處理。通過將靜態資源部署在反向代理服務器上,可以直接從反向代理服務器返回靜態資源的響應,而無需再次向后端服務器發起請求。這可以大大提升靜態資源的訪問速度。
NAT 和代理服務器
- 從應用上講, NAT 設備是網絡基礎設備之一, 解決的是 IP 不足的問題. 代理服務器則是更貼近具體應用, 比如通過代理服務器進行翻墻, 另外像迅游這樣的加速器, 也是使用代理服務器.
- 從底層實現上講, NAT 是工作在網絡層, 直接對 IP 地址進行替換. 代理服務器往往工作在應用層.
- 從使用范圍上講, NAT 一般在局域網的出口部署, 代理服務器可以在局域網做, 也可以在廣域網做, 也可以跨網.
- 從部署位置上看, NAT 一般集成在防火墻, 路由器等硬件設備上, 代理服務器則是一個軟件程序, 需要部署在服務器上.
內網穿透
內網穿透是一種技術,用于在不直接暴露內網設備的情況下,允許外部設備訪問內網資源。它通常通過隧道(Tunnel)技術實現,將內網設備的流量轉發到公網服務器,再由公網服務器轉發到目標設備。
內網穿透通常涉及以下組件:
-
內網客戶端:需要被訪問的內網設備。
-
公網服務器:中轉服務器,用于轉發流量。
-
外部客戶端:訪問內網資源的設備。
常見的內網穿透工具包括:
-
frp:國內開源工具,支持多種協議,適合內網穿透。
-
ngrok:開源工具,支持HTTP/HTTPS和TCP隧道。
-
ZeroTier:基于虛擬網絡的內網穿透工具,支持多設備組網。
手動部署并測試內網穿透
我們使用 frp 內網穿透工具進行部署,首先在以下網址進行下載:https://github.com/fatedier/frp/releases/tag/v0.58.1
下載以下版本
下載好后我們可以將該壓縮文件拷貝到 Windows 桌面上
在云服務器(公網)上部署frp
首先我們打開云服務器,并進入到家目錄,創建 frp 文件夾,之后再該路徑下進行測試
cd ~
mkdir frp
cd frp

tar xzf frp_0.58.1_linux_amd64.tar.gz
進入到解壓文件后就可以看到已經編譯好的客戶端和服務器可執行程序
- frpc:客戶端程序,frpc.toml 為對應的配置文件
- frps:服務器程序,frps.toml 為對應的配置文件
- LICENSE:授權許可
由于我們需要云服務器作為內網穿透的服務器,所以配置 frps.toml
bindPort = 7000
在虛擬機(內網)上部署frp
推薦在虛擬機上設置網絡適配器模式為 NAT 模式,該模式下相當于在 Windows 中建立了一個子網,Windows 主機充當路由器,虛擬機就位于該子網中,這樣 Windows 和虛擬機就可以正常進行網絡通信。
首先我們打開虛擬機后,按下 Ctrl + Alt + T 打開終端,并進入到家目錄,創建 frp 文件夾,之后再該路徑下進行測試。
cd ~
mkdir frp
cd frp
查看虛擬機上的 ip 地址,先安裝 net-tools 包,而后使用 ifconig
sudo apt update
sudo apt install net-tools
ifconfig
lbk@lbk-virtual-machine:~/frp$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.22.128 netmask 255.255.255.0 broadcast 192.168.22.255inet6 fe80::d02a:4e7a:58be:12bb prefixlen 64 scopeid 0x20<link>ether 00:0c:29:3c:3a:32 txqueuelen 1000 (以太網)RX packets 49752 bytes 71176201 (71.1 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 5643 bytes 457889 (457.8 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在輸出中,inet
后面的地址就是 IPv4 地址,即 192.168.22.128。
而后打開 Windows 下終端,使用 scp 命令傳輸 frp 壓縮文件到虛擬機上
scp /path/to/local/file username@remote_host:/path/to/remote/directory
#/path/to/local/file:本地文件的路徑。
#username:遠程服務器的用戶名。
#remote_host:遠程服務器的地址(IP 或域名)。
#/path/to/remote/directory:遠程服務器上的目標目錄。
scp D:\桌面\frp_0.58.1_linux_amd64.tar.gz lbk@192.168.22.128:/home/lbk/frp
之后在虛擬機中就存在 frp 壓縮文件,并解壓
tar xzf frp_0.58.1_linux_amd64.tar.gz
由于我們需要遠程連接虛擬機,所以配置 frpc.toml
#配置公網服務器上 frp 服務的 IP 與端口
serverAddr = "110.41.138.70"
serverPort = 7000[[proxies]]
name = "ssh-serivce" #名稱
type = "tcp" #代理類型
localIP = "127.0.0.1" #本地 IP
localPort = 22 #內網服務監聽的端口
remotePort = 7080 #需要在公網服務器上監聽的端口,
#其他人未來可以通過這個端口訪問我們的本地的 22 號服務
#也就是說 7080 端口會映射到 22 號端口
啟動連接
nohup ./frpc -c ./frpc.toml &> /dev/null &
nohup ./frps -c ./frps.toml &> /dev/null &