在LVS中的fullnat模式中,为了获取client的IP地址,会使用到LVS中的toa模块,该模块的作用就是替代系统中的getname系统调用,在rs端通过getname的系统调用获取到client的IP地址。在toa模块中使用到kallsyms_lookup_name函数,该函数的作用就是获取sock_def_readable函数的地址。但是在一些内核发行版中kallsyms_lookup_name函数并没有被EXPORT出来,所以在编译toa模块时,会出现下面的警告:

WARNING: "kallsyms_lookup_name" [/data/toa_v1/toa.ko] undefined!

使用insmod安装出现下面的提示信息: toa: Unknown symbol kallsyms_lookup_name 安装失败。如果内核版本是直接维护的话,可以重新编译内核模块,EXPORT kallsyms_lookup_name函数,如果不方便更换内核,可以使用下面的两个方法进行规避:
1. kallsyms_lookup_name函数没有被EXPORT情况下的处理方法:

1)可以使用下面的方法获取到sock_def_readable结构体的地址,

grep sock_def_readable /proc/kallsyms

ffffffff8145a610 t sock_def_readable

grep sock_def_readable /boot/System.map-2.6.32-573.26.1.el6.x86_64

ffffffff8145a610 t sock_def_readable

获取到具体的地址后,可以在toa的代码中硬编码,

sk_data_ready_addr = ffffffff8145a610;

2)  在kallsyms_lookup_name没有被EXPORT时,可以使用kallsyms_on_each_symbol函数替换,该函数在大部分内核版本上都会被EXPORT,

点击(此处)折叠或打开

  1. static int find_fn (void *data, const char *name, struct module *mod, unsigned long addr)
  2. {
  3. if (name != NULL && strcmp (name, "sock_def_readable") == 0) {
  4. sk_data_ready_addr = addr;
  5. return 1;
  6. }
  7. return 0;
  8. }
  9. static void get_fn_addr (void)
  10. {
  11. kallsyms_on_each_symbol (find_fn, 0);
  12. }

在static int __init toa_init(void)

{

…..

get_fn_addr();

…….

}

2. 在centos的2.6.32-573.26.1.el6.x86_64内核版本上,还出现了pagefault的情况,

<6>TOA: toa loaded

<1>BUG: unable to handle kernel paging request at ffffffff81677818

<1>IP: [] toa_exit+0x9/0xc9 [toa]

<4>PGD 1a8f067 PUD 1a93063 PMD 80000000016001e1

<4>Oops: 0003 [#1] SMP

<4>last sysfs file: /sys/devices/system/cpu/online

<4>CPU 0

<4>Modules linked in: toa(-)(U) xt_conntrack ipt_MASQUERADE iptable_filter iptable_nat ipt_addrtype ip_tables nf_nat nf_conntrack_ipv4

<4>

<4>Pid: 14149, comm: rmmod Not tainted 2.6.32-573.26.1.el6.x86_64 #1 Red Hat KVM

<4>RIP: 0010:[]  [] toa_exit+0x9/0xc9 [toa]

<4>RSP: 0018:ffff8801389cbed8  EFLAGS: 00010282

该问题出现在hook_toa_functions函数中下面的代码中,

inet_stream_ops_p = (struct proto_ops *)&inet_stream_ops;

inet_stream_ops_p->getname = inet_getname_toa;

可以通过下面的方法解决:

点击(此处)折叠或打开

  1. void set_addr_rw(unsigned long addr)
  2. {
  3. unsigned int level;
  4. pte_t *pte = lookup_address(addr, &level);
  5. if (pte->pte &~ _PAGE_RW) pte->pte |= _PAGE_RW;
  6. }
  7. void set_addr_ro(unsigned long addr)
  8. {
  9. unsigned int level;
  10. pte_t *pte = lookup_address(addr, &level);
  11. pte->pte = pte->pte &~_PAGE_RW;
  12. }
  13. 在hook_toa_functions函数中
  14. inet_stream_ops_p = (struct proto_ops *)&inet_stream_ops;
  15. set_addr_rw((unsigned long)(&inet_stream_ops.getname));
  16. inet_stream_ops_p->getname = inet_getname_toa;
  17. set_addr_ro((unsigned long)(&inet_stream_ops.getname));

LVS中使用toa模块遇到的坑相关推荐

  1. linux查看toa模块,toa 模块_Tenderrain的技术博客_51CTO博客

    toa模块是为了让后端的realserver能够看到真实的clientip而不是lvs的dip. 一.编译centos6 2.解压 3.编辑.config,将CONFIG_IPV6=M改成CONFIG ...

  2. mitmdump脚本中使用requests模块发送请求

    本文仅供学习交流使用,如侵立删! 环境 win10.Windows Server 2008 R2 python3.9 mitmdump4.0 mitmdump脚本中使用requests模块发送请求 m ...

  3. python中的log模块笔记

    日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日志输出中添 ...

  4. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

  5. python中常用的序列化模块_Python 中的序列化模块

    封面图片来源:沙沙野 序列化模块前面讲到解码编码的时候提过,网络数据传输只能通过 bytes 类型.而文件写入内容(不是指存储)既可以是 bytes,也可以是 string.这些操作都可以使用 eva ...

  6. APICloud中使用BMap模块实现定位功能并附上获取百度地图秘钥全教程

    1.首先在apicloud的模块库中应用bmap模块  2.查看bmap文档进行配置 发现 (1)需要开启手机的定位权限 在编译的时候开启即可 (2)使用此模块之前必须先配置apicloud中的con ...

  7. Centos编译加载toa模块

    什么是toa模块 toa模块是为了让后端的realserver能够看到真实的clientip而不是lvs的dip 安装步骤 安装依赖包 yum -y install kernel-devel gcc ...

  8. 在idea中移除子模块Moudle后重新导入

    在idea中移除模块并不是真正的移除,重新添加 1.按快捷键:crtl+shift+alt+s 打开 Project Structure 2.点击左侧Moudles 3.点击+号然后点击 import ...

  9. 在Ubuntu 16.04.5 LTS上利用python 2.7中的PIL模块智能等比例压缩过大的图片集实操

    需求 有时候自媒体创作写稿时难免遇到大规模压缩某个文件夹内的图片的情况,通常我们可以使用一些批量压缩的工具来处理,但我觉得,这是小白的做法,对于我们这些经验丰富的老司机来说,使用代码来处理,将是一件高 ...

最新文章

  1. 【Python3-OpenCV】实现实时摄像头人脸检测
  2. Github上十大热门可视化面板!再也不用担心画图啦!
  3. 一些少见的下载地址(按需求更新)
  4. python 文件 IO 操作
  5. 借助numpy.rot90实现图片顺时针旋转90°,旋转后图片没有黑边
  6. image vb6 图片自适应_Python人工智能使用OpenCV进行图片形状的中心检测
  7. 基于知识图谱的问答系统(以医疗行业为例)
  8. html中属性选择器是什么,为什么在CSS选择器/ HTML属性中首选使用破折号?
  9. PHP 的 Phar 包原来性能这么强!
  10. bigdecimal取小数部分_小数精度丢失问题分析和解决
  11. .net 获取网站根目录的方法
  12. 关于MySqlConnection的一个特殊异常
  13. fastapi 安全性 / APIRouter / BackgroundTasks / 元数据 / 测试调试
  14. Flink 有状态计算的状态容错
  15. 用计算机视频,如何用计算机做视频
  16. 爬虫实战(二)之登录百度云盘
  17. Windows server2012r2安装密钥
  18. 安装docker环境报错:Could not resolve host
  19. Java //PP2.14 按照以下要求修改程序Snowman: ·在其身上添加两个红色按钮。·将雪人的表情由笑脸变成皱眉。·把太阳移动到图片的右上角。·在图片左上角显示你的名字。。。
  20. DeFi黑暗森林历险记,我这样追回了百万美元

热门文章

  1. Oracle行转列、列转行实例
  2. 一样的幸福:残疾人用三轮车迎娶新娘(组图)
  3. 为什么hashcode的算法要用31作为乘子
  4. Android Jni反射Java方法,弹出对话框
  5. win11 搜索框无法输入文字
  6. MVP in Android
  7. 图解数据分析(10) | Numpy - 与2维数组操作(数据科学家入门·完结)
  8. 简述区块链开发与应用
  9. r53600和5600g性能差距 r53600和5600g对比
  10. Mysql中去重的语法_MySQL去重distinct