nginx streamモジュールでFTPサーバーのリバースプロキシを構成

Debianにnginx 1.9をstreamモジュール付きでインストールしました。
Debian 8にnginx 1.9をソースからstreamモジュール付きでインストール
※streamモジュールはnginx 1.9からの機能です。

これを使用して、FTPサーバーのリバースプロキシを構成してみます。


・フロント

IP:192.168.1.101


・バックエンドのFTPサーバー

IP:192.168.1.103
コントロールポート:20021
PASVデータポート:20001-20004

673_03.png




nginx.conf



Module ngx_stream_core_module
こちらを参考に、設定ファイルは以下のようになりました。


worker_processes auto;

events {
    worker_connections 1024;
}

stream {
    # コントロールポート転送先
    upstream backend_ctl {
        server 192.168.1.103:20021;
    }
    
    # データポート転送先(pasvポート分指定)
    upstream backend_data_01 {
        server 192.168.1.103:20001;
    }
    upstream backend_data_02 {
        server 192.168.1.103:20002;
    }
    upstream backend_data_03 {
        server 192.168.1.103:20003;
    }
    upstream backend_data_04 {
        server 192.168.1.103:20004;
    }

    # コントロールポート受け
    server {
        listen 20021;
        proxy_pass backend_ctl;
    }

    # データポート受け(pasvポート分指定)
    server {
        listen 20001;
        proxy_pass backend_data_01;
    }
    server {
        listen 20002;
        proxy_pass backend_data_02;
    }
    server {
        listen 20003;
        proxy_pass backend_data_03;
    }
    server {
        listen 20004;
        proxy_pass backend_data_04;
    }
}




コントロール用のポートとデータ用のポート、全ての転送指定を記載します。
ポートを範囲指定できれば楽なのですが、やり方がわからず、
愚直に全部記載しています。

今回はバックエンドを1台しか用意していないので指定していませんが、
複数台で構成するときには、upstreamの指定の先頭に


hash $remote_addr consistent;



を記載し、IPアドレス毎に同じバックエンドに流れるように
構成する感じになると思います。





FTPサーバー



バックエンドのFTPサーバーはpyftplibで構成しました。
すぐ作ってすぐ壊せるFTPサーバーを立てる (Pythonで)
Python + pyftpdlibでカスタムFTPサーバーを作成1 起動とユーザー認証


Tutorial
マニュアルを参考に、
masquerade_addressで上流サーバーのIP、
passive_portsで、使用するポートの範囲を指定します。

Pythonのコードはこうなります。

・ftp.py


  1. # -*- coding:utf8 -*-
  2. import pyftpdlib.authorizers
  3. import pyftpdlib.handlers
  4. import pyftpdlib.servers
  5. # 認証ユーザーを作る
  6. authorizer = pyftpdlib.authorizers.DummyAuthorizer()
  7. authorizer.add_user('user', 'password', '/var/ftp/data', perm='elradfmw')
  8. # 個々の接続を管理するハンドラーを作る
  9. handler = pyftpdlib.handlers.FTPHandler
  10. handler.authorizer = authorizer
  11. # データ通信で使用するポートを指定
  12. handler.masquerade_address = '192.168.1.101'
  13. handler.passive_ports = range(20001, 20004 + 1)
  14. # FTPサーバーを立ち上げる
  15. server = pyftpdlib.servers.FTPServer(("0.0.0.0", 20021), handler)
  16. server.serve_forever()




FTPサーバーを起動


# python ftp.py





データ保存用のディレクトリ、/var/ftp/dataは事前に作成しておきます。
ポート:20021
ID:user
PASS:password

この設定でフロントである192.168.1.101に対してFTP接続を試みます。

673_01.png

あっさり接続出来ました。

FTP通信のログも、上流の192.168.1.101からとなっています。

673_02.png

関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ