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アドレスを取得します。
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 + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+