在 IPv4/IPv6 双栈网络环境下配置基于 strongSwan 的 IPsec VPN

Update 2021-11-06: 1.strongswan.org 被墙了,功夫网威武。2.更正了同一用户使用不同终端登录时会挤掉已有的VPN连接的问题。

要爬墙为啥想不开要用VPN?代理服务器他不香吗?代理比VPN不知道高到哪里去了。用代理的话国内国外能分流,配置一般来说只要改一个配置文件就可以即开即用。用VPN的话,首先国内外分流就特别麻烦,不省VPS流量,访问国内网站或者想打个国服还得忍受延迟爆表;之后,VPN报文的特征那么明显;功夫网想墙掉是分分钟的事情;最后,VPN的配置起来比代理难多了,要配置个能用的VPN你要考虑好IP地址,还要改内核设置使得客户端连上VPN后正常爬墙。只为了爬墙用代理就能轻松爬,你为什么想不开要用VPN?

背景

在我这里ss和v2ray真的不香,所以我被迫捡起来了VPN的传统艺能。配好了IPsec VPN发现IPsec意外地香。同一台服务器上代理全部趴窝的时候,连上IPsec VPN看油管却能看4K@60fps的视频毫无中断问题。

虽然IPsec VPN确实爽了,但是还是有个地方很不如意:照以往经验配置出来的IPsec VPN只支持IPv4网络,不支持IPv6。在工信部大力推动IPv6部署的情况下,目前的VPN配置已经跟不上了时代的潮流,VPN只支持IPv4,IPv6的流量就仍然是直连的,没法走VPN翻过高墙。为啥要大力推进IPv6部署啊?不就是因为v6的墙建好了。 有双栈网络接入且只有IPv4的流量能走VPN的情况下,要访问一个被墙的网站,如果被墙的域名有AAAA的记录且客户端这里得到了正确的IPv6结果,又由于IPv6是直连的,收到来自功夫网的RST包警告便是必然的事情。

要解决这个问题有两种思路,第一种思路是关掉操作系统的IPv6支持。 不更改家庭网关设置的情况下,电脑上操作起来还是很容易的,windows和linux都能方便地关掉IPv6,只有v4地址也就不存在v6流量走不了VPN的问题了。但是手机上想全关掉IPv6的支持不容易,以Android为例,Android确实可以关掉4G网络的IPv6支持,选项藏的很深而已(Settings -> Connections -> Mobile networks -> Access Point Names -> 选择接入点 -> 把 APN Protocol 和 APN roaming protocol 都设成IPv4),但是碰到支持IPv6的wifi接入点怎么办呢?对不起,Android不支持。当wifi接入点的设置不是自己能控制的时候这就很难受。第二种思路,是在连上VPN的时候让VPN服务器给客户端分配一个能联网的IPv6地址。 这样IPv6的流量就也可以走VPN了,这也是本文要讨论的问题。

怎样用strongSwan搭建IPsec VPN的教程网上有很多。之前我是照 openSUSE wiki 上 MargueriteSu 大佬写的教程学会怎样配置的。推荐看一下,能学到许多东西。然而教程的完成日期已经是7年前了,一些情况和现在不一样。还有其它的教程,它们都告诉你需要去修改ipsec.confipsec.secrets这两个配置文件来配置VPN,且对IPv6的情况只字未提。在防火墙和配置证书的部分和现在的情况也不一样,例如MargueriteSu的教程里还在用SuSEFirewall2,可是openSUSE已经完全弃用了SuSEFirewall投奔firewalld;有的发行版,例如Ubuntu,预置的strongSwan包也是不带生成证书的功能的。找现成的教程无果,去翻了strongSwan项目的主页,我惊奇地发现strongSwan的示例里已经没有这两个文件了,它已经过时了,取而代之的是单个文件swanctl.conf。为了跟上潮流,遇到问题的时候能在官方处得到启发,当然也要用新的配置方式。怎样用新的配置文件配置VPN也是本文要讨论的话题。

目标

这里要达到的目标是:在VPS上配置一个通过IPv4和IPv6地址都能访问的IPsec VPN。通过这两种方式连接到VPN后,客户端都能同时获取到能联网的IPv4和IPv6地址。VPN服务端通过合法的证书来表明服务器的正确身份,客户端的认证协议采用EAP-MSCHAPv2。Windows自带的VPN客户端和Android的strongSwan APP都能连接上VPN服务器且能正常上网。

VPN服务器能给客户端分配能用的IPv6地址,IPv6流量不能走VPN的问题也就迎刃而解了。

环境

我的VPS用的linux发行版是openSUSE Tumbleweed。写文章的时候发行版预置的strongSwan版本是5.8.4。

既然我们要让VPN客户端获得IPv6地址,那么VPS有IPv6地址便是实践这篇文章所述事情的一个必要条件。VPS没IPv6地址,不能访问v6网络,那还怎么给客户端v6地址呢?另外,你的VPS获得的IPv6地址最好是/64的,并且支持SLAAC,也就是说后半部分64位的分配权在你手里,你的VPS可以在后面的64位后缀里任意选一个。这样我们给VPN客户端分配IPv6地址会更方便一些。如果不明白,可以向你的VPS运营商咨询,这些都是服务商需要给你解决的问题。

假如VPS服务商给你的IPv6地址是/128的,也就是你只拥有一个IPv6地址的分配权,那就不好玩了,必须得用NAT64这种没有办法的办法。这不在本文的讨论范围之内。

配置VPN连接

配置IPv4环境下的VPN服务器

在IPv4环境下配置VPN没什么好说的,网上的教程完全可以用来参考。这里也几乎就是把其它教程的意思重复一遍。最大的问题是如何把ipsec.confipsec.secrets转成swanctl.conf里面的语法格式。

安装软件

用zypper命令安装strongSwan:

zypper in strongswan

因为用的是suse,所以想要gui的话可以去YaST控制台的Software Management界面搜,具体过程不赘述。

配置服务端证书

之前说了,VPN服务端这边需要一个有效的证书来表明服务端的身份。

你有自己的域名的话,你可以把你手上的域名解析到你的vps上,然后向letsencrypt申请SSL证书。和架网站不一样,这里解析域名最好是IPv4和IPv6分开解析。例如把v4地址解析到gateway.your.domain,v6地址解析到gateway-v6.your.domain。理由不仅有方便区分,还有强国的IPv6路由配置比较奇葩,使用IPv6地址连接时很容易碰到延迟爆炸连线质量极差的情况。申请LetsEncrypt证书的环节我这里直接用了EFF提供的certbot脚本。

安装certbot:

zypper in python3-certbot

打开防火墙:

firewall-cmd --add-service http
firewall-cmd --add-service https
firewall-cmd --permanent --add-service http
firewall-cmd --permanent --add-service https

用Certbot申请证书:

certbot run --domain gateway.your.domain --domain gateway-v6.your.domain

证书申请成功的时候,脚本会告诉你申请过来的合法证书存放的位置,类似于这样:/etc/letsencrypt/live/gateway.your.domain/fullchain.pem。之后配置VPN连接的时候会用上。

因为letsencrypt证书只有三个月的有效期,所以我们需要有个systemd服务和定时器,用来定时检查letsencrypt证书是否过期。风滚草提供了一个包certbot-systemd-timer帮我们代劳,它会在/usr/lib/systemd/system目录下安装刚才说的服务和定时器,名字叫certbot-renew

zypper in certbot-systemd-timer

假如你用的是别的发行版,你可能需要自己写一个service和timer。service要做的事情很简单,就是调用一下/usr/bin/certbot renew命令,当然视发行版不同文件路径可能有变化。

解决证书问题,还有个途径是自建一套PKI体系。可以用strongSwan自带的pki功能也可以用OpenSSL,这不在本文的讨论范围内。用OpenSSL这里有篇文章可供参考:
https://jamielinux.com/docs/openssl-certificate-authority/index.html

配置VPN服务端

swanctl.conf

因为ipsec.confipsec.secrets被宣告为过时了,所以这里我们在swanctl.conf里面配置VPN连接。strongSwan wiki里有把设置从这两个文件迁移到swanctl.conf的教程。这里就照着wiki页面的内容把其他教程里的配置迁移了一下:

include conf.d/*.conf

connections {
    strongswan-win {
        version = 2
        rekey_time = 0

        local_addrs = 0.0.0.0
        send_certreq = no
        pools = ip_pool
        unique = never
        dpd_delay = 60s
        encap = yes

        proposals = aes256-sha384-modp1024,default

        local {
            auth = pubkey
            certs = fullchain.pem
        }

        remote {
            auth = eap-mschapv2
            eap_id = %any
        }

        children {
            net1 {
                local_ts = 0.0.0.0/0
            }
        }
    }
}

pools {
    ip_pool {
        addrs = 10.0.1.0/24
        dns = 208.67.222.222, 208.67.220.220
    }
}

secrets {
    private_1 {
        file = "privkey.pem"
        secret = ""
    }

    eap_1 {
        id_1 = fuckgfw
        secret = "makevpngreatagain"
    }
}

显然swanctl.conf分为三个部分,connectionspoolssecrets。其中,connections对应的是ipsec.conf里的内容;pools指定了要分配给VPN客户端的虚拟IP地址池的DNS服务器,这里定义了一个名叫ip_pool的IP池;secrets对应的是ipsec.secrets文件的内容,以private做前缀的项定义了VPN服务端要使用的服务端证书私钥,eap前缀的项定义了VPN连接要用到的用户名和密码,这里的例子里,用户名是fuckgfw密码是makevpngreatagain

再简单解释下connections栏里的内容:
version = 2: 使用IKEv2认证方法。
rekey_time = 0: 应对Windows内置的IPsec客户端的BUG,见MargueriteSu写的教程。
local_addrs = 0.0.0.0: VPN服务端要监听服务端所有可用的IP地址。
send_certreq = no: 是否要求客户端发送证书,这里我们要求客户端使用用户名密码验证,所以设为no。
pools = ip_pool: 使用名为ip_pool的地址池用来给VPN客户端分配地址。
unique = never: 永远不把已经登录的用户踢下线,即使新连接的VPN客户端发送了INITIAL_CONTACT报文。这项默认的设定值是”no”,也就是服务端只有收到INITIAL_CONTACT报文的时候才会把已建立连接的用户踢下来。但是不同客户端的行为会有差异,例如windows自带的VPN客户端不会发送这个报文,但是strongSwan for Android会发送,导致的结果就是你的Android手机登录VPN时,你电脑的VPN会断线。因此把这个值设成never。
dpd_delay = 60s: dpd的全称是dead peer detection,顾名思义是用来检测VPN客户端是否还在线。这里设定检测的时间间隔为一分钟。
encap = yes: 强制把ESP包封装至端口号为4500的的udp包中,无视VPN客户端是否在NAT后面,这可以避免IPsec ESP包被一些错误配置的骨干路由器丢掉。
proposals = aes256-sha384-modp1024,default: 指定IPsec连接使用的加密方式。前面的aes256-sha384-modp1024是为windows客户端量身定制的,这是windows支持的几种IPsec加密方式之一;后面的default是为其它类型的客户端(例如linux和Android)准备的。
local: 指定验证服务器身份的方式,这里设定的方式为服务器出示有效的证书,证书文件名叫fullchain.pem
remote: 指定客户端身份验证的方式,这里使用了eap-mschapv2。eap_id = %any表示secrets栏规定的任何EAP身份都有效.
children: 配置IPsec SA的行为,我的理解是这里控制了客户端连接上VPN服务器后的一些行为,例如能访问的网段。里面的local_ts就是控制这个的。

strongswan.conf

# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files

charon {
    load_modular = yes
    plugins {
        include strongswan.d/charon/*.conf
            duplicheck {
                enable = no
            }
    }
}

include strongswan.d/*.conf

这里只改了一个设置:duplicheck.enable = no,使得同一套用户凭证可以多终端在线。

启动strongSwan

把之前申请好的letsencrypt证书在swanctl目录下创建软链接,让strongSwan能找到这些证书:

mkdir /etc/swanctl/x509
mkdir /etc/swanctl/x509ca
mkdir /etc/swanctl/private
ln -s /etc/letsencrypt/live/gateway.your.domain/fullchain.pem /etc/swanctl/x509/fullchain.pem
ln -s /etc/letsencrypt/live/gateway.your.domain/chain.pem /etc/swanctl/x509ca/chain.pem
ln -s /etc/letsencrypt/live/gateway.your.domain/privkey.pem /etc/swanctl/private/privkey.pem

之后启动strongSwan:

systemctl enable strongswan
systemctl start strongswan

启动成功没有报错的情况下,可以输入命令swanctl --list-certs验证下服务器证书是否已经加载成功。
至此,strongSwan这边的配置完毕。

配置防火墙和系统内核设置

要让strongSwan VPN 能正常工作能爬墙,还需要改下防火墙和系统设置。
首先配置防火墙:

firewall-cmd --add-service ipsec
firewall-cmd --permanent --add-service ipsec
firewall-cmd --add-masquerade
firewall-cmd --permanent --add-masquerade

这里的含义是放行IPsec所需的500、4500端口以及ESP包,并且开启IPv4 NAT。

然后改内核设置,打开/etc/sysctl.conf加上以下几行:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.accept_ra = 2

第一行的意思是打开IPv4转发。第二行的意思是在开启转发状态下让linux能接受IPv6的RA(Router advertisement)消息,不加上这个选项你的VPS就不能获得IPv6地址了。原因是打开了转发,Linux会把自己认成路由器,然后自动禁用掉IPv6自动配置,把值设成2就是要让这两者共存。
最后重启下VPS或者输入sysctl -p,你的VPN服务器应该就可以正常工作了。

配置VPN客户端

假如之前配置服务器证书的时候你选择了自建PKI体系,那么如何给客户端系统添加根证书信任不在本文的讨论范围内。

Linux

Linux下的IPsec VPN客户端就是strongSwan本身,strongSwan项目开发了一个networkmanager图形界面的接口,可以通过图形界面方便地连接VPN。

在networkmanager的管理界面里新建一个IPsec/IKEv2(strongswan)类型的连接,按照下图里的方式配置就可以。需要注意的是,在图形界面里配置的时候自己得手动把服务器证书拉下来,然后在连接里指定。

Windows

Windows下用自带的IPsec VPN客户端。

添加VPN连接需要去网络和共享中心,选择添加新连接,弹出的向导里选择“连接到工作区”->“否,创建新连接”->“使用我的网络连接”->地址填上VPS的地址或者你的域名。

之后回到网络和共享中心,点“更改适配器设置”,找到刚才添加的VPN连接,右键属性,点“安全”选项卡,VPN类型选IKEv2,数据加密类型选”最大程度的加密”,认证方式选“EAP-MSCHAPv2”点确定。
连接VPN时,输入用户名密码fuckgfw/makevpngreatagain,连接成功后你就可以上谷歌看油管了。

Windows 10 最新版可能会有点小问题,连接的时候会提示你“IKE身份验证凭据不可接受”。原因是win10智障,不会顺着证书路径判断VPN证书是否有效(也可能仅仅LetsEncrypt会有这个问题,因为LetsEncrypt曾经换过CA)。解决办法是把VPN服务端的证书放在“受信任的根证书办法机构”里,具体位置需要打开certmgr.msc管理证书。吊诡的是,这样操作然后连接VPN成功以后,即使把添加到根证书的VPN证书删掉也能连接成功。

Android

Android本身内置了IPsec VPN的支持,但是我们配的认证类型Android是不支持的。不过strongSwan项目官方做了一个Android客户端。

别想了,国内的应用市场是不可能上架的。你能找到这个APP算我输。 所幸strongSwan官网有apk,地址是 https://download.strongswan.org/Android/ 自然我们要下载最新版。

打开APP,选”添加VPN”配置,服务器地址填上VPS地址或者域名,VPN类型选”IKEv2 EAP(用户名/密码)”。用户名密码填上fuckgfw/makevpngreatagain,点保存。最后连接新添加的VPN。

iOS 和 macOS

抱歉,我太穷了,买不起高贵的苹果设备。所以对应的客户端设置欠奉。

让IPsec VPN支持IPv6

假如你当前的网络环境只能获得IPv4地址,当你做完上面的事情之后,你应该就可以看油管刷推特了。但是你有IPv6的话,你现在还不能连接上正常的国际互联网。原因前面说了,IPv6的流量没法走IPv4的VPN。假如你不想舍弃掉IPv6网络,那么你就得想办法让VPN客户端得到一个能用的IPv6地址。或者假如你想在IPv4的网络环境下获得访问IPv6网络的能力,也可以照下面的内容做。

这里添加IPv6地址的方法,要感谢imbushuo大佬的鼎力支持。大概两年前我问过他怎样让openConnect VPN客户端得到IPv6地址的问题,他帮我解决了然后整理成了文章。相同的办法也可以套用到strongSwan VPN上。

给客户端分配IPv6地址

swanctl.conf里定义一个IPv6地址池,且让之前配置的VPN连接使用这个IPv6地址池。

connections {
    strongswan-win {
        ...
        pools = ip_pool, ip_pool6 # 让strongSwan在ip_pool6地址池里也挑个IPv6的IP分配给客户端
        ...
        children {
            net1 {
                local_ts = 0.0.0.0/0, ::/0 # 加上::/0允许VPN客户端可以访问IPv6网络
        }
    }
}

pools {
    ip_pool {
        addrs = 10.0.1.0/24
        dns = 208.67.222.222, 208.67.220.220
    }
    ip_pool6 {
        # 前64位是VPS服务商给你的IPv6前缀,后面可以随便写,但是如果你有其他VPN服务注意不要相互冲突
        # 这里给分配的IPv6地址池一共有2^24 - 2 = 16777214个IPv6地址,
        # 从200a:abcd:abcd:abcd:1234:1234:3400:1 到 200a:abcd:abcd:abcd:1234:1234:34ff:fffe。
        addrs = 200a:abcd:abcd:abcd:1234:1234:3400::/104 
        dns = 2620:119:35::35, 2620:119:53::53
    }
}

修改内核设置和防火墙

修改完swanctl.conf然后重启strongswan服务,再连VPN,你可以发现你已经有了一个IPv6地址了。但是访问 https://ipv6-test.com/ 测试IPv6连接时,网站还是提示你不能访问IPv6网络。不过这时候在命令行里ping你的VPS的IPv6地址是可以ping通的,traceroute的时候也是只有一条记录(VPN模式下你的VPS就是你的网关,所以应该不会有中间地址)。要让客户端能连上IPv6互联网,还需要一些善后的工作。

sysctl.conf里加上以下设置,打开对IPv6流量的转发和ND Proxy:

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

修改防火墙设置,让防火墙放行通过VPS转发的IPv6包:

firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -j ACCEPT

为了让连上VPN的客户端对外部可见,需要把连接VPN的客户端宣告为VPS的邻居,这样外部的有IPv6网络的机器才能通过VPS找到VPN客户端获得的IPv6地址(不知道我的理解对不对)。可以用下面的命令来完成:

ip -6 neigh add proxy <VPN客户端获得的IPv6 IP> dev <获得VPS IP的网卡名>

显然,连上VPN后为了获得能用的IPv6地址还要登上VPS输一条命令是一件麻烦的事。所以strongSwan和ocserv一样,也提供了客户端连接/断开连接时自动调用Shell脚本的功能。脚本的输出会一并输出到strongSwan的log里。strongSwan提供了一个脚本示例,用来展示默认情况下VPN服务端的行为和传入到脚本中的环境变量。仿照示例我写了个这样的脚本,当然是照官网给的实例剪掉了不需要的部分做出来的:

# define a minimum PATH environment in case it is not set
PATH="/sbin:/bin:/usr/sbin:/usr/bin:@sbindir@"
export PATH

# comment to disable logging VPN connections to syslog
VPN_LOGGING=1
#
# tag put in front of each log entry:
TAG=vpn
#
# syslog facility and priority used:
FAC_PRIO=local0.notice

case "$PLUTO_VERB:$1" in
up-client:)
    # connection to my client subnet coming up
    # If you are doing a custom version, firewall commands go here.
    echo "a client connected"
    echo "ip neigh add proxy $PLUTO_PEER_SOURCEIP dev ens3"
    ip neigh add proxy $PLUTO_PEER_SOURCEIP4_1 dev ens3
    ;;
down-client:)
    # connection to my client subnet going down
    # If you are doing a custom version, firewall commands go here.
    echo "a client disconnected"
    ip neigh delete proxy $PLUTO_PEER_SOURCEIP4_1 dev ens3
    ;;
up-client-v6:)
    # connection to my client subnet coming up
    # If you are doing a custom version, firewall commands go here.
    echo "a client connected v6"
    echo "ip -6 neigh add proxy $PLUTO_PEER_SOURCEIP6_1 dev ens3"
    ip -6 neigh add proxy $PLUTO_PEER_SOURCEIP6_1 dev ens3
    ;;
down-client-v6:)
    # connection to my client subnet going down
    # If you are doing a custom version, firewall commands go here.
    echo "a client disconnected v6"
    ip -6 neigh delete proxy $PLUTO_PEER_SOURCEIP6_1 dev ens3
    ;;
esac

写好了脚本,还需要在swanctl.conf里声明一下:

不要忘了给脚本加上可执行的权限!

connections {
    strongswan-win {
        ...
        children {
            net1 {
                local_ts = 0.0.0.0/0, ::/0
                updown = /etc/swanctl/strongswan-ip-neigh.sh
            }
        }
    }
}

最后重启下strongswan服务。

systemctl restart strongswan

对Windows的特别处理

现在,你可以用strongSwan的Android客户端连接下VPN,然后访问 https://ipv6-test.com/ 检测下试试看。网站应该会提示你你已经可以连接上IPv6网络了。并且网站提示你你的IPv6地址是swanctl.conf里设定的IPv6地址池里的地址。再尝试连接下 ipv6.google.com,应该也能正确显示网页。

Linux上的结果应该也是一样。

但是当你在windows下连接VPN时,VPN连接状态里的IPv6网络还是无网络访问权限。这是windows的问题,解决办法是对VPN适配器手工加一条到::/0的路由,让windows知道所有的IPv6连接都要走这个VPN。以管理员权限打开一个命令提示符窗口,输入命令:

netsh interface ipv6 add route ::/0 "<windows里你的VPN连接名>"

也登录下网站测试试试看,结果应该和Android/Linux是一样的。

让IPsec VPN连接在IPv6网络可用

VPN服务器在IPv6网络下的配置和IPv4下几乎一样。不同的是除了监听地址要变成”::”,还需要把encap = yes去掉。Linux和windows在IPv6网络环境下没法把ESP包封装进UDP协议里,加上这个选项windows会提示invalid payload received。

    strongswan-win-v6 {
        version = 2
        rekey_time = 0

        local_addrs = ::
        send_certreq = no
        pools = ip_pool, ip_pool6
        dpd_delay = 60s

        proposals = aes256-sha384-modp1024,default

        local {
            auth = pubkey
            certs = fullchain.pem
        }

        remote {
            auth = eap-mschapv2
            eap_id = %any
        }

        children {
            net1 {
                local_ts = 0.0.0.0/0, ::/0
                updown = /etc/swanctl/strongswan-ip-neigh.sh
            }
        }
    }

当然如果你就是看encap = yes这个选项不顺眼,也可以不给IPv6连接单独弄VPN配置。在原来的配置里把这个选项拿掉,然后local_addrs的值改成0.0.0.0, ::,这样也是可以的。

在纯IPv6网络环境下建立VPN连接,甚至可以让你的电脑获得访问IPv4网络的能力。

另外多说一嘴,strongSwan的Android客户端并不支持连接只有IPv6地址的IPsec VPN服务器。毕竟客户端在非Root环境下也能用,所以它建立VPN连接只能依赖把IPsec流量封装进UDP这个手段,无论系统本身是否能获得公网IP。众所周知linux下要发裸IP包是需要root权限的。然而linux在IPv6情况下不支持把IPsec怼进UDP里,所以就只好不支持了。见 https://wiki.strongswan.org/issues/892

排错

查看服务端日志能定位绝大部分的问题。

VPN配置文件出错时,使用systemd重启VPN服务会失败。这时候用systemctl status看状态能看到strongSwan解析配置文件解析到哪里出了错。

要在服务端跟踪VPN连接的日志,可以输入swanctl --log命令。有了日志了,报错了,然后怎么办?当然是用咕狗搜日志内容啦!

后记

在我“自力更生”在风滚草上成功搭上IPv6隧道之后,我又试了别的发行版。目前试验过的发行版有 openSUSE Leap 15.1 和 CentOS 8。相同配置下出现了和风滚草不太一样的情况,具体是为什么需要求助下。

情况是这样的:sysctl.conf里IPv4和IPv6的转发都打开、给VPN客户端的IPv6地址池也写上、但是ND Proxy的记录没有添加的情况下(就是最后的脚本做的事情),客户端获得的IPv6地址居然就已经可以联网了!只不过网站显示的IPv6 IP是VPS的而不是VPN客户端获得的。别的地方ping VPN客户端获得的IP也ping不通。加上了ND Proxy虽然能ping通了,在VPN客户端搭web服务器监听v6地址然后curl也能出结果,但是网站给出的IPv6 IP还是VPS的。

IPsec真的是深不可测的一个协议。 没准哪里就会碰到坑。这也是刚开始要吐槽的原因。

代理服务器不香吗!

参考资料

strongSwan 项目

大佬们的教程

声明:仅分享心得,不提供答疑服务。

One thought on “在 IPv4/IPv6 双栈网络环境下配置基于 strongSwan 的 IPsec VPN”

Leave a Reply

Your email address will not be published. Required fields are marked *