NGINXを異なるポート番号のリバースプロキシとして構成する方法


15
I have NGINX configured like this as a reverse proxy for http requests:

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}

また、ssh(ポート22)要求をプロキシしたいです。このような別のサーバーブロックを同じ構成ファイルに追加できますか。

server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

最終結果は次のようになります。

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}
server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

TIA、
オレ


2
nginxhttpプロキシとして機能しています。リバースプロキシポート22に設定すると、SSHトラフィックを渡すことができなくなりますhttp。SSHサーバーへのトラフィックのみが許可され、明らかに失敗します。
garethTheRed

HAProxyをチェックしてください。

回答:


13

SSHプロトコルは HTTPに基づいていない、そして、など、定期的なを通してプロキシすることができませんproxy_passngx_http_proxy_module

ただし、最近、nginx 1.9.0(2016-04-26で1.10.0で安定版としてリリース)から、nginxはTCPストリームプロキシの実行をサポートしました。つまり、nginxの最新バージョンがあれば、実際には、それを使用してSSH接続をプロキシできます(ただし、X-Real-IPプロキシ接続にはHTTPに基づいていないため、プロキシ接続に何も追加できないことに注意してください)。

詳細と例については、以下をご覧ください。


8

Nginxバージョン1.9.0、NGINXはngx_stream_core_moduleモジュールをサポートしているため、-with-streamで有効にする必要があります。ストリームモジュールを有効にすると、ssh protocol tcp proxyが可能になります

stream {
    upstream ssh {
        server 192.168.1.12:22;
    }
        server {
        listen        12345;
        proxy_pass    ssh;

    }

}

https://www.nginx.com/resources/admin-guide/tcp-load-balancing/


これはすべてnginxの優れた機能です-しかし、nginxがHTTPに完全に対応するように、実際のリバースプロキシを使用したい場合は役に立たないでしょう。ストリームアプローチは単純なNATであるため、エッジルータでそのタスクを実行したいのです。ここで欲しい/好きなものは、HTTPリバースプロキシとまったく同じ機能セットです。つまり、パブリックIPアドレスは1つしかありません。したがって、ポート22は1台のマシンでしか使用できませんが、フォーム内の要求を区別する方法があれば、ssh me@srv1.my.netまたssh me@srv2.my.net素晴らしいでしょう。それはプロトコルの制限です(SSHはDNS名クライアントの使用を提供しません)
-stamster

@stamster、異なるポート番号(例:122 srv1と222 srv2)を使用するか、ネストされたsshセッションを使用することで、ほぼ同じことを既に行うことができます。葉にssh; 例えば、ssh user@example.org 'ssh user@192.168.5.1'
cnst

1
いいえ、要件/アイデアはデフォルトポート(22またはその他のサービス)を宛先ポートとして使用し、DNS名などに応じてトラフィックをルーティングすることです。すべてnginxをリバースWeb httpプロキシサーバーとして使用しているように、各ドメインはデフォルトのポート80、443をターゲットとし、nginxはプロキシルールに応じてトラフィックをルーティングします。もちろん、クライアントにはHOSTヘッダーがあるため、ターゲットのサイトを簡単に区別できます...入れ子になったSSHセッションは一種の解決策ですが、面倒なものです-それでも動作します。エッジネットワークにさまざまなポートができました。古き良きNATは、最もKISSで信頼できるソリューションです。
スタムスター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.