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 のインストールと設定
vtoa は getpeername システムコールの戻り値を変更し、次のリスクをもたらします。この機能が必要であることを確認した場合にのみ 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 vtoaVTOA を停止します。
sudo systemctl stop vtoaシステムの起動時に VTOA が自動的に開始されるように設定します。
sudo systemctl enable vtoaシステムの起動時に VTOA が自動的に開始されないようにします。
sudo systemctl disable vtoaVTOA のステータスを確認します。
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 + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+