如果您的业务通过非网站方式接入 DDoS 高防实例,而且源站非火山引擎云服务器(ECS)或负载均衡(LB)等资源(例如其他云厂商 ECS、线下 IDC 服务器等),源站将无法直接获取真实的请求来源 IP。您可以通过在服务器安装 TOA 模块来获取真实的请求 IP。
该 IP 获取机制由高防实例和部署在服务器上的 TOA 模块共同实现。高防实例在返回给源站的报文中携带访问客户端的源 IP 等信息,并由安装在源站服务器上的 TOA 模块从报文中解析出相关信息 ,获取对应的源 IP。
安装 TOA 模块前请确保您有服务器 root 权限。
根据服务器系统类型和内核版本,下载对应的 TOA 模块安装包。
操作系统 | 内核版本 | 安装包 |
---|---|---|
Ubuntu | Ubuntu 16.04.7 4.15.0-142-generic | |
Ubuntu 16.04.7 4.4.0-151-generic | ||
Ubuntu 18.04 4.15.0-76-generic | ||
CentOS | CentOS 7.9 3.10.0-1160.el7.x86_64 | |
CentOS 7.6 3.10.0-957.27.2.el7.x86_64 | ||
CentOS 6.8 2.6.32-642.6.2.el6.x86_64 | ||
Debian | Debian 9 4.9 | |
Debian 10-4.19.0-18-amd64 |
用 root 身份登录到服务器主机。
将安装包解压。
tar -xzvf toa.tgz #使用安装包实际名称替换toa.tgz。
将解压文件移动至指定目录。
mv toa /usr/local/ #使用文件实际名称替换toa和路径/usr/local/。
执行安装命令。
/usr/local/toa/install.sh #使用文件实际名称替换toa和路径/usr/local/。
查看模块加载是否正常。
lsmod | grep toa #使用文件实际名称替换toa。
执行reboot
命令重启服务器,服务器重启后将自动加载 TOA 模块。
如您需要卸载 TOA 模块,可执行rmmod toa
命令,注意使用文件实际名替换toa
。
预期可以通过getpeername
接口获取 Client IP 和 Port 信息。
void checksockname(int fd) { struct sockaddr_in6 addr; int sin_size = sizeof(addr); printf("getpeername: "); if (getpeername(fd, (struct sockaddr *)&addr, (socklen_t *)&sin_size) == 0) sockaddr_display(&addr); //addr 即为真实客户端请求来源 IP 和端口信息。 else printf("error\n"); }