このようなシナリオがあります...
- 複数のOpenVPN接続を持つサーバー(デフォルト)(したがって、サーバーは複数のOpenVPNサーバーにクライアントとして接続されます。セカンダリサーバーであるとします)
- このサーバーはOpenVPNサーバーも実行します。
今私が必要とするのは、クライアントがユーザー名/パスワードを使用してOpenVPN(プライマリ)サーバーに接続することです。そのユーザー名に基づいて、サーバーはそのクライアントからのすべてのトラフィックを指定された(セカンダリ)OpenVPNサーバーにルーティングします。
を使用してこれを行う方法はありますかiptables
?
ありがとう
答え1
私はあなたが欲しいと仮定します:
one specific secondary VPN server to become the default gateway for a given client.
その場合は、パスプッシュを使用してこれを実行できます。 OpenVPN接続が確立された後、クライアントに「新しい」ゲートウェイのアドレスを知らせることができることは既に知っています。
まあ、あなたはこれを行うことができます動的に。
~から手動:
--client-connect scriptクライアント接続時にスクリプトを実行します。スクリプトを通過一般名環境変数として認証されたクライアントのIPアドレス(下記の環境変数のセクションを参照)。また、スクリプトは、まだ生成されていない一時ファイルのパス名を、スクリプトで使用される$1(つまり、最初のコマンドライン引数)に渡します。動的に生成されたプロファイルディレクティブをOpenVPNに戻す。
スクリプトがクライアントが接続されたときにサーバーに適用される動的構成ファイルを生成する場合は、それを$ 1というファイルに書き込む必要があります。
動的に生成された構成ファイルに使用できるオプションについては、以下の--client-config-dirオプションを参照してください。
気づくスクリプトの戻り値が重要です。スクリプトがゼロ以外のエラー状態を返すと、クライアントは切断されます。
したがって、ユーザーがする必要があるのは、(クライアントの一般名、デフォルトゲートウェイ)エントリのリストを維持し、クライアント名を確認し、client-connect
OpenVPNpush "route-gateway a.b.c.d"
サーバーとそこからクライアントに送信する適切なコンテンツを準備するスクリプトを準備することです。
スクリプトにコマンドを入れることもできますが、ip
必要ありません。
たとえば、
#!/bin/sh
# Connect script for OpenVPN. This is /usr/local/bin/openvpn-connect-script.sh
# and OpenVPN server requires the extra option
#
# --connect-client /usr/local/bin/openvpn-connect-script.sh
#
$script="$1"
# We could even fetch this from, say, a MySQL database.
# GATEWAY=$( echo "SELECT gateway FROM users_config WHERE user='$username';" \
# | mysql -N openvpn )
case "$username" in
"lserni")
GATEWAY=192.168.168.192
;;
"apiraino")
GATEWAY=192.168.170.133
;;
"*")
GATEWAY=192.168.172.1
;;
esac
cat <<-CONFIG > $script
# Extra options, user-dependant.
gateway $GATEWAY
CONFIG
exit 0