2026年5月17日

2026年5月17日

NginxのTCPプロキシ(stream)の設定方法

はじめに

Nginxは主にHTTPやHTTPSといったインターネット通信を処理するWebサーバーとして広く使用されていますが、その機能範囲はそれだけではありません。Nginxの「stream」ブロックを使用すればTCPやUDPプロトコルを利用した通信にも対応可能です。具体的にはDNSサーバーやメールサーバーなどの非HTTPサービスに対する負荷分散やプロキシ化が可能となります。

この記事では、NginxのTCPプロキシ設定における「stream」ブロックの基本的な使用方法から応用までを解説します。

症状・背景

  • メールサーバーの負荷分散
  • DNSサーバーのリダイレクト
  • クライアントとサーバー間のTCP接続のセキュリティ強化
  • 非HTTPサービスのプロキシリング

手順・設定方法

ステップ1: streamブロックの基本構造を理解する

# NginxのTCPプロキシ機能を使用するには、以下の設定が必要です。
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}

stream {
    upstream dns_server {
        server 192.168.1.1:53;
        server 192.168.1.2:53;
    }

    server {
        listen 53 udp;
        proxy_pass dns_server;
    }
}

ステップ2: セキュリティとロギングの設定

# streamブロック内でセッションタイムアウトや接続の有効期限を設定します。
stream {
    log_format main '$remote_addr [$time_local] '
                    '"$upstream_addr" $status $bytes_sent '
                    '$bytes_received $session_time';

    access_log /var/log/nginx/stream-access.log main;

    proxy_timeout 60s;
    proxy_connect_timeout 30s;

    upstream dns_server {
        server 192.168.1.1:53;
        server 192.168.1.2:53;
    }

    server {
        listen 53 udp;
        proxy_pass dns_server;
    }
}

ステップ3: 複数のプロトコルとポートを同時に処理

# DNSとSMTPの同時対応例
stream {
    log_format main '$remote_addr [$time_local] '
                    '"$upstream_addr" $status $bytes_sent '
                    '$bytes_received $session_time';

    access_log /var/log/nginx/stream-access.log main;

    proxy_timeout 60s;
    proxy_connect_timeout 30s;

    upstream dns_server {
        server 192.168.1.1:53;
        server 192.168.1.2:53;
    }

    server {
        listen 53 udp;
        proxy_pass dns_server;
    }

    upstream smtp_server {
        server mail.example.com:25;
    }

    server {
        listen 25 tcp;
        proxy_pass smtp_server;
    }
}

ステップ4: フェイルオーバーと負荷分散の設定

# DNSサーバー間でのフェイルオーバー設定例
stream {
    log_format main '$remote_addr [$time_local] '
                    '"$upstream_addr" $status $bytes_sent '
                    '$bytes_received $session_time';

    access_log /var/log/nginx/stream-access.log main;

    proxy_timeout 60s;
    proxy_connect_timeout 30s;

    upstream dns_server {
        server 192.168.1.1:53 max_fails=3 fail_timeout=30s;
        server 192.168.1.2:53 backup;
    }

    server {
        listen 53 udp;
        proxy_pass dns_server;
    }
}

注意事項

  • 設定を変更したらNginxを無効化せずに再起動(nginx -s reload)する。
  • デバッグ用にエラーログの設定を確認し、必要な情報を出力できるようにする。
  • 環境や要件によってはDNSSECなどの追加セキュリティ対策が必要となる場合がある。
  • TCP通信の場合、接続のタイムアウトや有効期限を適切に設定することが重要。

まとめ

1. TCPプロキシ機能: Nginxのstreamブロックを使用することで、TCPまたはUDPプロトコルを利用するサービスに対するプロキシリングが可能となる。

2. 基本的な構造: streamブロック内では、upstreamブロックでバックエンドサーバーを定義し、serverブロック内で接続先とプロキシパスを設定する。

3. セキュリティの強化: 接続タイムアウトやフェイルオーバー機能などを適切に設定することでシステムの信頼性を向上させることが可能となる。

4. ロギングとモニタリング: Nginxのログフォーマットをカスタマイズし、必要な情報を記録することによりトラブルシュートや監視が容易になる。

5. 応用可能性: DNSサーバーの負荷分散やメールサーバーのプロキシリングなど、さまざまな場面でNginxのTCPプロキシ機能を活用することが可能。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ