2つのOpenVPNサーバーをチェーンする方法は?


3

OpenVPNを使用して2つのVPNをトンネリングしたいです。したがって、クライアントは最初のVPNに接続し、2番目の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に接続すると、すべてのトラフィックがVPN2にリダイレクトされ、VPN1のパブリックIPがVPN2に設定されるため、VPN1サーバーからロックアウトされます。そのため、-route-nopullオプションを使用して、2番目の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ルールが正しく設定されていませんが、1つのクライアントから2番目のVPNにトラフィックを送信できません。そして、何度も試行した後、私は常にVPN1からロックアウトされ続けます。

VPN1の正しいルートセットはどのようになりますか?

回答:


1

だから、私はそれを理解します。そのためには、カスタムルーティングテーブルとiptablesルールを使用して、転送するすべてのパッケージをマークする必要があります。

たとえば、TCPの1つのポートを転送するには、次のようなものを使用できます。

iptables -t mangle -I PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999

次に、/etc/iproute2/rt_tablesマークされたパケットのルーティングテーブルを作成します9999 tableToForward

最後に、2つのルールを追加して、マークされたすべてのパケットをtun1インターフェイス経由でそのテーブルに転送します。

ip route add 0.0.0.0/0 dev tun1 table tableToForward
ip rule add from all fwmark 1 table tableToForward

0

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

うまくいきました

2つのVpnサーバー。1つは上記のコマンドで再びopenvpnを介して他のサーバーに接続します。

インターネットアクセスは機能しましたが、ルートノープルインターネットアクセスは機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.