如何在openbsd中开启ipsec

如何在openbsd中开启ipsec,第1张

1.OpenBGPD,也就是开源的BGP Daemon。在OpenBSD中,BGPD一旦启动,会自动扩展成3个进程,其作用分别是父进程,处理会话进程和负责路由计算进程。其中父进程以root方式运行,而其他进程则不是。

从上图中,可以看到,父进程负责与对端路由器通信,并查询更新路由表,处理会话进程SE负责处理路由器间的通讯,对路由表的更新,是先进入RDE,也就是路由判定引擎,作用是将过滤过的路由表计算信息,放入RIB,也就是路由信息表,由bgpctl做计算后返回给SE进程,再返回给RDE和父进程,并向父进程发送更新路由表的请求,父进程通知SE进程将更新的路由表发送给相邻路由器。

2.OpenOSPFD

OSPF在系统进程上的处理与BGP相似

在处理过程上与BGP相同。唯一不同的是,OSPF是以泛洪的形式进行更新通告。

六、基本配置

要做路由转发,最基本要实现IP转发,所以,要在sysctl.conf中加入如下定义

net.inet.ip.forwarding=1

另外,还需要在hostname.em0和hostname.em1中配置正确的IP和子网掩码。

1.OpenBGPD

# 全局配置

AS 123

#相当于在思科路由器#router bgp 123

router-id 192.168.1.1

#相当于bgp router-id 192.168.1.1

# 声明IP空间

network 192.168.1/24

#邻居设置

neighbor 192.168.2.1 {

descr "ISP A"

remote-as 124

}

neighbor 192.168.3.1 {

descr "ISP B"

remote-as 125

#对端密码

tcp md5sig password "74#senEjTYmhQ/f"

}

然后编辑/etc/rc.conf,找到bgpd_flags=NO改为bgpd_flags="",同时为了下面配置ospfd,将ospfd_flags=NO改为ospfd_flags="",保存退出并重启。

重启后用#bgpctl show 查看BGPD的状态和邻居情况,是不是很简单,也很直观。这里设置了两个邻居,remote-as分别是124和125。

#这是我虚拟机上查询bgp的结果

#bgpctl show

Neighbor ASMsgRcvdMsgSentOutQ Up/DownState/PrfRcvd

10.2.1.16502300 0 NeverActive

template for local p000 0 NeverTemplate

upstream2 6500400 0 NeverActive

upstream6500300 0 NeverActive

peering AS 65042000 0 NeverActive

peering AS 65042000 0 NeverActive

AS 65001 peer 2 6500200 0 NeverActive

AS 65001 peer 1 6500200 0 NeverActive

2.OpenOSPFD

# 全局配置

router-id 0.0.0.2

#允许路由重分发

redistribute connected

#区域,area,这个学过Cisco应该不难明白

area 0.0.0.0 {

auth-type crypt

auth-md 1 "L&Y6)@Vc(6I4=Gq"

auth-md 2 "IsJ_-LE:al17a"

auth-md-keyid 1

# 主链路

interface em1 { metric 10 }

# 备份链路

interface em0 { metric 100 }

}

本机的编号为0.0.0.2,区域为0.0.0.0,使用两个网卡连接对端,作为主备。我们看到,em1的距离是10,而em0的距离是100,要注意,OSPF最大管理距离支持到110。作为最短路径协议,一定是优先使用metric数较小的,除非链路断掉。

如何,是不是并不比Cisco的配置复杂?其实用好了,还是非常轻松的,另外,OpenBSD使用pf,可以在网络层进行过滤,允许或拒绝来自其他地方的数据包,安全性非常有保障。另外,OpenBSD原生支持Vlan,IPSec,Tunnel,carp,和trunk(链路聚合,相当于Linux的bonding或FreeBSD中的netgraph)。

pf是OpenBSD中的一个包控工具,叫做packet filter吧,可以对OSPF和BGP的数据包进行过滤,也可以对其他的tcp/ip连接进行过滤,是个很强大的防火墙软件,一台OpenBSD可以兼任路由器和防火墙的全部功用,比起动辄上万的设备,OpenBSD不超过3000就可以完成全部事情,且不比那些设备做的差,是不是很诱人呢?

转载

流程路径:ip_rcv() -->ip_rcv_finish() -->ip_local_deliver() --> ip_local_deliver_finish()

解封侧一定是ip报文的目的端,ip_rcv_finish中查到的路由肯定是本机路由(RTCF_LOCAL),调用 ip_local_deliver 处理。

下面是贴的网上的一张图片。

ip_local_deliver_finish中 根据上次协议类型,调用对应的处理函数。inet_protos 中挂载了各类协议的 *** 作集,对于AH或者ESP来说,是xfrm4_rcv,对于ipsec nat-t情况下,是udp协议的处理函数udp_rcv,内部才是封装的ipsec报文(AH或者ESP)。

xfrm4_rcv -->xfrm4_rcv_spi -->xfrm4_rcv_encap -->xfrm_input

最终调用 xfrm_input 做收包解封装流程。

1、创建SKB的安全路径;

2、解析报文,获取daddr、spi,加上协议类型(esp、ah等),就可以查询到SA了,这些是SA的key,下面列出了一组linux ipsec的state(sa)和policy,方便一眼就能看到关键信息;

3、调用SA对应协议类型的input函数,解包,并返回更上层的协议类型,type可为esp,ah,ipcomp等。对应的处理函数esp_input、ah_input等;

4、解码完成后,再根据ipsec的模式做解封处理,常用的有隧道模式和传输模式。对应xfrm4_mode_tunnel_input 和 xfrm4_transport_inout,处理都比较简单,隧道模式去掉外层头,传输模式只是设置一些skb的数据。

5、协议类型可以多层封装,如ESP+AH,所以需要再次解析内存协议,如果还是AH、ESP、COMP,则解析新的spi,返回2,查询新的SA处理报文。

6、经过上面流程处理,漏出了用户数据报文(IP报文),根据ipsec模式:

流程路径如下图,这里以转发流程为例,本机发送的包主要流程类似。

转发流程:

ip_forward 函数中调用xfrm4_route_forward,这个函数:

1、解析用户报文,查找对应的Ipsec policy(__xfrm_policy_lookup);

2、再根据policy的模版tmpl查找对应最优的SA(xfrm_tmpl_resolve),模版的内容以及和SA的对应关系见上面贴出的ip xfrm命令显示;

3、最后根据SA生成安全路由,挂载再skb的dst上; 一条用户流可以声明多个安全策略(policy),所以会对应多个SA,每个SA处理会生成一个安全路由项struct dst_entry结构(xfrm_resolve_and_create_bundle),这些安全路由项通过 child 指针链接为一个链表,其成员 output挂载了不同安全协议的处理函数,这样就可以对数据包进行连续的处理,比如先压缩,再ESP封装,再AH封装。

安全路由链的最后一个路由项一定是普通IP路由项,因为最终报文都得走普通路由转发出去,如果是隧道模式,在tunnel output封装完完成ip头后还会再查一次路由挂载到安全路由链的最后一个。

注: SA安全联盟是IPsec的基础,也是IPsec的本质。 SA是通信对等体间对某些要素的约定,例如使用哪种协议、协议的 *** 作模式、加密算法、特定流中保护数据的共享密钥以及SA的生存周期等。

然后,经过FORWARD点后,调用ip_forward_finish()-->dst_output,最终调用skb_dst(skb)->output(skb),此时挂载的xfrm4_output

本机发送流程简单记录一下,和转发流程殊途同归:

查询安全路由: ip_queue_xmit -->ip_route_output_flow -->__xfrm_lookup

封装发送:ip_queue_xmit -->ip_local_out -->dst_output -->xfrm4_output

注:

1). 无论转发还是本地发送,在查询安全路由之前都会查一次普通路由,如果查不到,报文丢弃,但这条路由不一定需要指向真实的下一跳的出接口,只要能匹配到报文DIP即可,如配置一跳其它接口的defualt。

2). strongswan是一款用的比较多的ipsec开源软件,协商完成后可以看到其创建了220 table,经常有人问里面的路由有啥用、为什么有时有有时无。这里做个测试记录: 1、220中貌似只有在tunnel模式且感兴趣流是本机发起(本机配置感兴趣流IP地址)的时候才会配置感兴趣流相关的路由,路由指定了source;2、不配置也没有关系,如1)中所说,只要存在感兴趣流的路由即可,只不过ping的时候需要指定source,否者可能匹配不到感兴趣流。所以感觉220这个表一是为了保证

ipsec封装发送流程:

xfrm4_output-->xfrm4_output_finish-->xfrm_output-->xfrm_output2-->xfrm_output_resume-->xfrm_output_one

xfrm4_output 函数先过POSTROUTING点,在封装之前可以先做SNAT。后面则调用xfrm_output_resume-->xfrm_output_one 做IPSEC封装最终走普通路由走IP发送。

贴一些网上的几张数据结构图

1、安全路由

2、策略相关协议处理结构

3、状态相关协议处理结构

计算机管理—服务和应用程序—服务,找到IPSEC Services ,双击打开,设启动方式为自动。

IPSEC是一种用来保护内部网、专用网络以及外部网(Internet、Extranet)免遭攻击的重要防御方法,主要特征在于它可对所有IP级的通信进行加密和认证,正是这一点才使IPSEC可以确保包括远程登录、客户/服务器、电子邮件、文件传输及Web访问在内的多种应用程序的安全。由于企业级政府用户非常注重于部署安全的IP,所以这一服务显得很重要。同时也可以看到,对于绝大多数用户来说,这是个根本就不用关心的东西。所以禁用它吧。

ipsec services服务无法启动的问题解决方法:

1、打开注册表,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Fips. .确认"Start"的值为1,如果不是的话将其改为1重启!

2、ipsec加密安全驱动导致无法启动服务的,用下面reg导入后重启!

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent]

"Type"=dword:00000020

"Start"=dword:00000002

"ErrorControl"=dword:00000001

"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\

74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6c,\

00,73,00,61,00,73,00,73,00,2e,00,65,00,78,00,65,00,00,00

"DisplayName"="IPSEC Services"

"DependOnService"=hex(7):52,00,50,00,43,00,53,00,53,00,00,00,54,00,63,00,70,00,\

69,00,70,00,00,00,49,00,50,00,53,00,65,00,63,00,00,00,00,00

"DependOnGroup"=hex(7):00,00

"ObjectName"="LocalSystem"

"Description"="管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。"

"PolstoreDllRegisterVersion"=dword:00000002

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent\Security]

"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\

00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\

00,00,02,00,60,00,04,00,00,00,00,00,14,00,8d,00,02,00,01,01,00,00,00,00,00,\

05,0b,00,00,00,00,00,18,00,9d,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,\

23,02,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,20,\

02,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,05,12,00,00,00,01,01,\

00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent\Enum]

"0"="Root\\LEGACY_POLICYAGENT\\0000"

"Count"=dword:00000001

"NextInstance"=dword:00000001


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11417925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存