如何链接两个 OpenVPN 服务器?

如何链接两个 OpenVPN 服务器?

我想使用 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 的 IP。因此,我使用 --route-nopull 选项拒绝来自第二个 VPN 的推送路由。

openvpn --config toOpenVPN2.ovpn --route-nopull

所以,连接正常。我有从 localhost 到 VPN1 的流量,我的公共 IP 是 VPN1s。我还为 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 互联网访问不工作。

相关内容