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

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

最終更新日:Aug 16, 2024

Anti-DDoS Proxyを使用する場合など、FULLNATシナリオでは、クライアントのアドレスがFULLNATノードのアドレスに変換されます。 クライアントの実際のアドレスを取得するには、カーネルバージョン5.10.134-15以降のAlibaba Cloud Linux 3オペレーティングシステムを実行し、VTOAがインストールされているバックエンドサーバーに接続し、TCP Option address (TOA) プロトコルを使用してgetsockoptまたはgetpeername関数を呼び出します。 IPv4およびIPv6アドレスがサポートされています。

制限事項

オペレーティングシステムの要件: カーネルバージョン5.10.134-15以降のAlibaba Cloud Linux 3

説明

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

シナリオ

  • Anti-DDoSプロキシ: リクエストのユーザーのクライアントアドレスは、FULLNATネットワークの転送ノードで変換されます。 次の図の転送ノードは、Anti-DDoSノードです。 Anti-DDoSノードでTOAメカニズムが有効になり、クライアントの実際のIPアドレスやポート番号などのクライアント情報がTCPオプションにカプセル化され、その情報がバックエンドオリジンサーバーに配信されます。 バックエンドオリジンサーバーはVTOAを使用して、クライアントの実際のIPアドレスを取得します。

image
  • Alibaba Cloud Content Delivery Network (CDN) アクセラレーション: クライアントからのサービスリクエストは、Alibaba Cloud CDNポイントオブプレゼンス (POP) によってオリジンサーバーに転送されます。 オリジンサーバーはVTOAを使用してクライアントの実アドレスを取得します。

VTOAのインストールと設定

警告

VTOAは、システムがgetpeername関数を呼び出すときにシステムの動作を変更できます。 これは予期しない方法でビジネスに影響を与える可能性があります。 VTOAをインストールする前に、実際に機能が必要であることを確認してください。

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

  • VTOAをインストールします。

    sudo yum install vtoa -y
  • VTOAをアンインストールします。

    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を提供します。 optnameパラメーターを1348に設定する必要があります。 サンプルCコード:

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

getsockopt(fd, IPPROTO_IP, optname, &caddr, &optlen);
// The value of the caddr.sa_family parameter may be AF_INET, which indicates an IPv4 address, or AF_INET6, which indicates an IPv6 address.

getpeername関数の呼び出し

重要

カーネルバージョン5.10.134-15以降のAlibaba Cloud Linux 3でgetpeername関数を呼び出します。 この関数は将来廃止される可能性があります。

VTOAの開始後、VTOAは実際のクライアントアドレス情報を返します。 サンプルCコード:

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

getpeername(fd, &caddr, &caddr_len);
// The value of the caddr.sa_family parameter may be AF_INET, which indicates an IPv4 address, or AF_INET6, which indicates an IPv6 address.
// The accept() function can also be used to obtain the real address of a client. The usage is similar to the getpeername function.

サポートされるTOAオプション形式

VTOAが解決するアドレス情報は、TCPオプションによって伝達され、特定のフォーマット要件を満たす必要があります。 TCPオプションがフォーマット要件を満たさない場合、VTOAはTCPオプションを無視します。 これはアプリケーションには影響せず、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                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • IPv6 TOAの場合、オペコード値は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                               +
       |                                                               |
       +                                                               +
       |                                                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+