找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
glinet
查看: 3145|回复: 12

简单记录一下最近在 openwrt 使用 strongswan 配置 IPsec v_p_n 的一些心得。

[复制链接]
发表于 2025-5-26 10:31 | 显示全部楼层 |阅读模式
本帖最后由 sigporsson 于 2025-6-13 16:31 编辑

单位网关上有部署 IPsec v_p_n 和 SSL v_p_n,用专用客户端在终端上连接 SSL v_p_n 很方便。我懒,总想在家里路由器上部署 net to net。可我以前没在家用设备上搞过这个,就一直没折腾。
最近单位有个项目,用了不少5G工业网关,插sim卡后通过 ipsec v_p_n 和公司网关打洞。这玩意也是基于op二次开发的,基本折腾明白后,就开始给自己的路由器也折腾。

我先用旧的K2P A1 刷了官方的 ImmortalWrt 测试,搞了蛮久弄通了。期间参考了 charwrt 作者发在 B 站的视频,在此表示感谢。

我家里目前用的主路由是红米 AX6000,mtk7986的,刷了237大佬底包的别人编译的固件。但这个snapshot版本根本没办法安装kmod组件,用不了啊,最后只好自己编译。 现在将心得记录如下:


1、openwrt 22.03以后防火墙默认是nftables,不是 iptables,注意不要看错了教程。

2、strongswan 高一点的版本推荐使用 swanctl+基于路由的ipsec,使用viti接口。使用 stroke接口和基于策略的ipsec已经在高版本的op里面不推荐。

3、openwrt 至少需要下列组件 luci-app-strongswan-swanctl strongswan-default strongswan-mod-kdf strongswan-mod-gcm strongswan-mod-uci luci-proto-xfrm kmod-xfrm-interface kmod-nft-xfrm ip-full。最好按上述循序安装或编译进去,最好也编译或安装 tcpdump 抓包。如果想用基于策略的 ipsec,最好选中strongswan-full。

编译时,要先在 network--v_p_n 选中 strongswan 目录下的内容后,luci--application 目录下才会出现 luci-app-strongswan-swanctl。当然,luci-app-strongswan-swanctl 不是必须的,而且有不少bug和限制,但操作比较直观。

4、新建 xfrm接口及其镜像接口,配置如下:

config interface 'xfrm0'
option proto 'xfrm'
option delegate '0'
option ifid '123'    #这个ID后续要用。
option mtu '1438' #mtu可能需要调整,不行就改小。
option zone '
v_p_n'   #防火墙区域可以后面创建后再改。
option multicast 'true'


#config interface 'xfrm0_dummy'
#option proto 'static'
#option device '@xfrm0'
#list ipaddr '10.51.0.254/24' #非必须
#option delegate '0'




4、创建防火墙区域 v_p_n,允许 v_p_n 区域和 lan 区域之间的相互转发,配置如下:

config zone
option name '
v_p_n'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
option mtu_fix '1'
list network 'xfrm0'  #可待接口创建好再选择
#list network 'xfrm0_dummy'    #非必须

config forwarding
option src '
v_p_n'
option dest 'lan'


config forwarding
option src 'lan'
option dest '
v_p_n'




6、防火墙上开放外网访问udp500和udp4500端口。实测自带的规则Allow-ISAKMP和Allow-IPSec-ESP就能直接用,但数据传输似乎也没走4500端口,怪怪的。

config rule
option src 'wan'
option name 'Allow UDP500'
list proto 'udp'
option dest_port '500'
option target 'ACCEPT'
config rule
option src 'wan'
option name 'Allow UDP4500'
list proto 'udp'
option dest_port '4500'
option target 'ACCEPT'

7、编辑 /etc/config/ipsec 文件,这是 swanctl 默认的配置文件。swanctl 会由此生成类c结构的最终配置文件 /var/swanctl/swanctl.conf。

以下配置是基于xfrm接口、发起使用ikev2协议的net to net IPsec。注意两端的加密提议要匹配,也不要使用md5,des,3des,sha1,dh2等明显不安全的相关算法。

#ipsec段luci-app-strongswan-swanctl默认没有,要手工加入,charwrt默认有这段的ui界面。有用的是list interface,list zone和debug等级。
config ipsec
list interface 'wan'
#option vip_interface 'xfrm0'
option rtinstall_enabled '0'     #基于路由的ipsec不要安装路由,但改1好像也没添加路由。
option debug '1'     #0-4,数字越大debug信息越详细。
list zone '
v_p_n'
#list listen 'wan'

config tunnel 'home2factory'
list local_subnet '192.168.69.0/24'
list remote_subnet '0.0.0.0/0'
option if_id '123'    #数字要和相应的xfrm接口匹配
option startaction 'start'
option closeaction 'start'
list crypto_proposal 'p2'
option dpdaction 'start'
option rekeytime '3h'

config remote 'factory'
option enabled '1'
option gateway 'xxx.xxx.com'
list crypto_proposal 'p1'
list tunnel 'home2factory'
option authentication_method 'psk'
option local_identifier 'test456@Xxx'
option remote_identifier 'xxx'
option pre_shared_key 'test456@Xxx'
option fragmentation 'yes'
option keyingretries '3'
option dpddelay '30s'
option rekeytime '3h'
option keyexchange 'ikev2'

config crypto_proposal 'p1'
option encryption_algorithm 'aes256'
option hash_algorithm 'sha256'
option dh_group 'modp3072'
option prf_algorithm 'prfsha256'

config crypto_proposal 'p2'
option is_esp '1'
option encryption_algorithm 'aes256'
option hash_algorithm 'sha256'
option dh_group 'modp3072'

8、可由web或者命令启动swanctl。
/etc/init.d/swanctl start
swanctl --load-all

以上为发起端配置,验证方式为psk。使用 lucky 或 acme 申请的证书也能配通,但我觉得还有点问题,这里先不发了。

9、为对端子网添加静态路由,指向xfrm接口。


config route
option interface 'xfrm0'
option target '10.1.0.0/16'

#10、nftables表增加如下内容。这个新增防火墙区域后可以不用这么麻烦了,而且 reqid 也不一定只有1,可能有多条隧道。
#table ip nat {
        #chain postrouting {
                #type nat hook postrouting priority srcnat; policy accept;
                #oif "wan" ipsec out reqid 1 accept
                #oif "wan" masquerade
        #}
#}
#table ip filter {
        #chain forward {
                #type filter hook forward priority filter; policy drop;
                #iif br-lan oif "wan" accept
                #iif "wan" oif br-lan ct state established,related accept
                #iif "wan" oif br-lan ipsec in reqid 1 ct state new accept
        #}
#}

#或子网方式:
#table ip nat {
        #chain postrouting {
                #type nat hook postrouting priority srcnat; policy accept;
                #oif wan ip daddr 192.168.2.0/24 accept
                #oif wan masquerade
        #}
#}
#table ip filter {
        #chain forward {
                #type filter hook forward priority filter; policy drop;
                #iif br-lan oif eth1 accept
                #iif wan oif br-lan ct state established,related accept
                #iif wan oif br-lan ip saddr 192.168.2.0/24 ct state new accept
        #}
#}

11、可用 ip xfrm state 查看 xfrm 接口的状态,ip xfrm policy 查看 xfrm 接口的策略。

12、实测下来,这样的隧道虽然带宽不高,但看起来还比较稳定。我这里 zerotier 延迟很高,wireguard 和 tailscale 有时快得像本地有时又不通。

13、注意:mt7620的路由器在esp的hash算法选择 sha256 会造成协商失败,改用sha1或者md5正常,可能是bug或者芯片本身或驱动太老了。。。

Sun May 18 16:14:25 2025 daemon.info ipsec: 07[KNL] received netlink error: Requested AUTH_TRUNC algorithm not found (89)
Sun May 18 16:14:25 2025 daemon.info ipsec: 07[KNL] unable to add SAD entry with SPI c9737780 (FAILED)
Sun May 18 16:14:25 2025 daemon.info ipsec: 07[KNL] received netlink error: Requested AUTH_TRUNC algorithm not found (89)





只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
 楼主| 发表于 2025-5-26 10:31 | 显示全部楼层
有些配置的截图发不上来,提示帖子太大了。没关系,只要按照配置文件改了,网页上自然能看到。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

发表于 2025-5-26 12:36 | 显示全部楼层
我觉得wireguard+IPV6方案更方便

点评

这个主要是异地组网用的,华为思科的设备怎么用wireguard呢?  详情 回复 发表于 2025-5-26 14:21
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-26 14:21 | 显示全部楼层
雪糕先生 发表于 2025-5-26 12:36
我觉得wireguard+IPV6方案更方便

这个主要是异地组网用的,华为思科的设备怎么用wireguard呢?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

发表于 2025-5-27 23:47 | 显示全部楼层
手机上有啥客户端不

点评

配好了安卓和IOS直接支持。  详情 回复 发表于 2025-5-28 09:12
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-28 09:12 | 显示全部楼层
本帖最后由 sigporsson 于 2025-5-28 09:13 编辑
lovejoy 发表于 2025-5-27 23:47
手机上有啥客户端不

配好了安卓和IOS直接支持。
不过我上面的配置不能直接支持手机客户端,那个要麻烦一些,要用eap+认证或者证书。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-29 22:45 | 显示全部楼层
刚才用iperf打流测试了一下,以1楼的加密提议,200M带宽线路,隧道带宽大约能到160M左右,MT7986的CPU大概40%不到一点。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

发表于 2025-7-18 15:56 | 显示全部楼层
配好了安卓
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

发表于 2025-9-1 19:54 | 显示全部楼层
这是IKEV2的,我这实际环境用的IKEV1,改用V1方式需要修改哪些地方,配置过多次一直没成功

点评

你想配客户端还是服务器?我没实测过,我目前也没有ikev1的服务端。  详情 回复 发表于 2025-9-9 10:37
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-9 10:37 | 显示全部楼层
ipt 发表于 2025-9-1 19:54
这是IKEV2的,我这实际环境用的IKEV1,改用V1方式需要修改哪些地方,配置过多次一直没成功 ...

你想配客户端还是服务器?我没实测过,我目前也没有ikev1的服务端。

点评

ipt
用op当客户端。连接Ipsec服务器  详情 回复 发表于 2025-9-10 08:54
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

发表于 2025-9-10 08:54 | 显示全部楼层
sigporsson 发表于 2025-9-9 10:37
你想配客户端还是服务器?我没实测过,我目前也没有ikev1的服务端。

用op当客户端。连接Ipsec服务器
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

发表于 2025-9-11 08:22 | 显示全部楼层
本帖最后由 角色 于 2025-9-11 08:23 编辑

我HK的路由器用MikroTik IKEv2都挺好用的。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-22 15:21 | 显示全部楼层
本帖最后由 sigporsson 于 2025-9-22 16:19 编辑

现在补充一下匹配strongswan安卓app的配置方法,手头没有iphone,IOS测不了。


首先,strongswan安卓app基本都要使用eap的方式连接,推荐 eap-mschapv2 和 eap-tls。如果证书+用户名密码,那还要配置 radius 服务器,比较麻烦,不去折腾了。
注意,网页端无法配置 eap 相关认证,只能修改配置文件!


1、可以自己生成自签名证书或使用有效力的证书,自签名证书教程丰富,下面以 openwrt 上 lucky 自带的 acme 申请 let's encrypt 证书为例介绍。
2、证书申请及处理。

建议使用域名提供商的api密钥申请,这样不需要使用80端口。算法宜使用RSA,ECC的兼容性可能会差一点。


将公私钥文件映射出来。添加脚本路径,将公私钥和ca文件复制到strongswan指定的目录,并使用openssl导出p12格式的证书,/etc/swanctl/lucky_post-hook.sh 要755权限,代码如下:

#!/bin/sh
# 复制私钥至指定目录并设置权限。
cp /etc/swanctl/cert_lucky/xxx.xxx.xyz.key /etc/swanctl/private/xxx.xxx.xyz.key
cp /etc/swanctl/cert_lucky/xxx.xxx.xyz.crt /etc/swanctl/x509/xxx.xxx.xyz.crt
cp /etc/swanctl/cert_lucky/xxx.xxx.xyz_issuerCertificate.crt /etc/swanctl/x509ca/xxx.xxx.xyz_issuerCertificate.crt
chmod 600 /etc/swanctl/private/xxx.xxx.xyz.key
chmod 644 /etc/swanctl/x509/xxx.xxx.xyz.crt
chmod 644 /etc/swanctl/x509ca/xxx.xxx.xyz_issuerCertificate.crt


#导出p12格式的证书。注意,经过测试,在华为 mate40pro 手机上,只支持使用古老的 PBE-SHA1-RC2-40 算法对私钥和证书加密,openssl3.x 必须安装 libopenssl-legacy 库,用 -legacy 或显式指定算法。其他大部分较新的手机和电脑不需要使用附加参数。可以指定密码,最好用简单密码。这样,我们就每3个月获得一个新的p12证书文件,可以在客户端上安装。

openssl pkcs12 -keypbe PBE-SHA1-RC2-40 -certpbe PBE-SHA1-RC2-40 -export -in /etc/swanctl/cert_lucky/xxx.xxx.xyz.crt -inkey /etc/swanctl/cert_lucky/xxx.xxx.xyz.key -out /etc/swanctl/cert_lucky/xxx.xxx.xyz.p12 -name "xxx.xxx.xyz"

# 重启swanctl,使新的证书生效。
/etc/init.d/swanctl restart
#swanctl --reload-settings

其他方式申请的证书可以参照上面的方法调整。

3、配置 /etc/swanctl/swanctl.conf。

# Section defining IKE connection configurations.
connections {
   home-eapeapmschapv2 {
      include ./common.conf
      remote-eapmschapv2 {
         auth = eap-mschapv2
         eap_id = %any
      }
   }
   home-eaptls {
      include ./common.conf
      remote-eaptls {
         auth = eap-tls
         certs = xxx.xxx.xyz.crt
      }
   }
}
pools {
    vip {
        addrs = 10.100.1.0/24
# dns = 8.8.8.8
    }
}
secrets {
   eap-remoteuser {
      id = user001
      secret = Test123@home
   }
}
# Include config snippets
include conf.d/*.conf
include /var/swanctl/swanctl.conf

上面的代码有一句 include ./common.conf。我们将相同的内容写到 common.conf 进行嵌套,精简 swanctl.conf 的结构,内容参考如下:

      local_addrs = %any
      remote_addrs = %any
      fragmentation = yes
      local {
         auth = pubkey
         certs = xxx.xxx.xyz.crt
         id = xxx.xxx.xyz
      }
      children {
        home {
          local_ts = 10.10.0.0/24
          remote_ts = 0.0.0.0/0
          if_id_in = 201
          if_id_out = 201
          start_action = none
          #esp_proposals = aes256-sha256-modp3072,aes256-sha1-modp2048,aes128gcm128-x25519
          esp_proposals = aes256gcm128-x25519
          life_time = 198m
          rekey_time = 3h
         }
      }
      version = 2
      pools = vip
      unique = never
      mobike = yes
      dpd_delay = 30s
      keyingtries = 3
      send_certreq = yes
      send_cert = always
      proposals = aes256gcm128-prfsha256-x25519

4、客户端配置。
1、windows 默认不支持现代一点的加密套件,需要手工开,要用到 powershell 或者第三方工具,可参考strongswan和微软官方文档。
https://docs.strongswan.org/docs/5.9/interop/windowsClients.html
2、安卓手机,MSCHAPv2可使用系统自带的 IKEv2/IPSec MSCHAPv2(新版的不一定有)或strongswan app连接。
eap-tls 方式,需要先安装之前准备好的p12证书。mate40pro系统自带的 IKEv2/IPSec RSA 连不上,但 strongswan app 可以。
strongswan app 里面,virtual** 类型 IKEv2 EAP(用户名/密码)就是 EAP-MSChapV2,而 virtual** 类型 IKEv2 EAP-TLS(证书)就是我们配置的 eap-tls。

客户端会获得vip pool 里面的ip地址。











只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2025-12-5 13:24

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表