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
PATH=/opt/rh/devtoolset-8/root/bin:$PATH
。编译前请确认内核 gcc 编译版本,gcc 版本需与编译版本保持一致,可使用dmesg | grep 'Linux version'
命令查看内核 gcc 编译版本信息。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 时,当类型不匹配时,此计数增加。例如某条客户端连接内存放的是 IPv4 源 IP,并非为 IPv6 地址时,此计数便会增加。 |
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
本页内容是否解决了您的问题?