惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

Razeen`s Blog

Let's Encrypt 推出 Gen Y 根证书架构:揭示 Web PKI 的五大未来趋势 通过 Wi-Fi 自动备份你的 iPhone 到 Nas 管理培训感悟:从技术视角看管理之路 UPS 一拖多:保护你的 NAS 和 Linux 服务器 从影音中心到 AI 助手:我的50款 Homelab 服务清单 从SSL证书有效期将缩短到47天聊开去 部署一个自己的 Running Page 谈谈特斯拉 Model Y 用车一年的感受和费用分析 弃用 Disqus 评论,使用自建 Waline 使用 Prometheus 和 Grafana 搭建你的证书监控面板 服务器迁移记:一次磁盘换板引发的Linux分区与挂载的学习 改善信息来源, 利用 RSS 高效获取资讯 (RSShub + Reeder5 + WeWe RSS) 多种 Docker 镜像拉取解决方案与实践 App分享 | AppCleaner - Mac上的卸载神器 Azure OpenAI API 申请和使用 如何开通 OneKey 虚拟信用卡,并充值消费 如何拥有一个可长期在国内使用的国外手机号码 分享开通 ChatGPT Plus 过程 如何开通 Depay 虚拟信用卡,并充值消费 如何开通欧易Web3钱包, 交易入账 如何5分钟内1块钱注册 ChatGPT 科学上网 如何注册美区的 Apple ID (2023年/无需科学上网) NAS折腾记(11): NASTool3.0体验和降级 NAS折腾记(10): Docker版本的NASTool配置 NAS折腾记(9): NASTool与微信交互,微信发送消息远程下载电影【多图】 NAS折腾记(8):群晖安装 NASTool 实现影音半自动化【多图】 内网穿透(2):Tailscale 组网实现内网穿透,操作简单,无成本 内网穿透(1):总结了11中内网穿透的方式,总有一种适合你 NAS折腾记(7):从零开始设置(黑)群晖系统 NAS折腾记(6):黑群晖系统安装好后怎么洗白? NAS折腾记(5):群晖硬盘休眠设置与分析 NAS折腾记(4): 20分钟手把手带你完美安装 DS918+ 黑群晖7.1.1 NAS折腾记(3):NAS 装机 NAS折腾记(2):B360-ITX 双M.2 双2.5G网口 6 SATA主版 开箱 NAS折腾记(1):328元的4盘位Nas机箱开箱 Openwrt + Clash 全局科学上网 Newifi3 刷入 OpenWrt 固件 v21.02 利用 Markdown 画一些流程图、时序图、甘特图等 Homelab(8): 搭建自用 Gitlab 与 Docker 仓库 Nginx Tcp 转发保留客户端真实 IP (PROXY Protocol) Homelab (7):IPSec VPN(基于证书认证)客户端设置 Homelab (5): DDNS 动态域名解析 Homelab (4): Linux 服务器基础环境准备 Homelab (3): 整体网络与基础硬件介绍 Go学习笔记(十)老项目迁移 go module 大型灾难记录 Github Actions 初体验之自动化部署 Hexo 博客 记一次 Nginx DNS 缓存导致转发问题 Homelab (2): 电信悦me网关修改桥接模式,路由器拨号 Homelab (1):5分钟上手黑群晖 NAS 终极 Bash 脚本指南 Typora 自动上传图片到七牛云 Ubuntu 20.04 LTS 有线网卡驱动安装 折腾 Ubuntu 20.04 LTS 开发环境 Go学习笔记(九) 计时器的生命周期[译] 利用 git hook 规范你的代码与 commit message 规范 git commit message 与自动化版本控制 超详细 vim 配置 (with MacVim) Golang 中的 RESTful API 最佳实践 折腾服务器(开篇) 我的第一台个人服务器 Newifi3 实现低成本家庭级科学上网 Go学习笔记(八) | 使用 os/exec 执行命令 如何用 Go 调用 Windows API Mac OS 自动根据 WI-FI 名字改变网络位置 关于 Docker 清理 MIME Types 速查表 Go学习笔记(七) | 理解OAuth 2.0并实现一个客户端 我又又又把博客迁移了 Go学习笔记(六) | 使用swaggo自动生成Restful API文档 Go学习笔记(五) | 使用代码片段(snippets)提高编码效率 书单 - 2018 IPFS 初体验,利用 IPFS 托管你的静态网站 记一次 PostgreSQL LIKE 索引优化,联合字段 LIKE 查询优化。 Disqus 添加有趣的 Reactions 的功能 TLS 1.3 详解 (RFC 8446解读) gRPC在Go中的使用(三)gRPC实现TLS加密通信与流模式 gRPC在Go中的使用(二)gRPC实现简单通讯 gRPC在Go中的使用(一)Protocol Buffers语法与相关使用 CentOS 安装 tshark 抓包工具 Go学习笔记(四) | win上使用VSCode搭建Go开发环境 日常 Postgres 数据库点滴记录 简单了解 PKCS 规范 美食篇 | DIY戚风蛋糕(烤箱做蛋糕) Go学习笔记(三) | 怎么写Go基准测试(性能测试) TLS1.3正式更新,为Nginx添加TLS1.3的支持 一次诡异的数据库删除 GitHub Pages自定义域名开启HTTPS 证书透明度是什么?它是怎么工作的? Go学习笔记(二) | 我对 recover 的一点误解 搭建证书透明度(certificate-transparency)日志服务之从入门到放弃 修复远程登陆 Centos 时,出现 UTF-8 Warning HTTPS篇之SSL握手过程详解 Go学习笔记(一) | postgres与golang点点滴滴 AWS 命令行界面(aws-cli)从安装到快速上手 数字证书分类及怎么区分各类数字证书 常用 linux 命令小结(一)文件目录操作 云服务器搭建 hexo 博客,git hooks自动更新 SSH 免密登陆, SSH Config 配置 Golang CGO Mac 交叉编译 Windows 使用 goose 让数据库迁移更加轻松
Homelab (6): 基于自签发证书的 IPSec VPN 搭建
2021-08-30 · via Razeen`s Blog

为了保证安全的同时,在外网也能便利访问家里的服务,同时又能减少转发带来流量,VPN绝对是最佳的选择。这里我就用StrongSwan 搭建一个基于证书认证的IPSec VPN

IPsec 是什么?StrongSwan又是什么?

IPsec 全称 Internet Protocol Security, 即互联网安全协议,是一个协议包,包含了AH、ESP、IKE/IKEv2这些协议,其作用是通过加密和认证保证端到端的IP数据传输的安全。当前,IPsec协议主要就是用于VPN

StrongSwan 是一个跨平台的开源项目,Linux 上实现了 IPsec功能,所以我们这里用它来搭建。

想要详细了解其细节,推荐阅读:

准备工作

1. Linux 系统

我的系统是 CentOS 7.

$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ uname -a
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

2. 域名 & 域名解析

如我的域名 vpn.razeencheng.com, 解析已OK。

vpn.razeencheng.com. 600 IN A 192.168.100.53

3. 准备自签发证书

由于是搭建基于自签发证书认证的,我们需要提前准备好需要的自签发证书,这里我们需要:

  • 自建根证书
  • VPN 的服务证书(自建根签发的)
  • VPN 的客户端证书(自建根签发的)

我这里推荐使用 KeyManager 生成,这是我司开发的一款离线证书管理软件,可以在这里下载

软件安装好后,打开如下,设计一个密码就可以进入了(密码别忘了哦,除了用恢复密钥外没有办法恢复的)。

首先我们来生成一张根证书。进入软件后,点击“创建测试证书”, 然后将表单往下拉,我们可以看到有一个 “创建根证书” 按钮,点击。 然后我们需要为自己的更起个“霸气”的名字。点击“高级设置”,我们可以选择算法等,这里我就都用默认,只把有效期改长一点,给个480月吧,最后滚动到最下面,点击“创建根证书“即可完成根证书创建。

如下,成功后我们可以看到根证书的详细信息。

接下来,我们用这张根签发一张服务器证书。再次点击“创建测试证书”,如下图所示,证书类型选择“服务器证书”,写上自己将要使用的VPN 域名,有效期也可以改长点。最重要的是,“证书签发者” 选刚刚创建的这张证书,最后点击“创建证书”。

继续,我们再签发一张客户端证书,其他操作和上面一样,除了“证书类型”选择客户端证书外。

这样,我们在"所有证书"中,就能看到我们生成的客户端和服务器证书,点击对应证书的“更多”,选择“导出证书”, 客户端证书我们选择pfx格式(需要设置一个密码),服务端证书,选择“Nginx”,点击导出。 然后在“CA证书”栏中同样操作,选择Nginx,导出刚刚的根证书。

如下图所示,这样我们的证书全部准备就绪了,我们需要的就是:

  • 根证书公钥(图中 Razeen Test Root 2021_chain.crt)
  • 客户端证书公私钥(图中 razeencheng-s-vpn-iis-0910233719.pfx)
  • 服务端的证书共私钥 (图中 vpn.razeencheng.com_chain.crt 和 vpn.razeencheng.com_key.key)

开始安装

1. 安装 EPEL 源,安装 strongswan。

$ yum -y install epel-release
$ yum -y install strongswan

安装好后,strongswan 的目录为/etc/strongswan/

2. 将证书放到对应的位置。

  • 根证书放到 /etc/strongswan/ipsec.d/cacerts 下;
  • 服务器证书公钥放到 /etc/strongswan/ipsec.d/certs下:
  • 服务器证书私钥放到 /etc/strongswan/ipsec.d/private下。

放好后,目录结构如下:

image-20210911000918195

3. 配置 Strongswan

我们到 /etc/strongswan 目录,把原来的默认配置文件备份下。

$ cd /etc/strongswan
$ mv ipsec.conf ipsec.conf.bak

我们创建一个新的ipsec.conf

$ vim ipsec.conf

粘贴下面的配置。

config setup
      charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2,  mgr 2"
        # strictcrlpolicy=yes
        # uniqueids = no

conn %default
    keyexchange=ikev2
    ike=aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024!
    esp=aes128gcm16-ecp256,aes256gcm16-ecp384,aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024,aes128gcm16,aes256gcm16,aes128-sha256,aes128-sha1,aes256-sha384,aes256-sha256,aes256-sha1!
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftsubnet=0.0.0.0/0
    leftcert=vpn.razeencheng.com_chain.crt
    right=%any
    rightdns=192.168.1.1,114.114.114.114
    rightsourceip=192.168.252.0/24
    rightca="C=CN, CN=Razeen Test Root 2021"


conn IPSec-IKEv2
    keyexchange=ikev2
    auto=add

conn IPSec-IKEv2-EAP
    also="IPSec-IKEv2"
    rightauth=eap-mschapv2
    rightauthby2=pubkey
    rightsendcert=never
    eap_identity=%any

conn CiscoIPSec
    keyexchange=ikev1
    forceencaps=yes
    authby=xauthrsasig
    xauth=server
    auto=add

这里你需要修改的是:

  • leftcert=vpn.razeencheng.com_chain.crt 这里 left 我们可以理解为VPN服务端这边,这里指定我们的服务端证书的名字(上面我们放到 /etc/strongswan/ipsec.d/certs 文件夹下的)。

  • rightdns=192.168.1.1,114.114.114.114 这里 right 可以理解为VPN的客户端那边,指定客户端连接后使用的DNS,可以逗号分隔指多个。

  • rightsourceip=192.168.200.0/24 这里指VPN客户端端连接后分配的子网。

  • rightca="C=CN, CN=Razeen Test Root 2021" 对客户端证书的CA Subject 限制,这里改成你的CA证书对应的。可用openssl快速查看, Subject: 后面的内容复制上来即可。

    $ openssl x509 -in ipsec.d/cacerts/Razeen\ Test\ Root\ 2021_chain.crt -text | grep "Subject:"
            Subject: C=CN, CN=Razeen Test Root 2021
    

如果需要理解配置中其他参数的含义,可以看官方的 wiki - IpsecConf

4. 配置私钥和账户密码

编辑ipsec.secrets文件,例如:

: RSA vpn.razeencheng.com_key.key
testuser : EAP "test1234"
testuser2 : EAP "test5678"

这里:

  • : RSA vpn.razeencheng.com_key.key 指定我们的服务端的私钥文件名字(上面我们放到 /etc/strongswan/ipsec.d/private文件夹下的);
  • testuser : EAP "test1234" 就是我们的账号密码了。这里我加了两个用户 testusertestuser2 , 密码分别为test1234test5678

想了解更多配置含义,可以看 wiki - IpsecSecrets

5. 启动 strongswan

# 启动
systemctl start strongswan
# 设置开启启动
systemctl enable strongswan

6. 设置防火墙

# 添加 AH ESP 协议
firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="esp" accept'
firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="ah" accept'

# 添加 IPsec 服务端口和服务
firewall-cmd --zone=public --permanent --add-port=500/udp
firewall-cmd --zone=public --permanent --add-port=4500/udp
firewall-cmd --zone=public --permanent --add-service="ipsec"

# 允许 NET 地址伪装并重载
firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --reload

7. 允许端口转发

编辑 /etc/sysctl.conf文件,允许端口转发。

# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

目前我们只设置了ipv4的。允许下面命令重载。

$ sysctl -p

重启 strongswan。

$ systemctl restart strongswan

到这里我们的安装过程就结束了。

连接测试

当然,连接之前你还有域名别忘你解析到你的主机上。。

最后经过测试,连接正常。而客户端的配置过程,稍微有点复杂,而且在配置 macOS Big Sur 过程中还遇到一些坑,关于这些详细内容,请看我的下一篇文章

image-20210911165041716