ipsec.conf配置文件多个保护子网解析流程
|
|
目的:梳理ipsec如何解析配置文件,支持并添加多个保护子网

一、 流程梳理
启动ipsec服务时会自动解析/etc/ipsec.conf文件,因此从启动ipsec服务开始分析。

其中/etc/init.d/ipsec文件是一个shell脚本:

打开此shell脚本,发现启动时执行的函数是start()

eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量
因此与加载配置文件有关的命令是:ipsec addconn
其中ipsec命令信息如下:

同样是一个shell脚本。
ipsec脚本核心部分是:

这部分执行的命令格式如下所示:

将此命令重新输出到日志文件/home/ipsec.log中,方便查看调用的命令信息:

这里可以看到它使用的addconn命令解析配置文件并添加配置信息。
因此,我们需要查看学习addconn它的原理,查看文件类型可知,它是一个可执行文件。

源码中的位置如下:openswan-latest\openswan-2.6.51.5\programs\addconn\addconn.c

直接执行此命令,结果没有添加上隧道,重新尝试进行添加,后来终于添加成功了
二、 addconn.c实现原理
addconn可能用到的参数:
|
static struct option const longopts[] = { {"config", required_argument, NULL, 'C'}, {"defaultroute", required_argument, NULL, 'd'}, {"defaultroutenexthop", required_argument, NULL, 'n'}, {"debug", no_argument, NULL, 'D'}, {"verbose", no_argument, NULL, 'D'}, {"warningsfatal", no_argument, NULL, 'W'}, {"addall", no_argument, NULL, 'a'}, {"listroute", no_argument, NULL, 'r'}, {"liststart", no_argument, NULL, 's'}, {"varprefix", required_argument, NULL, 'P'}, {"ctlbase" , required_argument, NULL, 'c' }, {"search", no_argument, NULL, 'S'}, {"rootdir", required_argument, NULL, 'R'}, {"configsetup", no_argument, NULL, 'T'}, {"checkconfig", no_argument, NULL, 'K'}, {"help", no_argument, NULL, 'h'}, {0, 0, 0, 0} }; |
将ipsec服务启动过程中调用的命令保存到文件ipsec.log,然后查看与addconn相关的命令有如下几种:

挂上GDB学习下:

删除隧道重新加载配置文件:

查询状态信息:

添加隧道:


再次挂上GDB,直接使用以下命令添加隧道配置:
/usr/local/libexec/ipsec/addconn --defaultroute 192.168.1.13 --defaultroutenexthop 192.168.1.1 --addall --config /etc/ipsec.d/ipsec_vpn.conf3

运行后,停止在starter_permutate_conns函数中,打印conn信息如下:



starter_permutate_conns
根据添加的whack消息格式,修改配置文件,将隧道名字分别改为Tunnel-4/1x0, Tunnel-4/2x0,然后分别加载这两个配置:

添加后的结果如下:

但是无法删除两个连接,因此在pluto中可能认为这是两个不同的连接。so不是简单的通过隧道名字来实现多个保护子网的。

使用相同的隧道名添加两条隧道,发现会将第一次添加的隧道删除。因此也不是使用相同的隧道名添加多保护子网的。



但是属于不同的连接:

正确的结果应该是:





前两张图是正常的配置文件中多个保护子网是的whack msg消息:可以看出隧道名称分别有wm->name和wm->connalias两个名称,其中connalias是主隧道名称,而name则是多保护子网的子隧道名称。
因此尝试在配置文件中添加connalias字段(我也不知道有没有)

分别修改这两个配置文件、并加载配置:

三、 pluto中多保护子网实现(逆向分析)
在使用whack命令查询状态时可以看到有连接相关信息:
/usr/local/libexec/ipsec/whack --status

显示时连接的名字是经过快排(qsort)的,因此显示很整齐。而快排的比较标准是:隧道名+实例序号

从这里可以知道多保护子网实际上是同一个连接的多个实例化而已。

从这里可以

算了,pluto中的代码分析放弃了。
ipsec.conf配置文件多个保护子网解析流程的更多相关文章
- 解析.conf配置文件
解析.conf配置文件 解析.conf配置文件 解析.conf配置文件
- openswan一条隧道多保护子网配置
Author : Email : vip_13031075266@163.com Date : 2021.01.22 Copyright : 未经同意不得 ...
- Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件
Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...
- php.ini与php-fpm.conf配置文件的区别
php-fpm.conf是PHP-FPM特有的配置文件 php.ini是所以php模式中必须的配置文件 两者的区别是,php-fpm.conf是PHP-FPM进程管理器的配置文件,php.ini是PH ...
- ganglia-gmond.conf配置文件
运行下列命令可以生成gmond默认配置文件: User@host:$ gmond -t 配置文件由大括弧括起来的几个section组成.这些section可以粗略划分为两个逻辑分类.第一类中的sect ...
- Apache httpd.conf配置文件 2(Main server configuration)
### Section 2: 'Main' server configuration # # The directives in this section set up the values used ...
- Redis:redis.conf配置文件 - 及配置详解
配置文件详解(文章最后有完整的redis.conf文件) ################################### NETWORK ######################### ...
- Python-S13作业-day3-之编辑ha.conf配置文件
Python-S13作业-day3-之编辑ha.conf配置文件 需求: 让用户输入字符串类型的字典,实现对配置文件指定,backend www.oldboy.org下的内容进行 * 查询 * 增加 ...
- [原]生产环境下的nginx.conf配置文件(多虚拟主机)
[原]生产环境下的nginx.conf配置文件(多虚拟主机) 2013-12-27阅读110 评论0 我的生产环境下的nginx.conf配置文件,做了虚拟主机设置的,大家可以根据需求更改,下载即可在 ...
随机推荐
- Electron 开发音视频
废话不多说,咱直接进入正题! 创建 Electron 项目 前提条件 在使用Electron进行开发之前,需要安装 Node.js. 要检查 Node.js 是否正确安装,请在您的终端输入以下命令: ...
- 大数据开发-Go-新手常遇问题
真正在工作中用Go的时间不久,所以也作为新手,总结了一些常见的问题和坑 Go 中指针使用注意点 // 1.空指针反向引用不合法 package main func main() { var p *in ...
- golang 日志框架(zap)完整配置和使用
目录结构: logger.go文件: package log import ( rotatelogs "github.com/lestrrat-go/file-rotatelogs" ...
- Ubuntu系统Root用户无法登录
默认 系统 root 登录 图形界面,出现 登录失败.解决方法如下: 1,登录普通用户, 打开终端执行命令, 使用su root或sudo -i切换到root用户(必须) su root 按照提示输入 ...
- Layui-自定义函数及调用
控件 表格 时间范围 页面展示 场景 页面中选择开始时间和结束时间表格变化 使用 html代码 <div> <form class="layui-form" ac ...
- ad 差分布线 等长布线
差分要素: 1.原理图差分对名字后缀必须是 _n _p 2.规则改动 定义差分线宽和间距
- python的基础---常用的正则表达式
"""# 一.re 模块 1.作用:根据规则去匹配字符串 2.表达式:匹配字符串的规则 3.常用方法 findall():[掌握]匹配所有的字符串,把匹配结果作为一个列表 ...
- docker 镜像配置
Ubuntu14.04.Debian7Wheezy 对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址: DO ...
- C#根据输入的字符串来创建类的实例
abstract class Vehicle { public abstract void Drive(); } class Car : Vehicle { public override void ...
- C#设计模式---模板方法模式(Template Method Pattern)
一.目的 模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码. 二.定义 模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现. 模板方法使得子类在 ...
