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

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
- # -*- coding:utf8 -*-
- import pyftpdlib.authorizers
- import pyftpdlib.handlers
- import pyftpdlib.servers
- # 認証ユーザーを作る
- authorizer = pyftpdlib.authorizers.DummyAuthorizer()
- authorizer.add_user('user', 'password', '/var/ftp/data', perm='elradfmw')
- # 個々の接続を管理するハンドラーを作る
- handler = pyftpdlib.handlers.FTPHandler
- handler.authorizer = authorizer
- # データ通信で使用するポートを指定
- handler.masquerade_address = '192.168.1.101'
- handler.passive_ports = range(20001, 20004 + 1)
- # FTPサーバーを立ち上げる
- server = pyftpdlib.servers.FTPServer(("0.0.0.0", 20021), handler)
- server.serve_forever()
FTPサーバーを起動
# python ftp.py
データ保存用のディレクトリ、/var/ftp/dataは事前に作成しておきます。
ポート:20021
ID:user
PASS:password
この設定でフロントである192.168.1.101に対してFTP接続を試みます。

あっさり接続出来ました。
FTP通信のログも、上流の192.168.1.101からとなっています。

- 関連記事
-
- CentOS 7.2をMinimal ISOから最小構成でインストールする
- Ubuntu 14.04にMonoDevelopをインストール
- nginx streamモジュールでFTPサーバーのリバースプロキシを構成
- Debian 8にnginx 1.9をソースからstreamモジュール付きでインストール
- jenkinsでデータベースのバックアップとデータ更新の実行ジョブ
コメント