web-dev-qa-db-ja.com

ゲートウェイが設定されていないため、OpenVPNが機能しない

Debianマシンで、openVPNサーバーへの接続に問題がありました。

インターフェイスが追加され、10.130.x.x IPが割り当てられるという意味で接続を確立できましたが、VPNを介してトラフィックを取得できませんでした。すべてのトラフィックは、元のパブリックIPアドレスを通過します。

root@vps2:~# route -n  
Kernel IP routing table  
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
92.222.32.0     0.0.0.0         255.255.255.0   U     0      0        0 venet0  
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 venet0  
root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo  
92.222.32.42  
root@vps2:~# service openvpn start  
[ ok ] Starting virtual private network daemon: myvpn.  
root@vps2:~# route -n  
Kernel IP routing table  
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
10.130.3.137    0.0.0.0         255.255.255.255 UH    0      0        0 tun0  
92.222.32.0     0.0.0.0         255.255.255.0   U     0      0        0 venet0  
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 venet0  
root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo  
92.222.32.42  
root@vps2:~#   

私のsyslogで、メッセージを見ることができました注:デフォルトゲートウェイをリダイレクトできません-システムから現在のデフォルトゲートウェイを読み取ることができません。また、検索の結果、デフォルトゲートウェイが明示的に設定されていないことが原因であることがわかりました。リモートVPNは、デフォルトゲートウェイセットを明示的に見つけることだけを期待していない、ある種のクライアントスクリプトを使用していると思います。

デフォルトゲートウェイを明示的に設定する2つの方法を試しました。そして両方の仕事

  • 最初に、元のパブリックIPアドレスをデフォルトゲートウェイとして設定しようとしましたが、これは機能しました。

    route add default gw 92.222.32.42  
    root@vps2:~# route add default gw 92.222.32.42  
    root@vps2:~# route -n  
    Kernel IP routing table  
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
    92.222.32.0     0.0.0.0         255.255.255.0   U     0      0        0 venet0  
    0.0.0.0         92.222.32.42    0.0.0.0         UG    0      0        0 venet0  
    0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 venet0  
    root@vps2:~# service openvpn start  
    [ ok ] Starting virtual private network daemon: myvpn.  
    root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo  
    217.23.15.239  
    root@vps2:~#   
    
  • しかし、なぜ元のパブリックIPをデフォルトゲートウェイとして使用するのでしょうか。知りません。そこで、ランダムtracerouteからの最初のホップをデフォルトゲートウェイとして設定してみました。そしてそれもうまくいきました:

    root@vps2:~# traceroute foo.com  
    traceroute to foo.com (121.232.122.233), 30 Hops max, 60 byte packets  
     1  49.ip-92-222-50.eu (92.222.50.49)  0.039 ms  0.011 ms  0.012 ms  
     2  [......... I stop the traceroute when I see the first hop]  
     ^C  
    root@vps2:~# route add default gw 92.222.50.49
    root@vps2:~# route -n  
    Kernel IP routing table  
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
    92.222.32.0     0.0.0.0         255.255.255.0   U     0      0        0 venet0  
    0.0.0.0         92.222.50.49    0.0.0.0         UG    0      0        0 venet0  
    0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 venet0  
    root@vps2:~# service openvpn start  
    [ ok ] Starting virtual private network daemon: myvpn.  
    root@vps2:~# wget --no-dns-cache --no-proxy --header="Host: ipecho.net" http://146.255.36.1/plain -q -O - 2>&1;echo  
    217.23.15.239  
    root@vps2:~#   
    

    やったー!私は自分でここまで到達しました。

これで、VPNに接続した後、ルーティングが自動的に変更されます。これは素晴らしいことですが、元のパブリックIPアドレスを介したすべての接続が失われ、SSH接続が切断され、Webサーバーにアクセスできなくなり、提供している他のサービスも利用できなくなります。これは、すべての着信接続にVPN経由でルーティングされる応答があるためだと思います。同じIPから応答を取得するために、元のパブリックIPを介して着信するすべての接続を確認したいと思います。また、VPNは、サーバーが外部に向けて開始する接続にのみ使用されます。私はまだこの部分を理解していません。

VPNに接続した後のルーティングは次のようになります。

root@vps2:~# route -n  
Kernel IP routing table  
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
10.130.0.1      10.130.3.73     255.255.255.255 UGH   0      0        0 tun0  
10.130.3.73     0.0.0.0         255.255.255.255 UH    0      0        0 tun0  
217.23.15.239   92.222.32.42    255.255.255.255 UGH   0      0        0 venet0  
92.222.32.0     0.0.0.0         255.255.255.0   U     0      0        0 venet0  
0.0.0.0         10.130.3.73     128.0.0.0       UG    0      0        0 tun0  
128.0.0.0       10.130.3.73     128.0.0.0       UG    0      0        0 tun0  
0.0.0.0         92.222.32.42    0.0.0.0         UG    0      0        0 venet0  
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 venet0  
root@vps2:~#   

私の質問は:

  • 両方の方法が機能したので、デフォルトゲートウェイとして何を使用する必要がありますか?私の元のパブリックIPまたはtracerouteの最初のホップ?それともまったく違うものですか?

  • これを自動化して、起動時にゲートウェイが自動的に設定されるようにするにはどうすればよいですか?つまり、起動時にサーバーはデフォルトゲートウェイが設定されているかどうかを確認し、設定されていない場合は、パブリックIPまたはtracerouteの最初のホップをデフォルトゲートウェイとして配置します...

  • そして、最終的にopenVPNに接続した後、元のパブリックIPアドレスを介して接続が失われるのを防ぎながら、すべての発信接続でVPNを使用するにはどうすればよいですか?

1
nl-x

最初から始めて、質問を順番に進めていきます。

  1. 接続できません

    接続を確立でき、IPを取得できましたが、デフォルトゲートウェイが設定されていないため、VPN経由でトラフィックを取得できませんでした[...]

    接続のリモートエンドにpingを実行できない場合は、デフォルトルートを変更するよりも重要な問題が発生します。ルーティングの潜在的な問題を確認する前に、リモートエンドにpingできることを確認してください。クライアント構成ファイルの概算すら含まれていないため、特定のコマンドを提供することはできません。

  2. デフォルトゲートウェイを変更するにはどうすればよいですか?

    デフォルトゲートウェイを自分で変更しないでください。 VPN接続を介してすべてのトラフィックをルーティングする場合は、OpenVPN HOWTOで説明されているように、 redirect-gateway def1構成パラメーター を使用します。

  3. 起動時にVPNを開始する方法は?

    これも OpenVPN HOWTOで説明 であり、/etc/openvpnで適切な構成ファイルを作成する必要があります(Debian派生システムでは/etc/default/openvpnを編集して自動起動をアクティブにします)。

  4. 他のインターネット接続が失われないようにする方法

    最終的にopenVPNに接続した後、デフォルトゲートウェイはopenVPNを使用するように変更されます。ただし、既存の接続(SSH接続など)はすべて切断され、インターネットからマシンにアクセスできなくなります。この動作を防ぐことはできますか?

    VPNを介してすべてのトラフィックをルーティングしている場合、その一部をインターネット経由でルーティングすることを任意に選択することはできません。 VPNを介して「すべての」トラフィックをルーティングするための基準を再考する必要があるでしょう。たとえば、これは「HTTP/HTTPSトラフィックのみ」、「SSH以外のすべて」でしょうか。

2
roaima

あなたのルートのvenetは、あなたがOpenVZのようなもので実行していると私に思わせますか?

その場合、ハイパーバイザーでtunモジュールをロードし、ゲストがそれを使用できるようにする必要があります。 OpenVZを使用しているとすると、これは次のようになります。

vz# modprobe tun && echo tun >>/etc/modules
vz# vzctl set $CTID --devnodes net/tun:rw --capability net_admin:on --save
1
SYN