製品アップデート情報
製品に関するお知らせ
modprobe toaコマンドを直接実行してロードおよび使用する方法を試すことができます。TencentOSとその他のLinuxディストリビューションシステムのTOAは別のものであり、同時に使用できないことに注意が必要です。insmod toa.ko
dmesg -T | grep TOA
toa.koファイルをロードします(マシンを再起動した場合はkoファイルの再ロードが必要です)。rmmod toa
dmesg -T
wget "https://clb-toa-1255852779.file.myqcloud.com/tgw_toa_linux_ver.tar.gz"
wget "https://clb-toa-1255852779.file.myqcloud.com/tgw_toa_tlinux_ver.tar.gz"
yum install gcc yum install make //カーネルモジュール開発パッケージをインストールします。開発パッケージのヘッダーファイルとライブラリのバージョンがカーネルバージョンと一致している必要があります yum install kernel-devel-`uname -r`yum install devtoolset-8
apt-get install gcc apt-get install make //カーネルモジュール開発パッケージをインストールします。開発パッケージのヘッダーファイルとライブラリのバージョンがカーネルバージョンと一致している必要があります apt-get install linux-headers-`uname -r`apt-get install devtoolset-8
zypper install gcczypper install make//カーネルモジュール開発パッケージをインストールします。開発パッケージのヘッダーファイルとライブラリのバージョンがカーネルバージョンと一致している必要がありますzypper install kernel-default-develzypper install devtoolset-8
warningおよびerrorが表示されなければ、コンパイルは成功です。Linuxシステムに対応するソースコードパッケージの例を挙げます。tar zxvf tgw_toa_linux_ver.tar.gzcd tgw_toa_linux_ver//解凍後のtgw_toaディレクトリに進みますmake
struct sockaddr v4addr;len = sizeof(struct sockaddr);//get_peer_nameはLinuxネットワークプログラミングの標準インターフェースです。if (get_peer_name(client_fd, &v4addr, &len) == 0) {inet_ntop(AF_INET, &(((struct sockaddr_in *)&v4addr)->sin_addr), from, sizeof(from));printf("real client v4 [%s]:%d\\n", from, ntohs(((struct sockaddr_in *)&v4addr)->sin_port));}
struct toa_nat64_peer {struct in6_addr saddr;uint16_t sport;};....struct toa_nat64_peer client_addr;....
enum {TOA_BASE_CTL = 4096,TOA_SO_SET_MAX = TOA_BASE_CTL,TOA_SO_GET_LOOKUP = TOA_BASE_CTL,TOA_SO_GET_MAX = TOA_SO_GET_LOOKUP,};getsockopt(client_fd, IPPROTO_IP, TOA_SO_GET_LOOKUP, &client_addr, &len);
real_ipv6_saddr = client_addr.saddr;real_ipv6_sport = client_addr.sport;
//リアルIP取得用関数の呼び出しメッセージを定義する必要があります。値は4096とします。enum {TOA_BASE_CTL = 4096,TOA_SO_SET_MAX = TOA_BASE_CTL,TOA_SO_GET_LOOKUP = TOA_BASE_CTL,TOA_SO_GET_MAX = TOA_SO_GET_LOOKUP,};//アドレスの保存に用いるデータ構造を定義する必要があります。struct toa_nat64_peer {struct in6_addr saddr;uint16_t sport;};//アドレスの保存に用いる変数を宣言します。カスタムタイプのアドレス保存用のデータ構造です。struct toa_nat64_peer client_addr;.……//クライアントのファイルディスクリプタを取得します。このうちlistenfdはサーバーのリスニングファイルディスクリプタです。client_fd = accept(listenfd, (struct sockaddr*)&caddr, &length);//関数を呼び出して、対応するNAT64シーンのユーザーのリアルソースIPを取得します。char from[40];int len = sizeof(struct toa_nat64_peer);if (getsockopt(client_fd, IPPROTO_IP, TOA_SO_GET_LOOKUP, &client_addr, &len) == 0) {inet_ntop(AF_INET6, &client_addr.saddr, from, sizeof(from));//ソースIPとソースportの情報を取得しますprintf("real client [%s]:%d\\n", from, ntohs(client_addr.sport));}
//リアルIP取得用関数の呼び出しメッセージを定義する必要があります。値は4096とします。enum {TOA_BASE_CTL = 4096,TOA_SO_SET_MAX = TOA_BASE_CTL,TOA_SO_GET_LOOKUP = TOA_BASE_CTL,TOA_SO_GET_MAX = TOA_SO_GET_LOOKUP,};//アドレスの保存に用いるデータ構造を定義する必要があります。struct toa_nat64_peer {struct in6_addr saddr;uint16_t sport;};//アドレスの保存に用いる変数を宣言します。カスタムタイプのアドレス保存用のデータ構造です。struct toa_nat64_peer client_addr_nat64;.......//クライアントのファイルディスクリプタを取得します。このうちlistenfdはサーバーのリスニングファイルディスクリプタです。//関数を呼び出して、対応するNAT64シーンのリアルなユーザーソースIPを取得します。char from[40];int len = sizeof(struct toa_nat64_peer);int ret;ret = getsockopt(client_fd, IPPROTO_IP, TOA_SO_GET_LOOKUP, &client_addr_nat64, &len);if (ret == 0) {inet_ntop(AF_INET6, &(client_addr_nat64.saddr), from, sizeof(from));//ソースIPとソースPortの情報を取得します。printf("real client v6 [%s]:%d\\n", from, ntohs(client_addr_nat64.sport));} else if (ret != 0) {struct sockaddr v4addr;len = sizeof(struct sockaddr);//ソースIPとソースPortの情報を取得します。この関数が取得するソースアドレスについては以下に注意してください。//ハイブリッドクラウドのデプロイシーンのSNAT IPのリンクを経たものはリアルソースアドレスです。//ハイブリッドクラウドのデプロイシーンのSNAT IPを経ておらず、NAT64のリンクも経ていないものはクライアントアドレスであり、これもリアルソースアドレスです。//このため、この関数のセマンティクスはリアルなクライアントアドレス、ポートを取得するためのものとなります。if (get_peer_name(client_fd, &v4addr, &len) == 0) {inet_ntop(AF_INET, &(((struct sockaddr_in *)&v4addr)->sin_addr), from, sizeof(from));printf("real client v4 [%s]:%d\\n", from, ntohs(((struct sockaddr_in *)&v4addr)->sin_port));}}
cat /proc/net/toa_table
cat /proc/net/toa_stats
指標名 | 説明 |
syn_recv_sock_toa | 受信したTOA情報を含む接続の数です。 |
syn_recv_sock_no_toa | 受信したTOA情報を含まない接続の数です。 |
getname_toa_ok | getsockoptを呼び出してソースIPの取得に成功するとこのカウントが増加するほか、accept関数を呼び出してクライアントリクエストを受信した場合もカウントが増加します。 |
getname_toa_mismatch | getsockoptを呼び出してソースIPを取得した際、タイプがマッチしないとこのカウントが増加します。例えば、あるクライアント接続内に含まれるものがIPv6アドレスではなくIPv4ソースIPであった場合、このカウントが増加します。 |
getname_toa_empty | TOAを含まないクライアントファイルディスクリプタがgetsockopt関数を呼び出した場合に、このカウントが増加します。 |
ip6_address_alloc | TOAカーネルモジュールがTCPデータパケットに保存されたソースIP、ソースPortを取得した際、情報を保存するためのスペースを申請します。 |
ip6_address_free | 接続がリリースされた際、TOAカーネルモジュールはそれまでソースIP、ソースPortの保存に使用していたメモリをリリースします。すべての接続が切断された状態で、全CPUのこのカウント数の合計はip6_address_allocのカウントと同じでなければなりません。 |
tlinuxが含まれればTLinuxシステム、そうでなければLinuxディストリビューションです。uname -a
tlinux または tl2が含まれていれば、TLinuxシステムです。rpm -qa | grep kernel
lsmod | grep toa
unknown-200が表示されている場合は、SNATを経たリアルソースIPがTCP optionに挿入済みであることを意味しています。unknown-253が表示されている場合は、NAT64シーンでリアルなIPv6のソースIPが挿入済みであることを意味しています。

make cleanmake
rmmod toainsmod ./toa.ko
dmesg -Tw

フィードバック