web-dev-qa-db-ja.com

VPNクライアントにポート転送しますか?

私は少し困惑しましたが、解決策を見つけるのにあまり運がありませんでした。現在、私は(悲しいことに)Verizon 3G経由でネットに接続しています。これらはすべての受信トラフィックをフィルタリングするため、ポートを開いて接続を受け入れることはできません。

現在linode.comにLinux仮想マシンがあり、pptpdをインストールしてiptablesポートフォワーディングを実行しようとする気持ちが頭をよぎりました。私はpptpdをインストールしており、自宅のマシンはうまく接続しています。そうは言っても、ここにいくつかの一般的な情報があります:

サーバー(Debian)WAN IP:eth0上のx.x.x.x-pptpd IP:ppp0上のy.y.y.1-クライアントVPN IP:y.y.y.100

私が気が狂っていなかったことを確認するために、サーバーからクライアントの開いているポートへの接続をいくつか試みましたが、クライアントはVPN IP経由の接続を受け入れます。

私が達成したいのはこれです:

インターネット-> WAN IP:ポート->クライアントVPNに転送IP:ポート

たとえば、クライアントでポート6000を開いている場合、人はx.x.x.x:6000にtelnetで接続でき、サーバーはそれをキャッチして192.168.3.100:6000に転送します。

私は少なくとも20種類のGoogledのiptables構成を試しましたが、どれもまだ機能していません。誰かが何かアイデアを持っていますか、あるいはおそらく私が気付いていないかもしれないまったく異なるアプローチさえありますか?ここでの目標は、恐ろしくファイアウォールで保護された接続、できればTCPとUDPトラフィックの両方)をリッスンすることです。

22
Vile Brigandier

これを機能させるには、VPNサーバー(Linode)で3つのことを行う必要があります。

  1. IP転送を有効にする必要があります。

    sysctl -w net.ipv4.ip_forward=1
    
  2. 宛先NAT(DNAT)を設定して、ポートを転送します。これは、標準のポート転送のものですが、完全を期すため、おそらくすでにわかっています。

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. ソースを設定するNAT(SNAT)で、VPNクライアントの観点から、接続がVPNサーバーから行われるようにします。

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

SNATが必要な理由は、そうでない場合、VPNクライアントは、VPN経由ではなく、デフォルトゲートウェイ(つまり、Verizon 3G)経由で接続を開始したホスト(z.z.z.z)に直接リターンパケットを送信するためです。したがって、返信パケットのソースIPアドレスは、Verizon 3Gアドレスであり、x.x.x.xではありません。これは、z.z.z.zが実際にx.x.x.xへの接続を開始したため、あらゆる種類の問題を引き起こします。

ほとんどのポート転送設定では、ポート転送を実行するホストが宛先ホスト(たとえば、ホームルーター)のデフォルトゲートウェイでもあるため、SNATは必要ありません。

また、ポート6000を別のポート(たとえば7000)に転送する場合、SNATルールは6000ではなく7000で一致する必要があることにも注意してください。

25
AGWA

私もこの問題を抱えていて、何時間もそれを解決しようとしました。これが私の解決策です:

  • 同じVPNClientを持つIPAddressが複数ありました。だから私はそれらのそれぞれに静的IPAddressを与えました

クライアントスクリプトを保存するディレクトリを定義します。/etc/openvpn/staticclientsおよびディレクトリを作成します

mkdir /etc/openvpn/staticclients

このディレクトリをオプションとしてサーバーのopenvpn設定ファイルに追加します。

client-config-dir /etc/openvpn/staticclients

クライアントごとに、ファイルを作成する必要があります。ファイル名は、クライアントの証明書で指定されたcommon name属性と一致する必要があります。このコマンドは、コンピューター証明書からCNを取得します。

この例では、IPAddress 10.1.134.110/10.1.134.109をcommon name[〜#〜] testclient [〜#〜]また、サブネット10.1.135.0の追加ルートをプッシュします。

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-Push 10.1.134.110 10.1.134.109
Push "route 10.1.135.0 255.255.255.0 10.1.134.62"
  • http://www.yougetsignal.com/tools/open-ports/ および http://canyouseeme.org/ はポートを正しく検出しませんでした。さらに、クライアントでアプリケーションを起動する必要がありました。これは、Webサイトがこれらのポートを認識できるようにするためです。

  • 追加のSNATルールは必要ありません。これらのルールのみが必要でした:

sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110
3
Dominic Jonas

ほとんどのサーバーでは、デフォルト設定でIP転送が無効になっています。 VPN経由で着信接続をリダイレクトする場合は、有効にする必要があります。

これを試して:

sysctl -w net.ipv4.ip_forward = 1

つまり、iptables構成に加えて。

2

あなたが達成したいことは、(おそらく)pptpdまたはOpenVPNとiptablesで非常に可能ですが、このユースケースのより良い候補を見つけるかもしれません。私は this を読んだだけで、まさにこの使用事例のためにtincを設定する方法を説明しています。これは、pptdpまたはOpenVPNパーツの(潜在的にシンプルな)代替手段です。次に、iptablesとまったく同じルールが必要になります。

0
chmac