サーバーの背後にある LAN への OpenVPN ルーティング

サーバーの背後にある LAN への OpenVPN ルーティング

OpenVPN を使用してサイト間 VPN を設定しています。トンネルは正常に確立されているようです (一方から他方に ping を送信できます) が、両端のネットワークが互いを認識することができません。

私のトポロジーは次のとおりです。

Net1 (192.168.13.0/24)
 |
 | 
 |
192.168.13.35
ens160
-----------
OVPN Client
-----------
tun0
10.13.10.2
 |
 |
10.13.10.1
tun0
-----------
OVPN Server
-----------
ens160
10.1.121.6
 |
 |
Net2 (10.1.121.0/26)

クライアントからサーバーに ping を実行できます:

srv# ping 10.13.10.2
PING 10.13.10.2 (10.13.10.2) 56(84) bytes of data.
64 bytes from 10.13.10.2: icmp_seq=1 ttl=64 time=5.46 ms
64 bytes from 10.13.10.2: icmp_seq=2 ttl=64 time=5.01 ms

クライアントから Net1 にアクセスすることができます (もちろん、適切なルートを追加した後)。

client#ping 10.1.121.8
PING 10.1.121.8 (10.1.121.8) 56(84) bytes of data.
64 bytes from 10.1.121.8: icmp_seq=1 ttl=63 time=48.0 ms

しかし、逆の方法 (サーバーからクライアント ネットワーク (Net2) 上の何かに ping を実行する) はまったく実行できません。サーバーから Net2 上のクライアントの IP にさえアクセスできません。

server#ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
^C
--- 192.168.13.35 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2014ms

適切なルートがあります:

server# ip route
default via 10.1.121.1 dev ens160 onlink 
10.1.121.0/26 dev ens160  proto kernel  scope link  src 10.1.121.6 
10.13.10.0/24 dev tun0  proto kernel  scope link  src 10.13.10.1 
192.168.13.0/24 via 10.13.10.2 dev tun0 

client# ip route
default via 192.168.13.1 dev ens160 onlink 
10.1.121.0/24 via 10.13.10.1 dev tun0 
10.13.10.0/24 dev tun0  proto kernel  scope link  src 10.13.10.2 
192.168.13.0/24 dev ens160  proto kernel  scope link  src 192.168.13.35 

IPTables は何もブロックしていません (すべてが ACCEPT に設定されています):

client# iptables -L -vn
Chain INPUT (policy ACCEPT 56 packets, 3839 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 40 packets, 4343 bytes)
 pkts bytes target     prot opt in     out     source               destination   

server# iptables -L -vn
Chain INPUT (policy ACCEPT 736 packets, 75398 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 ACCEPT     all  --  tun0   *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 4 packets, 236 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    84 ACCEPT     all  --  tun0   *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 449 packets, 43393 bytes)
 pkts bytes target     prot opt in     out     source               destination 

トンネル インターフェイスで tcpdump を実行すると、クライアントから送信される ICMP パケットは表示されますが、サーバーに着信する ICMP パケットは表示されません。

server# ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
16:57:40.262004 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 1, length 64
16:57:41.269165 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 2, length 64
16:57:42.277154 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 3, length 64
16:57:43.285163 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 4, length 64

client# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes

両方のエンドポイントは、Ubuntu 16.04 Server LTS (x64、ほとんどデフォルトでインストールされています) です。

Linux ネットワークについて少しは知っていると思っていましたが、どうやら間違っていたようです :) 。なぜこれが機能しないのか全くわかりませんし、試すことができるアイデアも尽きてしまいました。どなたか正しい方向を指し示していただけませんか?

ありがとう!

答え1

が欠落している可能性がありますiroute。ルートをプッシュするだけでなく、iroute構成ファイルにも必要になります。以下は OpenVPN のマニュアル ページからの抜粋です。

--iroute ネットワーク [ネットマスク]

特定のクライアントへの内部ルートを生成します。ネットマスク パラメータを省略すると、デフォルトで 255.255.255.255 になります。このディレクティブは、クライアントがどこから接続しているかに関係なく、サーバーから特定のクライアントに固定サブネットをルーティングするために使用できます。ルートをシステム ルーティング テーブルにも追加する必要があることに注意してください (--route ディレクティブを使用するなど)。2 つのルートが必要な理由は、--route ディレクティブがカーネルから OpenVPN にパケットをルーティングするためです。OpenVPN に入ると、--iroute ディレクティブが特定のクライアントにルーティングします。このオプションは、--client-config-dir を使用してクライアント インスタンス構成ファイルで指定するか、--client-connect スクリプトを使用して動的に生成する必要があります。--iroute ディレクティブは、--push "route ..." とも重要な相互作用があります。--iroute は基本的に、特定のクライアント (このクライアントを A と呼びます) が所有するサブネットを定義します。他のクライアントが A のサブネットにアクセスできるようにするには、--push "route ..." を --client-to-client と一緒に使用してこれを実現します。すべてのクライアントが A のサブネットを参照できるようにするには、サブネットがすでに A によって所有されているため、OpenVPN は A を除くすべてのクライアントにこのルートをプッシュする必要があります。OpenVPN は、クライアントの iroute の 1 つに一致する場合はルートをクライアントにプッシュしないことでこれを実現します。

それぞれのクライアントとサーバーで以下のような設定エントリが必要になります。

アイルート 192.168.3.0 255.255.255.0

さらに、複数のクライアントの背後に複数のネットワークがある場合は、CCD をチェックアウトする必要がある場合があります。

クライアント設定ディレクトリ

このディレクティブはクライアント設定ディレクトリを設定します。OpenVPN サーバーは、着信接続ごとにこのディレクトリをスキャンし、クライアント固有の設定ファイルを探します (詳細についてはマニュアル ページを参照してください)。このディレクトリ内のファイルは、サーバーを再起動せずに、オンザフライで更新できます。このディレクトリの変更は、既存の接続ではなく、新しい接続にのみ有効になることに注意してください。クライアント固有の設定ファイルの変更を、現在接続中のクライアント (または切断されたが、サーバーがインスタンス オブジェクトをタイムアウトしていないクライアント) にすぐに適用したい場合は、管理インターフェイス (以下で説明) を使用してクライアント インスタンス オブジェクトを強制終了します。これにより、クライアントは再接続し、新しい client-config-dir ファイルを使用します。

答え2

Fossilの回答はまさに私が必要としていたもので、私はすでにそれを受け入れました。同じ問題を抱えているかもしれない他の人のために、いくつかの情報を追加したいと思います。この質問は以前にserverfaultで尋ねられましたが、回答ではirouteについて何も言及されていませんでした(一例)、またはデッドリンク(これです

それで...まず、iroute の素晴らしい説明を見つけました (そしてなぜそれが必要なのか)ここしかし、リンクが切れるリスクについては先ほど触れたばかりなので、以下では最も重要なアイデアについても触れてみたいと思います。

カーネル ルートだけでは、トラフィックが OpenVPN トンネルを通過するには不十分なようです。OpenVPN クライアントの背後にある LAN にアクセスするには、OpenVPN 内部ルート (iroute) も必要です。これは、server.conf の client-configuration-dir ステートメントを使用し、そのサブディレクトリ内に配置されている構成ファイルに iroute ステートメントを追加することで追加されます。

私の場合は、以下のものも必要でした:

#Inside server.conf
client-configuration-dir my-config-dir

#Inside my-config-dir/client1 (same name as the client!)
#Tell OpenVPN that 192.168.13.0/24 is reachable via client1
iroute 192.168.13.0 255.255.255.0

これにより、興味深い問題も発生します。OpenVPN がカーネル ルートのみを使用して動作できない場合、一見すると、ovpn トンネル上でルーティング プロトコルを実行することは不可能であるように見えます。このようなソリューション (ovpn+rip/ospf) を動作させた人はいますか?

関連情報