SSHで接続するCentOS7を実行しているVPSがあります。VPSでOpenVPNクライアントを実行して、インターネットトラフィックがVPN経由でルーティングされるようにしたいのですが、SSH経由でサーバーに接続できるようにします。OpenVPNを起動すると、SSHセッションが切断され、VPSに接続できなくなります。着信SSH(ポート22)接続をVPSの実際のIP(104.167.102.77)で開きながら、発信トラフィック(VPSのWebブラウザーなど)をVPN経由でルーティングできるようにVPSを構成するにはどうすればよいですか?

私が使用しているOpenVPNサービスはPrivateInternetAccessであり、config.ovpnファイルの例は次のとおりです。

client
dev tun
proto udp
remote nl.privateinternetaccess.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-client
remote-cert-tls server
auth-user-pass
comp-lzo
verb 1
reneg-sec 0
crl-verify crl.pem

VPSのIPアドレス:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:be:16:f7 brd ff:ff:ff:ff:ff:ff
    inet 104.167.102.77/24 brd 104.167.102.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:febe:16f7/64 scope link
       valid_lft forever preferred_lft forever
4: tun0:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.172.1.6 peer 10.172.1.5/32 scope global tun0
       valid_lft forever preferred_lft forever

VPSのIPルート:

0.0.0.0/1 via 10.172.1.5 dev tun0
default via 104.167.102.1 dev ens33  proto static  metric 1024
10.172.1.1 via 10.172.1.5 dev tun0
10.172.1.5 dev tun0  proto kernel  scope link  src 10.172.1.6
104.167.102.0/24 dev ens33  proto kernel  scope link  src 104.167.102.77
109.201.154.177 via 104.167.102.1 dev ens33
128.0.0.0/1 via 10.172.1.5 dev tun0
answer

私はこれと同様の問題を抱えており、このフォーラムの投稿で説明されている修正を試みています

現在、パブリックIPアドレスに接続すると、リターンパケットはVPN経由でルーティングされるという考え方です。これらのパケットを強制的にパブリックインターフェイス経由でルーティングする必要があります。

これらのルートコマンドはうまくいけばトリックを実行します:

ip rule add from x.x.x.x table 128

ip route add table 128 to y.y.y.y/y dev ethX

ip route add table 128 default via z.z.z.z

ここで、xxxxはパブリックIP、yyyy / yはパブリックIPアドレスのサブネット、ethXはパブリックイーサネットインターフェイス、zzzzはデフォルトゲートウェイです。

これは(DebianとPrivateInternetAccessを使用して)私にはうまくいきませんでしたが、あなたを助けるかもしれないことに注意してください。

@MrKの回答に基づいて、ここにいくつかの簡単なコードを記述して、作業をすばやく実行できるようにしました。これにより、インターフェイス/ IPを確認する必要がなくなります。

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128
ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

このスクリプトを4つのVPSで試しましたが、完全に機能しています。

これは少し遅いかもしれませんが...

問題は、デフォルトゲートウェイがOpenVPNによって変更され、OpenVPNを開始する前に適切なルートを設定しない限り、現在のSSH接続が切断されることです。

以下は私のために働きます。iptablesとip(iproute2)を使用します。以下では、OpenVPNが開始される前のデフォルトゲートウェイインターフェースは「eth0」であると想定されています。eth0への接続が確立されたときに、eth0がデフォルトゲートウェイインターフェイスでなくなった場合でも、接続の応答パケットが再びeth0に戻るようにするという考え方です。

接続マーク、ファイアウォールマーク、ルーティングテーブルに同じ番号を使用できます。私はそれらの間の違いをより明確にするために異なる番号を使用しました。

# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

アップデート:

上記はDebianJessieで問題なく動作します。しかし、古いWheezyシステムでは、ルーティングテーブルエントリに「via」を追加する必要があることがわかりました。

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

「12.345.67.89」は元の非VPNゲートウェイである必要があります。

うーん、IPサブネットが重複しているように聞こえます.... nl.privateinternetaccess.comとしてのVPN終端のパブリックIP以外は、IPスキームについて詳しく知らないと、確実にわかりません。

たとえば、nl.privateinternetaccess.comの反対側のリモートサブネットが10.32.43.0/24であり、インスタンスが10.32.44.0/24のサブネットを持つawsvpcにある場合です。ただし、ソースsshクライアントは10.32.43.0 / 24(aws vpcの側)に存在します。リターンsshトラフィックがvpnを介して誤ってオランダにプッシュされるため、機能しません。

これに関する詳細については、完全なIP /サブネット情報を提供してください。

..。

わかりました、それで... nlに接続した後、デフォルトルートはトンネル内にあるように見えます:

0.0.0.0/1 via 10.172.1.5 dev tun0

接続後に変更できます。多くの場合、VPNサーバーは偽のルートを提供します。特にずさんな軍団で。この場合、彼らはあなたにデフォルトルートをプッシュしているので、vpsボックスからのすべてのトラフィックはnlに行きます。デフォルトルートを104.167.102.xまたはurvpsプロバイダーにあるurサブネットゲートウェイに変更します。

VPNを起動すると、デフォルトゲートウェイが置き換えられます。これは、ボックスから生成された、またはボックスを介してルーティングされたトラフィックがVPNゲートウェイに転送されることを意味します。

簡単な解決策は、VPNを介してルーティングしたくないすべてのトラフィックをフィルタリングし、それを使用して他のことを行うことです。1つの可能性は、ボックスから生成されたトラフィックをローカルの送信元アドレスで取得し、ローカルゲートウェイを介してルーティングすることです。これにより、SSHなどのサービスが正しく機能します。

ここでそれを行います。まず、新しいルーティングテーブルを作成し、ローカルゲートウェイを介してすべてをルーティングするデフォルトルートを追加します。

# <table> is any number between 2 and 252.
# Check /etc/iproute2/rt_tables for more info.
ip route add default via <gateway> table <table>
ip route add <lan-addr> dev <device> table <table>

次に、特定の送信元アドレスからボックスを離れるすべてのトラフィックに識別子を付ける新しいパケットフィルタールールを作成します。

# <mark> is any number.
iptables -tmangle -AOUTPUT -s<local-addr> -jMARK --set-mark <mark>

最後に、前述のマークされたすべてのトラフィックを選択し、上記で生成されたテーブルを使用してルーティングするルーティングポリシーを作成します。

ip rule add fwmark <mark> table <table>

繰り返しになりますが<mark>、との値<table>は任意の識別子です。

pfSenseで自分でOpenVPNサーバーを実行している私にとって、「クライアントが生成したすべてのIPv4トラフィックをトンネルに強制する」の設定をオフにすることでした。

オンプレミスのOpenVPNサーバーに接続されているAWSインスタンス(VPNクライアント)で同じ問題が発生しました。同じVPNサーバーまたはオンプレミスのネットワークに接続していないとアクセスできません。解決策は、ローカルマシンのパブリックIPアドレスからAWSインスタンスゲートウェイへのルートを追加することでした。

ip route add xx.xxx.xx.xx via 172.xx.xx.1 dev eth0

また、AWSインスタンスにアクセスする必要がある外部ユーザーについても同じことを繰り返すことができます。これは、少数の外部ユーザーとのみ共有する必要があるためです。

https://serverfault.com/a/660106/577384およびhttps://serverfault.com/a/793700/577384で展開しますこれを公開ドッカーサービスで適切に機能させるために、私もそうしなければなりませんip -4 rule add to 172.0.0.0/8でした。ローカルホスト(Dockerサービス)に送信されるパケットがeth0を介してルーティングされないようにするため。このルールが「テーブル」ルールよりも優先されることを確認してください。

また、LANデバイス全般について、残りのiptableルールの前に次のルールがありますiptables -A PREROUTING -t mangle -s 192.168.0.0/16 -j ACCEPT -m comment --comment "Skip special route for LAN"

(私はIPv6にも同様のものが必要だと強く主張していますが、IPv6でdockerを実行していません)