
我想使用 OpenVPN 為兩個 VPN 建立隧道。因此,客戶端將連接到第一個 VPN 並被重新導向到第二個 VPN。 (這些都是 VPS,我沒有實體存取權限,因為稍後它會很重要。)
所以,這是圖片:
Client VPN1 VPN2
10.8.0.2[tun0]------10.8.0.1[tun0]
[1.1.1.1][eth0] 10.8.100.2[tun1]----------10.8.100.1[tun0]
45.55.45.55[eth0] 186.186.186.186[eth0]------internet
伺服器配置是一個非常標準的配置:
port 1194
auth-user-pass-verify /etc/openvpn/script/login.py via-env
username-as-common-name
script-security 3
proto udp
dev tun
duplicate-cn
sndbuf 0
rcvbuf 0
vca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0 (or 10.8.100.0 in the VPN2)
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem
客戶端配置也非常標準:
client
dev tun
auth-user-pass login.txt
proto udp
sndbuf 0
rcvbuf 0
remote 45.55.45.55 1194 (or 186.186.186.186 for VPN2)
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-128-CBC
comp-lzo
key-direction 1
verb 3
因此,為了實現 VPN 鏈接,我直接連接到 VPN1。
openvpn --config toOpenVPN1.ovpn
如果我像這樣從 VPN1 連線到 VPN2,我會被 VPN1 伺服器鎖定,因為所有流量都會重新導向到 VPN2,而 VPN1 的公用 IP 會設定為 VPN2。因此,我使用 --route-nopull 選項來拒絕來自第二個 VPN 的推送路由。
openvpn --config toOpenVPN2.ovpn --route-nopull
所以,這連接得很好。我有從 localhost 到 VPN1 的流量,我的公用 IP 是 VPN1。我還為 tunX 介面分配了 IP。但是,仍然沒有從 localhost(客戶端)到 VPN2 的流量。我必須創建路線才能使其發揮作用。這就是我失敗的地方。
由於客戶端不必關心其流量是否已重新導向到另一個位置,因此我假設客戶端(客戶端)無需進行任何設定或 iptables 規則。 VPN2 伺服器也是如此,不需要知道它是來自 VPN1 還是其他對等點。因此,我只需設定 VPN1 配置即可。
首先,我將設定iptables規則,如下。這只會讓交通通過。
iptables -A INPUT -i tun1 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o tun1 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -m multiport --dports 6880:7000 -j DROP
iptables -A FORWARD -i tun1 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -d 10.8.100.0/24 -i tun0 -o tun1 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -s 10.8.100.0/24 -d 10.8.0.0/24 -i tun1 -o tun0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
現在,我必須為一個對等點建立查看其他人的路由:
route add 0.0.0.0/0 dev tun0
route add 0.0.0.0/0 dev tun1
### route from the the first tunnel, through the client's IP
route add -net 10.8.0.0/24 gw 10.8.0.2 dev tun0
### same for the 2nd
route add -net 10.8.100.0/24 gw 10.8.100.1 dev tun1
### route all the traffic to the 2nd VPN
### end server's IP and internet's gateway
route add 186.186.186.186 gw 45.55.45.1
route add default gw 10.8.100.1 dev tun1 <<<<<<<<<<<<<<<<<< got locked out of VPN1 server
因此,要么我創建了錯誤的路由,要么 iptables 規則設定不正確,但我無法將流量從一個客戶端發送到第二個 VPN。經過多次嘗試,我總是被 VPN1 鎖定。
VPN1 的正確路由集如何?
答案1
所以,我弄清楚了。為此,必須使用自訂路由表和 iptables 規則來標記所有要轉送的套件。
例如,要轉送 TCP 上的一個端口,您可以使用以下命令:
iptables -t mangle -I PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
然後,為標記的資料包建立一個路由表/etc/iproute2/rt_tables
:比方說9999 tableToForward
。
最後,新增兩條規則以透過介面將所有標記的封包轉送到該表上tun1
:
ip route add 0.0.0.0/0 dev tun1 table tableToForward
ip rule add from all fwmark 1 table tableToForward
答案2
openvpn --config toOpenVPN2.ovpn --route-nopull
工作得很好
兩台 VPN 伺服器,其中一台再次透過 openvpn 使用上述指令連接到另一台。
網路存取有效,沒有 --route-nopull 網路存取不起作用。