
以下のような状況です: 1- OpenVPN サーバーが 2 台あります (サーバー A とサーバー B)。
2- クライアントは直接 LAN ではなく、VPN 経由で各サーバーに接続します。
3- サーバー B が VPN クライアントとしてサーバー A に接続されます。
4- サーバーBは2つのOpenVPNインスタンスを実行します
5- Asuume ラップトップ B は VPN 経由でサーバー B に接続されており、少なくともサーバー A に到達する必要があります。
6- サーバーAのVPN DHCPは10.8.0.0/24です
7- サーバーBのVPN DHCPは172.30.0.0/16です
8- サーバー B には静的 IP 10.8.0.101 があります (VPN クライアント)
- 問題は、ラップトップ B からサーバー A にアクセスできないことです。また、サーバー A はクライアント IP ではなく、VPN サーバー IP でサーバー B にアクセスできません。
ネットワーク構成は次のとおりです。
サーバーAの構成
[root@localhost ~]# ifconfig
eth0 inet addr:X.X.X.X Bcast:X.X.X.255 Mask:255.255.255.0
eth0:0 inet addr:X.X.X.X Bcast:X.X.255.255 Mask:255.255.0.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:629066 errors:0 dropped:0 overruns:0 frame:0
TX packets:416252 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:136006302 (129.7 MiB) TX bytes:114377768 (109.0 MiB)
サーバーB
[root@vps8887 ~]# ifconfig
eth0 inet addr:X.X.X.X Bcast:X.X.X.255 Mask:255.255.255.0
eth0:0 inet addr:X.X.X.X Bcast:X.X.X.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:172.30.0.1 P-t-P:172.30.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:69 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:4140 (4.0 KiB) TX bytes:240 (240.0 b)
tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.101 P-t-P:10.8.0.102 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:34 errors:0 dropped:0 overruns:0 frame:0
TX packets:105 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:2856 (2.7 KiB) TX bytes:8820 (8.6 KiB)
サーバーAのルーティング:
[root@localhost ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.8.0.2 * 255.255.255.255 UH 0 0 0 tun0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
サーバー B のルーティング:
[root@vps8887 ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.8.0.102 * 255.255.255.255 UH 0 0 0 tun1
172.30.0.2 * 255.255.255.255 UH 0 0 0 tun0
X.X.X.0 * 255.255.255.0 U 0 0 0 eth0
10.8.0.0 10.8.0.101 255.255.255.0 UG 0 0 0 tun1
X.X.X.0 * 255.255.255.0 U 0 0 0 eth0
172.30.0.0 172.30.0.2 255.255.0.0 UG 0 0 0 tun0
link-local * 255.255.0.0 U 0 0 0 eth0
default X.X.X.1 0.0.0.0 UG 0 0 0 eth0
default X.X.X.1 0.0.0.0 UG 0 0 0 eth0
次のコマンドを追加して、サーバー A にルーティングを追加しようとすると、問題が発生します。
route add -net 172.30.0.0/16 gw 10.8.0.101
次のエラーが表示されます:
「SIOCADDRT: ネットワークに到達できません」
サーバーAのポート1194のOpenVPN構成
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
client-to-client
duplicate-cn
server 10.8.0.0 255.255.255.0
client-config-dir ccd
push "dhcp-option DNS 10.8.0.1"
status openvpn-status.log
keepalive 10 120
comp-lzo
persist-key
persist-tun
crl-verify /etc/openvpn/crl.pem
verb 3
================ Server B Client ccd ================
push "dhcp-option DNS 8.8.8.8"
ifconfig-push 10.8.0.101 10.8.0.102
=====================================================
サーバー B の OpenVPN 構成
======================= Server B ( Server Config )========================
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
client-to-client
duplicate-cn
server 172.30.0.0 255.255.0.0
push " route 10.8.0.0 255.255.255.0 "
status openvpn-status.log
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3
==============================================================================
================= Server B ( Client Config )==============================
client
dev tun
proto udp
remote serverA 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
route-nopull
route 10.8.0.0 255.255.255.0 10.8.0.101
comp-lzo
verb 5
===============================================================================
最後に:これらのサイトが相互に通信する必要があります。
答え1
OpenVPNルーティングコマンド全般
ルート
このroute
コマンドはサーバー設定に含まれ、サーバーに独自のカーネル ルーティング テーブルにルートを追加するように指示します。route
ディレクティブにサブネットのコマンドを追加する必要はありませserver
んが、サーバーが処理する他のすべてのサブネットのコマンドを追加する必要がありますroute
。基本的に、これはカーネルにこれらのサブネットを openvpn サーバーに送信するように指示します。例:
# serverA.conf (just a fragment)
server 10.8.0.0 255.255.255.0
...
route 172.30.0.0 255.255.255.0 # Add a route to the kernel routing table
イルート
このiroute
コマンドは、OpenVPNの「内部」ルートを作成し、OpenVPNサーバーがどのクライアントがサブネットを担当しているかを認識できるようにします。ここそしてここパケットがカーネル ルーティング テーブルに到達する前に、openvpn は tun/tap デバイスから入ってくるパケットを復号化し、パケットを検査してどう処理するかを判断します。iroute コマンドがないと、サーバーはパケットを認識しません。
# ccd/ServerB.conf
iroute 172.30.0.0
「ルート...」をプッシュします
このpush
コマンドは他の用途にも使用されますが、ルーティングにpush
はサブネットからクライアントへのルートが必要です。これにより、クライアントはカーネル ルーティング テーブルを変更してトラフィックを VPN サーバーに送信するように指示されます。これがないと、クライアントはプライベート サブネット 10.8.0.0 から 172.30.0.0 へのパケットを取得する方法がわかりません。これらは、ccd/client に配置するか、すべてのクライアントに共通である場合はサーバー構成に配置する必要があります。
# ServerA.conf (more of the fragment)
server 10.8.0.0 255.255255.0
...
route 172.30.0.0 255.255.255.0 # add the route to the server's kernel
push "route 172.30.0.0 255.255.255.0" # add the route to the clients
クライアント対クライアント
このclient-to-client
コマンドは、クライアントが相互に通信できることをサーバーに伝えます。これはデフォルトでコメント化されており、必要になると思います。
カーネル IP 転送
これはOpenVPNの設定ではなく、Linuxに特有のものです。ただし、これはOpenVPNサーバーを運用する人にとっては重要です。各サーバーはカーネル内でIP転送を有効にする必要があります。これまた、ファイアウォール ルールによって転送が妨げられていないことを確認してください。
設定に関して
ディレクティブが不足しているようですiroute
。サーバー B の ccd ファイルにエントリが必要です。このiroute
コマンドは、どのクライアントがそのサブネットを認識しているかを openvpn サーバーに伝えます。
# ccd/ServerB
iroute 172.30.0.0 255.255.255.0
編集: もう一度見てみると、もう一つ気づいたことがあります。
また、サーバー A はサーバー B へのルートをクライアントにプッシュしていないようです。
# ServerA config
push " route 172.30.0.0 255.255.255.0 "
私は、openvpn を実行している 2 台のサーバーでこれを行います。どのマシンにも手動でルートを追加する必要はありません。openvpn の設定が正しければ、サーバー B はサーバー A に 172.30.0.0 を で処理することを伝えますiroute
。サーバー A は、 で 172.30.0.0 をサーバー A 経由で送信するようにクライアントに伝えますpush " route ... "
。そして、サーバー B はすでに 10.8.0.0 のルートをプッシュしています。
ping
これが機能するかどうかをテストするには、ルートを追加しないことをお勧めします。
答え2
自分で解決しました。重要な点として、「ipforwarding」が両側で有効になっていませんでした。これが大きな問題です。iroute は私には理解できません。この記事を見ました: OpenVPN と iroute ルーティングはすべて OpenVPN によって行われます。手動でルーティングする必要はありません。以下に示すように:
最後に、助けてくれたDanger Gingerに感謝します。