VPN翻牆與P2P下載

#假裝懂技術
#GFW促進學習

在路由器上部署了VPN Client和chnroutes後,連接到國外VPS的VPN Server後,整個區域網內所有設備能夠透明翻牆,但是一些P2P軟體會遇到問題。

P2P軟體需要監聽固定埠,並且需要外網的機器能夠主動連接到運行P2P軟體內網機器。方法是用路由器的「埠映射」功能,將公網IP的某些埠映射到內網某個機器上。這是通過iptables的DNAT實現的:

假設在路由器管理界面中將10400-10499埠映射到192.168.0.4,路由器會添加下面的iptables規則(由於WAN IP通常不是固定的,路由器會在ppp撥號或DHCP獲得公網IP後動態添加這些規則):

iptables -t NAT -A PREROUTING -d <WAN_IP> -p tcp --dport 10400:10499 -j DNAT --to 192.168.0.4
iptables -t NAT -A PREROUTING -d <WAN_IP> -p udp --dport 10400:10499 -j DNAT --to 192.168.0.4

但是部署OpenVPN和chnroutes後,國外的IP就不能主動和內網機器建立連接了(即使已經按照上面方法在路由器上開啟了埠映射),因為這時國外IP看到的是VPS的IP,不是路由器的公網IP。

要使路由器部署VPN時仍然支持內網P2P下載和其它需要外網埠的應用,需要在VPS和路由器上同時增加新的iptables DNAT規則。

首先,需要知道路由器所使用的OpenVPN客戶端證書的(X509) common name,這個common name是在生成證書時指定的,OpenVPN easy-rsa創建證書時默認使用文件名作為common name。可以在證書crt文件中查看其common name

[email protected]:/etc/openvpn/easy-rsa/keys# cat client-common.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 10 (0xa)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, ST=CA, L=SanFrancisco, O=SAGAN, OU=SAGAN, CN=SAGAN/name=SAGAN/[email protected]
        Validity
            Not Before: Jan 11 02:36:33 2013 GMT
            Not After : Jan  9 02:36:33 2023 GMT
        Subject: C=US, ST=CA, L=SanFrancisco, O=SAGAN, OU=SAGAN, CN=client-common/name=SAGAN/[email protected]
.....

證書的Subject行里的CN欄位就是common name,如上面例子證書的common name就是”client-common”

路由器的VPN Client必須具有固定IP(不能是Server通過DHCP分配的動態IP)。OpenVPN伺服器可以通過下面方式實現給某個客戶端分配固定IP

假設VPS的openvpn伺服器端配置文件位於/etc/openvpn,在這個目錄下創建一個”clients”目錄.

編輯OpenVPN伺服器端配置文件server.conf,加入下面內容

client-config-dir clients

在剛剛創建的/etc/openvpn/clients目錄下新建一個”client-common”文件(無擴展名),文件名就是路由器使用的證書的common name。這個文件用於給路由器的VPN Client分配固定IP,內容只有一行:

#假設你的OpenVPN虛擬網段是192.168.200.0/24
ifconfig-push 192.168.200.2 255.255.255.0

這樣做以後,路由器的OpenVPN Client連接後會自動獲取到192.168.200.2這個固定IP。

PS. 另一種讓路由器的OpenVPN客戶端獲取固定IP的方法是OpenVPN的static key模式。

配置好OpenVPN後只需要在VPS和路由器上分別添加iptables DNAT規則即可。規則如下。

# 下面代碼中
# A.B.C.D是VPS的公網IP
# 192.168.200.0/24是OpenVPN的網段
# 192.168.200.2是路由器OpenVPN Client獲得的IP
# 192.168.0.0/24是路由器所在的本地內網網段
# 192.168.0.1是路由器內網IP

# VPS上的iptables規則
iptables -t nat -A PREROUTING -p tcp -d A.B.C.D --dport 10000:20000 -j DNAT --to 192.168.200.2
iptables -t nat -A PREROUTING -p udp -d A.B.C.D --dport 10000:20000 -j DNAT --to 192.168.200.2

# 路由器上的iptables規則
iptables -t nat -A PREROUTING -p tcp -d 192.168.200.2 --dport 10400:10499 -j DNAT --to 192.168.0.4
iptables -t nat -A PREROUTING -p udp -d 192.168.200.2 --dport 10400:10499 -j DNAT --to 192.168.0.4

上面的iptables規則把VPS的10000-20000埠全部轉發給路由器,然後路由器再做一次DNAT,把這些埠任意分配給內網機器。如上面的示例把10400-10499映射到192.168.0.4,可以再把10500-10599映射給192.168.0.5,依此類推。

數據流向: 192.168.0.4:10401與某個Internet IP W.X.Y.Z:abc通信:

W.X.Y.Z:abc 向 A.B.C.D:10401發起連接 ->
  src W.X.Y.Z:abc dst A.B.C.D:10401

VPS DNAT ->
  src W.X.Y.Z:abc dst 192.168.200.2:10401

Router DNAT ->
  src W.X.Y.Z:abc dst 192.168.0.4:14001

192.168.0.4:10401 received


反方向:


192.168.0.4:10401 回應 W.X.Y.Z:abc
  src 192.168.0.4:10401 dst W.X.Y.Z;abc

Router Un DNAT
  src 192.168.200.2:10401 dst W.X.Y.Z:abc

VPS Un DNAT
  src A.B.C.D:10401 dst W.X.Y.Z:abc

W.X.Y.Z:abc reveived

Un DNAT(DNAT的Reverse)是自動的

注意,使用這種方法下載國外的P2P資源(如share)有版權風險,可能導致VPS被封 = =

PS. 還有一種路由器部署VPN時內網機器下載國外P2P資源的方法,就是在路由器上做策略路由(policy routing),用iptables給P2P數據包打標記(MARK),然後ip rule創建規則對這些數據包走默認網關。但是因為GFW現在連P2P連接也會reset(比如用emule搜索某個敏感關鍵字文件時),不推薦此方法。

0 Responses to “VPN翻牆與P2P下載”


Comments are currently closed.