web-dev-qa-db-ja.com

VPN接続中の永続的なSSH接続

イントラネット上にSSH経由でのみアクセスできるLinuxマシンがあります。このマシンは、openconnectを使用してVPNに接続する必要がありますが、そうすると、イントラネットのIPが無効になるため、SSHから切断されます。

割り当てられたIPを使用してVPN内から再接続できますが、VPNが接続されるたびにIPが変更されるため、このマシンだけのネットワークを制御することはできません。

vPNへの接続中にSSH接続を維持する方法はありますか?ありがとう。


openconnectには、ルーティングを構成するためのスクリプトを受け取る--script引数が必要です。これがないと、接続は成功しますが、名前は解決されず、イントラネットのIPは有効なままです。

私は現在、Ubuntuのデフォルトの/ etc/vpnc/vpnc-scriptを使用しています( ここに貼り付け )シェルスクリプトは得意ですが、ネットワークについてはほとんど知りません。変更する必要がある場合は、何をどのように変更するかについての参照が必要です。

5
Samus_

vPNへの接続中にSSH接続を維持する方法はありますか?

いいえ。VPNに接続すると、そのシステムのルーティングが劇的に変化し、確立されたすべてのTCPソケットが壊れます。

Sshセッションで screentmux のようなターミナルマルチプレクサを使用することを検討する必要があります。そうすれば、再接続できる永続的なシェルを作成できます。

4
EEAA

一般的な回答

openconnect--scriptおよび--script-tunオプションを使用し、customvpnc-script を指定する必要があります。良い出発点は、openconnectと一緒にすでに配布されているvpnc-scriptです。たとえば、OSX(HomeBrewed openconnect)では、/usr/local/etc/vpnc-scriptにあります。

Openconnectの公式ドキュメントによると、次の点に注意してください。

OpenConnectjustはVPNサーバーとの通信を処理します。それは、それが実行されているすべてのさまざまなオペレーティングシステムでネットワークルーティングとネームサービスを構成する方法を知りません

ルーティングおよびネームサービスを設定するために、通常vpnc-scriptと呼ばれる外部スクリプトを使用します。


より良い解決策

openconnectのプロキシサーバーとして機能する ocproxy という優れたプロジェクトがすでに存在するため、ocproxy([〜#〜] o [ 〜#〜]pen[〜#〜] c [〜#〜]onnectプロキシ)。

ocproxyは、lwIPに基づくOpenConnectのユーザーレベルのSOCKSおよびポート転送プロキシです。 ocproxyを使用する場合、OpenConnectは、ユーザーがプロキシから具体的に要求するネットワークアクティビティのみを処理するため、VPNインターフェイスがホスト上のすべてのネットワークトラフィックを「ハイジャック」することはなくなりました。

OpenConnectコマンドの例:

echo $1 | Sudo openconnect -u $2 -d --timestamp -v --passwd-on-stdin --script-tun --script "ocproxy -D $3 -v" $4

交換:

  • $1 with:OpenConnectパスワード
  • $2 with:OpenConnectユーザー名
  • $3 with:必要なSocks5プロキシポート
  • $4 with:OpenConnectサーバーアドレス
3
slashsbin

カーネル内でパケットフィルタリングを処理するiptablesの内容を調べることをお勧めします。反対方向からopenconnectを使用します。デフォルト設定では、新しく作成されたVPNインターフェースを優先して、標準インターフェースへのアクセスを削除します。最初に行うことは、VPN接続によって作成されているルートを把握することです。次に、ゲートウェイとルートを処理するスクリプトを記述し、最後にiptablesをフラッシュして、VPN「チェーン」(iptablesで使用される用語)をクリアします。次のようなスクリプトがあります。

IPADDR=NN.NN.NN.N
DESIREDNET1=MM.MM.MM.MM
GATEWAY_LINE=$(netstat -rn | grep ${IPADDR})
GATEWAY=$(echo "$GATEWAY_LINE" | awk '{print $2}')
GATEWAY_DEV=gw
if [ "$GATEWAY" = "*" ]; then
    GATEWAY=$(echo "$GATEWAY_LINE" | awk '{print $8}')
    GATEWAY_DEV=''
fi
# add custom routes
route add -net $DESIREDNET1 netmask 255.255.0.0 dev cscotun0
...
# reset the default route
route del default
route add default $GATEWAY_DEV $GATEWAY

# flush iptables to clear the ciscovpn chain
iptables --flush
iptables --delete-chain
# Add out own nameservers back
if [ -f /etc/resolv.conf.vpnbackup ]
then
   cat /etc/resolf.conf /etc/resolv.conf.vpnbackup > /etc/resolv.conf
   echo "nameserver $GATEWAY" >> /etc/resolv.conf
fi

「通常の」設定を追加できるようにするには、VPNをオフにしているときに/etc/resolv.conf/etc/resolf.confにコピーする必要があります。

幸運を。

2
Arcege

その理由は、LinuxサーバーがVPN接続を確立すると、すべてのトラフィックがリモートネットワークのゲートウェイを経由してルーティングされるためだと思います。 VPNクライアントがリモートネットワークとの通信にリモートゲートウェイのみを使用するように構成すると、SSHを有効にすることができます。

私はopenconnectを使用していませんが、openvpnでは、VPN構成でuse this connection only for resources on its networkにチェックマークを付けることができます。

1
cuonglm

この問題の回避策は、端末接続に関係する両方のマシン上の同じVPNサーバーに接続することです。

わたしにはできる。

1
George Geoker

たとえば、VPSを使用していて、同じデータセンターにミニVPSを作成でき、2つのVPSのそれぞれにローカルIPを提供できる場合は、ミニVPSをトンネルとして使用してトンネルSSH接続を確立できます。このようにして、VPNに接続されている場合でもターゲットVPSに接続できます。

SSHを使用してリモート接続するには:

  • 接続ターゲットVPSの内部(LAN IP)(VPNに接続するもの)
  • ミニVPSをトンネルとして使用する-したがって、接続するミニVPSの外部IP

したがって、これの前提条件は次のとおりです。

  1. 同じネットワークで追加のVPSを作成できるようにする
  2. 両方のマシンにローカルの追加IPを割り当てる

これは、DigitalOcean、Linodeなどの人気のあるクラウドで簡単かつ実行可能です

0
tmanolatos