当前位置: 首页 > news >正文

【20】Strongswan sa ——IKE_SA set_state|process_message|

ike_sa_t:IKE_SA 包含与对等体连接相关的密码信息。它通过task manager和itasks管理多个 IPsec CHILD_SA。该对象包含如下:
(1)get_id 获取ike_sa_id_t 对象,该对象标识一个IKE_SA,包含发起方和响应方的SPI(国标是cookie),以及ike主版本,是否发起方等。
(2)get_version 获取ike版本1 ikev1 2 ikev2(国标是 ikev1)。
(3)get_unique_id 获取唯一定义此IKE_SA的数字 ID (国标无)。
(4)set_state/get_state 管理ike状态机状态:

/*** IKE_SA在其生命周期内会传递各种状态。新创建的 SA 处于 CREATED 状态。* +----------------+¦   SA_CREATED   ¦+----------------+¦on initiate()--->    ¦   <----- on IKE_SA_INIT receivedV+----------------+¦ SA_CONNECTING  ¦+----------------+¦¦   <----- on IKE_AUTH successfully completedV+----------------+¦ SA_ESTABLISHED ¦-------------------------+ <-- on rekeying+----------------+                         ¦¦                                  Von delete()--->      ¦   <----- on IKE_SA        +-------------+¦          delete request   ¦ SA_REKEYING ¦¦          received         +-------------+V                                  ¦+----------------+                         ¦¦  SA_DELETING   ¦<------------------------+ <-- after rekeying+----------------+¦¦   <----- after delete() acknowledged¦\V/X/ \*/
enum ike_sa_state_t {//IKE_SA 刚刚创建,但尚未启动或响应。IKE_CREATED,//IKE_SA主动或被动启动IKE_CONNECTING,//IKE_SA 已完全建立IKE_ESTABLISHED,//IKE_SA 在外部进行管理,不处理消息?IKE_PASSIVE,//IKE_SA 正在进行的重新协商IKE_REKEYING,//IKE_SA已重新生成密钥(或冗余)IKE_REKEYED,//IKE_SA 正在删除IKE_DELETING,//IKE_SA对象被销毁IKE_DESTROYING,
};

a.传入的state设置到private_ike_sa_t的state。
b.若是IKE_ESTABLISHED,并且上一个状态为IKE_CONNECTING(发起方)或IKE_PASSIVE(响应方),记录IKE_ESTABLISHED的时间戳,以用于生命周期管理,更新状态机STAT_REKEY、STAT_REAUTH、STAT_DELETE的调度。

//获取配置的rekey重新协商时间,如果设置了且STAT_REKEY状态的时间戳为0,即还没有设置下一次REKEY的时间及调度job
//或者STAT_ESTABLISHED+t小于已有的应该rekey时间,需要更新STAT_REKEY以便于更早及时的rekey。
//STAT_REAUTH类似。
t = this->peer_cfg->get_rekey_time(this->peer_cfg, TRUE);
if (t && (this->stats[STAT_REKEY] == 0 ||(this->stats[STAT_REKEY] > t + this->stats[STAT_ESTABLISHED])))
{this->stats[STAT_REKEY] = t + this->stats[STAT_ESTABLISHED];job = (job_t*)rekey_ike_sa_job_create(this->ike_sa_id, FALSE);lib->scheduler->schedule_job(lib->scheduler, job, t);DBG1(DBG_IKE, "scheduling rekeying in %ds", t);
}
t = this->peer_cfg->get_reauth_time(this->peer_cfg, TRUE);
if (t && (this->stats[STAT_REAUTH] == 0 ||(this->stats[STAT_REAUTH] > t + this->stats[STAT_ESTABLISHED])))
{this->stats[STAT_REAUTH] = t + this->stats[STAT_ESTABLISHED];job = (job_t*)rekey_ike_sa_job_create(this->ike_sa_id, TRUE);lib->scheduler->schedule_job(lib->scheduler, job, t);DBG1(DBG_IKE, "scheduling reauthentication in %ds", t);
}
else if (this->stats[STAT_REAUTH])	/*this->stats[STAT_REAUTH] <= t + this->stats[STAT_ESTABLISHED]  这次函数调用之前,已经向process添加过job*/
{t = this->stats[STAT_REAUTH] - this->stats[STAT_ESTABLISHED];DBG1(DBG_IKE, "reauthentication already scheduled in %ds", t);
}//解决什么时间删除ike_sa: maximum IKE_SA lifetime -> t
//t: Delay before deleting a rekeying/reauthenticating SA
t = this->peer_cfg->get_over_time(this->peer_cfg);
if (this->stats[STAT_REKEY] || this->stats[STAT_REAUTH])
{//STAT_DELETE时间戳(到此时删除)取REKEY、REAUTH中的最小者,要是与rekeying/reauthenticating错开,不是应该用max?if (this->stats[STAT_REAUTH] == 0){this->stats[STAT_DELETE] = this->stats[STAT_REKEY];}else if (this->stats[STAT_REKEY] == 0){this->stats[STAT_DELETE] = this->stats[STAT_REAUTH];}else{this->stats[STAT_DELETE] = min(this->stats[STAT_REKEY],this->stats[STAT_REAUTH]);}//t=配置的删除重新生成密钥/重新验证 SA 之前的延迟 + (stats[STAT_REKEY]-stats[STAT_ESTABLISHED])this->stats[STAT_DELETE] += t;t = this->stats[STAT_DELETE] - this->stats[STAT_ESTABLISHED];//到时间(t时间后)执行删除ike_sa的jobjob = (job_t*)delete_ike_sa_job_create(this->ike_sa_id, TRUE);lib->scheduler->schedule_job(lib->scheduler, job, t);DBG1(DBG_IKE, "maximum IKE_SA lifetime %ds", t);
}

c.对方支持的话发送DPD
d.若上一个状态为IKE_PASSIVE ?,则send_keepalive发送心跳

(5) get_name 连接的名字?
(6)get_statistic/set_statistic ike状态统计信息
(7)get_my_host/set_my_host/get_other_host/set_other_host 主机信息操作
(8)float_ports 4500端口


process_message:
(1)被动状态下不处理消息。
(2)ike版本不对应不处理消息。
(2)task_manager->process_message

相关文章:

  • AI时代的泛安全新范式:Kaamel安全智能体解决方案
  • 使用VHDL语言实现TXT文件的读写操作
  • QT中栅格模式探索
  • MySQL触发器和函数的详细示例
  • 2025年MathorCup数学应用挑战赛【选题分析】
  • 国产品牌芯洲科技100V降压芯片系列
  • Linux中find和grep的区别
  • vue3学习笔记之属性绑定
  • Qt文件操作
  • docker.desktop下安装普罗米修斯prometheus、grafana并看服务器信息
  • github 项目迁移到 gitee
  • Jsp技术入门指南【六】jsp脚本原理及隐式对象
  • 15.4K Star!Vercel官方出品,零基础构建企业级AI聊天机器人
  • YAFFS2 的页缓存机制原理及配置优化方法详解
  • deepseek的transformer模块和旋转位置编码
  • 从零到上线!AI生成SpringBoot项目脚手架实战(含K8s+Docker配置)
  • 【C++】入门基础【上】
  • 《软件设计师》复习笔记(12.2)——成本管理、配置管理
  • 大语言模型智能体:安全挑战与应对之道
  • 韩媒专访CertiK创始人顾荣辉:黑客攻击激增300%,安全优先的破局之路
  • 收藏家尤伦斯辞世,曾是中国当代艺术的推手与收藏者
  • 大悦城:去年净亏损29.77亿元,三年累计亏损超70亿元
  • 女子伸腿阻止高铁关门等待同行人员,相关部门已介入调查
  • 中华民族共同体体验馆第二期在北京开展,上海体验区展现人民城市与民族团结交融之美
  • 世卫成员国就《大流行病协议》达成一致,首次演练应对气候诱发的病毒危机
  • 圆桌|并购重组迎政策红利期,并购基金如何把握发展机遇?