
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
これで、接続は成功しました。ローカルホストから VPN1 へのトラフィックがあり、パブリック IP は VPN1s です。また、tunX インターフェイスに IP を割り当てました。ただし、ローカルホスト (クライアント) から 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
ここで、1 つのピアが他のピアを参照するためのルートを作成する必要があります。
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
。
最後に、そのテーブル上のマークされたすべてのパケットをtun1
インターフェース経由で転送するための 2 つのルールを追加します。
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
うまくいきました
2 つの VPN サーバー。1 つは上記のコマンドを使用して openvpn 経由でもう 1 つに接続されます。
インターネット アクセスは機能しましたが、--route-nopull がないとインターネット アクセスは機能しません。