すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:vtoa を使用してアドレス変換後の実際のクライアントアドレスを取得する

最終更新日:Nov 11, 2025

Anti-DDoS Pro や Anti-DDoS Premium を使用する場合などの FullNAT シナリオでは、クライアントアドレスは FullNAT ノードのアドレスに変換されます。カーネルバージョンが 5.10.134-15 以降で、vtoa がインストールされている Alibaba Cloud Linux 3 を実行しているバックエンドサーバーでは、TCP Option Address (TOA) に基づいて getsockopt または getpeername を呼び出して、実際のクライアントアドレスを取得できます。この機能は IPv4 と IPv6 の両方をサポートします。

制限事項

VTOA を使用するには、サーバーでカーネルバージョンが 5.10.134-15 以降の Alibaba Cloud Linux 3 を実行する必要があります。

説明

イメージのカーネルバージョンを照会するには、uname -r コマンドを実行します。

シナリオ

  • Anti-DDoS Pro および Anti-DDoS Premium: ユーザーリクエストは、転送ノードでアドレス変換 (FullNAT) を受けます。このシナリオでは、転送ノードは Anti-DDoS ノードです。Anti-DDoS サービスは TOA メカニズムを有効にします。これにより、実際のクライアント IP アドレスやポート番号などの情報が TCP Option にカプセル化され、バックエンドサーバーに送信されます。バックエンドサーバーは vtoa を使用して、実際のクライアント IP アドレスを取得します。

  • CDN: サービスリクエストは CDN ノードによってバックエンドサーバーに転送されます。バックエンドサーバーは vtoa を使用して、実際のクライアントアドレスを取得できます。

VTOA のインストールと設定

警告

vtoagetpeername システムコールの戻り値を変更し、次のリスクをもたらします。この機能が必要であることを確認した場合にのみ VTOA をインストールしてください。

  • Cilium などの他のネットワークコンポーネントが eBPF などのメソッドを使用して getpeername の結果を変更すると、vtoa との競合が発生し、機能が異常に動作する可能性があります。

  • アプリケーションが getpeername に依存している場合、その動作が影響を受ける可能性があります。

VTOA のインストールとアンインストール

  • インストール

    sudo yum install vtoa -y
  • アンインストール

    sudo yum remove vtoa -y
説明

インストールが完了すると、VTOA は有効になります。デフォルトでは、VTOA はシステムの起動時に自動的に開始されます。アンインストールが完了すると、VTOA は無効になります。

VTOA の設定

VTOA はインストール後すぐに有効になります。デフォルトでは、VTOA はシステムの起動時に自動的に開始されます。ほとんどの場合、VTOA を設定する必要はありません。

  • VTOA を開始します。

    sudo systemctl start vtoa
  • VTOA を停止します。

    sudo systemctl stop vtoa
  • システムの起動時に VTOA が自動的に開始されるように設定します。

    sudo systemctl enable vtoa
  • システムの起動時に VTOA が自動的に開始されないようにします。

    sudo systemctl disable vtoa
  • VTOA のステータスを確認します。

    systemctl status vtoa

クライアントの実際のアドレスの取得

vtoa が有効になった後、getsockopt または getpeername システムコールを呼び出して、実際のクライアントアドレスを取得できます。

(推奨) getsockopt 関数の呼び出し

重要

カーネルバージョンは 5.10.134-17 以降である必要があります。uname -r コマンドを実行してカーネルバージョンを確認できます。

vtoa は、実際のクライアントアドレスを取得するために使用できる新しい optname を提供します。この静的フィールドの値は 1348 です。次の C コードはサンプルです。

struct sockaddr caddr;
int optlen = sizeof(caddr);
int optname = 1348;

getsockopt(fd, IPPROTO_IP, optname, &caddr, &optlen);
// caddr.sa_family パラメーターの値は、IPv4 アドレスを示す AF_INET、または IPv6 アドレスを示す AF_INET6 の場合があります。

getpeername 関数の呼び出し

重要

この機能は、カーネルバージョンが 5.10.134-15 以降の Alibaba Cloud Linux 3 でサポートされています。この機能は将来廃止される可能性があります。

vtoa が有効になっている場合、実際のクライアントアドレスが返されます。以下は C コードの例です。

struct sockaddr caddr;
int caddr_len = sizeof(caddr);

getpeername(fd, &caddr, &caddr_len);
// caddr.sa_family パラメーターの値は、IPv4 アドレスを示す AF_INET、または IPv6 アドレスを示す AF_INET6 の場合があります。
// accept() 関数を使用してクライアントの実際のアドレスを取得することもできます。使用方法は getpeername 関数と同様です。

サポートされている TOA オプションフォーマット

vtoa が解析するアドレス情報は TCP option で伝送され、特定のフォーマット要件を満たす必要があります。TCP option がフォーマット要件を満たさない場合、vtoa はそれを無視します。このプロセスはアプリケーションに影響を与えず、VTOA 機能が無効になっていることと同じです。

  • IPv4 TOA の場合、オペコード値は 254 です。

    opsize は 8 です。ip/port はネットワークバイトオーダーです。

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     opcode    |    opsize     |              port             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ip                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • TOA_V6 (オペコード = 253)

    opsize は 20 です。ip/port はネットワークバイトオーダーです。

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     opcode    |    opsize     |              port             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                                                               |
       +                                                               +
       |                                                               |
       +                              ip                               +
       |                                                               |
       +                                                               +
       |                                                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+