使用openwrt搭建ipsec隧道

背景:最近同事遇到了个ipsec问题,做的ipsec特性,ftp下载ipv6性能只有100kb, 正面定位该问题也蛮久了,项目没有用openwrt, 不过用了开源组件strongswan, 加密算法这些也是内核自带的,想着开源的不太可能有问题,想着我帮他调试一下开源的,他继续正面定位。顺便学习一下怎么玩一下ipsec。ipsec和strongswanWan网上资料很多,这里我们不再做过多的介绍,我们主要先介绍一下针对同事的该问题,环境怎么搭建。

环境搭建:我们知道ipsec 主要是实现不同局域网网段之间的加密传输,实际对于现网用户的话需要服务器和客户端之间有公网ip,我们这里没有用公网ip也没有什么影响,环境top图如下:

ipsec编译:一开始想着能不能直接用opkg在线安装,发现安装之后会遇到各种各样的问题,解决一个又接着下一个,这条路暂时行不通。我们直接去编译一下带ipsec的openwrt的固件,遇到问题也好解决一点,这里我选择的lean大佬的openwrt源码,在国内我们玩openwrt的玩家基本都在用lean的代码,因为lean的代码适配了国内基本上常见的路由器固件,我们只需要make menuconfig开一下对应产品的宏就可以编译,非常简单上手。

我这里编译的路由器型号是gl.mt3000,lean帮忙我们适配了其它ipsec依赖的strongswan对应的宏,不需要我们去开,截图如下

我们可以看到lean的源码web界面适配了ipsec ikev1版本,不支持ikev2

我们可以需要自己去改一下ipsec的配置文件ipsec.conf就可以让客户端和服务端连接,配置文件内容如下:

复制代码
config setup

conn %default
        ikelifetime=28800
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev2
        
conn site_to_site
        left=192.168.250.40 #这里填当前路由器wan ip
        leftsubnet=192.168.1.0/24 #这里填当前路由器网段
        leftid=192.168.250.40 #这里填当前路由器wan ip
        leftauth=secret
        rightauth=secret
        right=192.168.250.94 #这里填对方路由器wan ip
        rightsubnet=192.168.10.0/24 #这里填对方路由器网段
        rightid=192.168.250.94 #这里填对方路由器wan ip
        ike=aes128-sha1-modp2048!
        esp=aes128-sha1!
        auto=start

ipsec.secrets配置psk,服务器和客户端psk要保存一致

复制代码
root@OpenWrt:/etc# cat  ipsec.secrets 
# /etc/ipsec.secrets - strongSwan IPsec secrets file
: PSK "1"
mw : XAUTH "1"

另外一台路由器我们也需要这样配置,就是上面ipsec.conf里面填写ip地址的地方需要和上面反过来就可以了。

我们都编辑好之后,如果之前ipsec进程已经运行了,我们可以用执行命令ipsec restarts,如果之前没有运行,我们需要执行ipsec start, 然后我们可以执行ipsec statusall查看当前的转态,我们可以看到有个connecting,说明正在连接中,如果up前面不是0,那么说明我们ipsec 已经连接上了。

我们配置好ipsec.conf后,发现死活连接不上,up前面一直是0,然后做了一个尝试,把配置文件里面的ipsec.conf里面的ikv2改成了ikv1发现连接上了,之前一直怀疑加密算法有问题,看来加密算法是没有问题,此刻阻塞了。刚好手机拍下了日志,把日志往群里发了一下,细心的群友看出了问题点。

openssl制作证书的时候需要,这里不知道为啥ikv1可以ikv2不行,可以找一下提示的这个函数openssl_plugin_create在哪里定义,安装试一下

然后我搜了一下这个函数是在哪个地方定义的,只需要我们去开一下对应的宏就行

然后重新编译了一下版本,发现连接上去了。

我们简单测试一下:发现只能ping通网关,2台路由器下面的lan侧设备不能互相ping通,之前怀疑策略路由有问题,命令如下

可是不管怎么去改策略路由还是不行,还在页面上去配置了静态路由器,之前在bibi看到过有说需要配置一下静态路由,只能病急乱投医,做了很多尝试还是不行。又继续查询资料,说的是关闭防火墙,因为之前我已经做过了一个尝试,就是只关闭一台路由器的防火墙,没有关闭另外一台路由器的,这次我尝试2台路由器都关闭了,竟然都ping通了。

关闭防火墙命令如下:

复制代码
etc/init.d/firewall stop

ipsec报文是加密的,我们抓包看一下,是否是这样的,用tcpdump抓了一下,然后报文没有加密,很疑惑,转念一想,不应该呀。可能是抓包点位的问题,我们tcpdump是在协议栈入口抓的,可能还没有经过ipsec加密的地方,然后我又抓了一下wan口的报文,这次对得上了。

我们用iperf3打流测试一下ipv4看一下性能怎么样,性能不是很高,只有20bps,不过规格说的是10bps, 也满足了要求。接下来我们看一下ipv6性能怎么样,直接ftp下载一下文件,速率和ipv4差不多,也是20bps左右。ipv6的配置文件如下:主要和ipv4的区别就是填写ipv4地址的地方都写ipv6的就行。

相关推荐
门思科技6 分钟前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
Brilliantwxx3 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
不怕犯错,就怕不做3 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
xiaobobo33304 小时前
c语言中for循环条件中定义临时栈变量的作用域
c语言·for循环条件定义栈变量·大括号作用域·独立栈变量
weixin_416667964 小时前
【无标题】
运维·服务器·网络
予昊4 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
一池秋_5 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发
惜离殇5 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
潘潘的嵌入式日记6 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机