VPN – ntzyz's blog https://archive.ntzyz.io Mon, 18 Sep 2017 12:19:47 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.8 使用 PPTP 和 IPv6 Tunnel Broker 访问 IPv6 资源 https://archive.ntzyz.io/2016/09/24/access-ipv6-resources-with-pptp-and-he-tunnel/ https://archive.ntzyz.io/2016/09/24/access-ipv6-resources-with-pptp-and-he-tunnel/#respond Sat, 24 Sep 2016 07:51:27 +0000 https://blog.ntzyz.io/?p=711 继续阅读使用 PPTP 和 IPv6 Tunnel Broker 访问 IPv6 资源]]> p.indent { text-indent: 2em; }

这几天一直折腾没啥意义的IPv6,首先是看到了 @蔓舞寻樱 dalao 的文章:利用代理隧道接入HE.net的IPv6网,就顺便在阿里云的学生优惠服务器上尝试部署了一下,拿到了前缀 2001:470:36:a90,前缀长度为 64 的 IPv6 地址池,就是这个速度实在是比较尴尬 _(:3」∠)_,从青岛阿里云到江苏教育网的 MTR 输出大致这样 (╯-_-)╯╧╧

                             My traceroute  [v0.85]
ntzyz-aliyun (::)                                      Sat Sep 24 14:46:35 2016
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                       Packets               Pings
 Host                                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. zhangyuze320602-1.tunnel.tserv25  0.0%    10  408.3 408.8 408.1 410.3   0.5
 2. 10ge1-6.core1.sin1.he.net         0.0%    10  400.0 405.3 399.7 409.9   4.5
 3. 10ge1-16.core1.hkg1.he.net        0.0%    10  432.5 438.2 432.0 464.2   9.7
 4. 100ge10-1.core1.tyo1.he.net       0.0%    10  484.9 488.1 484.5 494.7   4.0
 5. 10ge1-13.core1.lax2.he.net        0.0%    10  584.6 590.1 583.7 600.6   6.2
 6. cngi-bjix-as-ap-as23911.10gigabi 77.8%    10  587.2 587.2 587.2 587.3   0.0
 7. 2001:252:0:302::1                 0.0%    10  731.0 730.9 730.4 731.2   0.0
 8. 2001:252:0:100::1                88.9%    10  729.8 729.8 729.8 729.8   0.0
 9. 2001:252:0:1::1                  11.1%    10  729.7 729.5 729.2 730.0   0.0
10. 2001:da8:1:1006::2               11.1%    10  736.0 734.4 731.6 739.2   2.4
11. 2001:da8:257:0:101:4:19:11        0.0%    10  727.7 738.3 727.7 776.6  16.0
12. 2001:da8:257:0:101:4:1:5          0.0%    10  727.4 727.9 727.4 728.6   0.0
13. 2001:da8:257:0:101:4:1:2          0.0%    10  736.9 736.5 732.0 739.8   2.4
14. ???
15. 2001:da8:257:0:101:4:67:e         0.0%     8  756.8 758.2 756.8 766.4   3.2
16. 2001:da8:257:0:101:4:67:1        12.5%     8  762.1 762.4 761.9 763.5   0.4
17. 2001:da8:1:504::2                 0.0%     8  768.0 766.4 765.0 768.2   1.1
18. cernet2.net                      12.5%     8  767.5 768.0 767.5 768.5   0.0
19. 2001:da8:1008:500::2              0.0%     7  767.0 767.2 766.7 767.8   0.0
20. 2001:da8:1008:20::1              16.7%     7  788.4 774.2 770.0 788.4   7.9
21. 2001:da8:1008:1030:bdd2:aba0:a20  0.0%     7  816.3 791.0 770.0 831.8  26.6

不过再怎么说也算是有了自己的 IPv6 地址了(这延迟这速度能用?)。但是这手里有这么多 IPv6 地址不搞点什么也真是太浪费了,所以想到的问题就是,有没有什么简单的办法,能让任意设备接入这个隧道?

首先想到的是使用 sit 隧道,直接借助 6in4 实现这个功能,但是实际上这个隧道在很多时候不可用(比如防火墙不允许 6in4 流量),同时两端的 IPv4 地址必须指定,不是很灵活(虽然几个脚本就能解决但是我懒),遂放弃 sit 隧道。

再然后想到的就是虚拟专用网络了,VPN 可以通过互联网传递内网信息,因为可以通过这项技术来加密流量并改变出口,VPN 也被大范围的拿来用作科学上网的工具。此处我只是需要试验一下这个思路是否可行,所以只搭建了简单而并不算安全的 PPTP VPN。我使用的服务器安装的系统为 Ubuntu 14.04.5 LTS,其他发行版操作也是类似的。首先安装 pptpd

sudo apt install -y pptpd

安装完成后,修改几个配置文件,印象里要编辑的就是 /etc/ppp/chap-secrets, /etc/ppp/pptpd-options 和 /etc/pptpd.conf,这些在网上都有大量的教程,我就不赘述了(其实还是懒)。通常的安装步骤都需要编辑 /etc/sysctl.conf 来启用 IPv4 Forward 功能并编辑 iptables 的 NAT 表,来实现转发 IPv4 数据包的功能,但是我并不打算用这个隧道走 IPv4 流量,这些步骤就可以忽略不看了。

配置完成后,就可以在 Windows 下的网络和控制中心中创建一个新的 VPN 连接来测试一下,协议类型选择 PPTP,身份验证选 MS-CHAPv2。创建完成后连接,如果没有其他问题就能成功联通,获得了一个 IPv4 地址(同时你会发现你上不了网了2333)。如果出现其他问题,可以参照 /var/log/syslog 和 Windows 下的错误代码,面向 Google 进行调试。

下面就是如何让这个 PPTP 支持 IPv6 了。首先,我们要修改一下 /etc/ppp/pptpd-options,在文件最后添加一些内容:

cat >> /etc/ppp/pptpd-options << EOF
ipparam pptpd
ipv6 ,
EOF

然后就是安装 radvd (Linux IPv6 Router Advertisement Daemon):

sudo apt install -y radvd

完成后,你需要创建一个脚本,他们会在每个 ppp 连接建立之后运行,来完成 IPv6 相关的设置。首先是 /etc/ppp/ipv6-up.d/radvd,你需要将其中的 IPv6 地址(2001:470:35:a90)换成你自己的地址:

#!/bin/sh
if test $PPP_IPPRARM != pptpd ;then
        exit 0
fi

ADDR=$(echo $PPP_REMOTE | cut -d : -f 3,4,5,6)

if test x$ADDR == x ; then
        echo "Unable to generate IPv6 Address"
        exit 0
fi
ADDR=2001:470:35:a90:$ADDR

#add route
route -6 add $ADDR/128 dev $PPP_IFACE

#generate radvd config
RAP=/etc/ppp/ipv6-radvd/$PPP_IFACE
RA=$RAP.conf

cat <$RA
interface $PPP_IFACE{
        AdvManagedFlag off;
        AdvOtherConfigFlag on;
        AdvSendAdvert on;
        MinRtrAdvInterval 5;
        MaxRtrAdvInterval 100;
        UnicastOnly on;
        AdvSourceLLAddress on;
        prefix 2001:470:35:a90::/64 {};
};
EOF

#start radvd
/usr/sbin/radvd -C $RA -p $RAP.pid

#start tchdpd
/usr/sbin/tdhcpd \
 --dns-server=2001:470:20::2 \
 --dns-name=$PPP_IFACE.tunnel.ipv6.icybear.net \
 --pid-file=$RAP.dhcp.pid \
 --local-id=tunnel.ipv6.icybear.net -L debug\
 $PPP_IFACE

#update dns
ARPA=$(ipv6_rev $ADDR)
nsupdate << EOF
update delete $ARPA
update add $ARPA 10 ptr $PPP_IFACE.tunnel.ipv6.icybear.net
send
update delete $PPP_IFACE.tunnel.ipv6.icybear.net
update add $PPP_IFACE.tunnel.ipv6.icybear.net 10 aaaa $ADDR
send
EOF

exit 0

再然后是 /etc/ppp/ipv6-down.d/radvd:

#!/bin/sh

RAP=/etc/ppp/ipv6-radvd/$PPP_IFACE

kill `cat $RAP.pid` || true
kill `cat $RAP.dhcp.pid` || true

rm -f $RAP.*

ADDR=$(echo $PPP_REMOTE | cut -d : -f 3,4,5,6)
ADDR=2001:470:35:a90:$ADDR
ARPA=$(ipv6_rev $ADDR)

nsupdate << EOF
update delete $ARPA
send
update delete $PPP_IFACE.tunnel.ipv6.icybear.net
send
EOF

exit 0

最后,给他们可执行权限并重启 pptpd:

chmod +x /etc/ppp/ipv6-*.d/radvd
systemctl restart pptpd.service

不出意外的话,再进行 PPTP 连接后,你就可以获得一个 IPv6 地址啦但是他真的非常慢(废话)

完成这个 IPv6 Over PPTP 后,我开始有些奇怪的想法:由于阿里云的 IPv6 地址池是走的 sit 隧道,速度非常慢,同时 Linode 机房可是有原生的 IPv6 支持的,所以如果先开一个 ticket 给自己的 Linode 搞到一个 V6 地址池,并把这个 PPTP 放到 Linode 上,会不会好很多呢?(望天)于是我准备试一下,但是装 PPTP 的时候出现了问题:

Setting up pptpd (1.4.0-7ubuntu0.1) ...
Job for systemd-modules-load.service failed because the control process exited with error code. See "systemctl status systemd-modules-load.service" and "journalctl -xe" for details.
dpkg: error processing package pptpd (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 pptpd
E: Sub-process /usr/bin/dpkg returned an error code (1)

查了一下似乎是 Ubuntu 的新 Bug(掀桌)。既然是 bug 那么想必过一段时间就会修复。其实在 Linode 上跑 PPTP 是一件十分不安全的事儿(GFW is watching you)搞不好自己的服务器就被搞了那还玩个什么鬼,所以觉得是时候用 OpenVPN 代替 PPTP,使用 OpenVPN over Shadowsocks 来获得一个 IPv6 地址,但是似乎吃力不讨好啊……

所以还是勉强接受了这个国内的 PPTP 隧道了(躺地

]]>
https://archive.ntzyz.io/2016/09/24/access-ipv6-resources-with-pptp-and-he-tunnel/feed/ 0
IKEv2 on Windows Server 2012R2 https://archive.ntzyz.io/2016/04/22/ikev2-on-windows-server-2012r2/ https://archive.ntzyz.io/2016/04/22/ikev2-on-windows-server-2012r2/#respond Thu, 21 Apr 2016 16:01:04 +0000 https://blog.dimension.moe/?p=422 继续阅读IKEv2 on Windows Server 2012R2]]> .indent {text-indent: 2em;margin-top: 0.75em; margin-bottom: 0.75em;}

本文简单介绍了 Windows Server 平台上 IKEv2 VPN 的搭建,与 Windows/Linux 设备的访问。

在 Windows Server 上建立 PPTP VPN 服务

首先,通过远程桌面连接访问作为 VPN 服务器的 Windows Server,打开「服务器管理器」,点击「管理」菜单中的「添加与删除角色」,在「服务器角色」中,勾选「远程访问」。


继续向导,出现远程访问角色配置时,勾选「DirectAccess 和 VPN」。

DirectAccess-and-VPN-RAS

如果有其余选项,保持默认即可。随后就可以开始添加角色了。

完成之后,通知会提示 DirectAccess 和 VPN 需要配置,这里我们选择「仅 VPN」。

Deploy-VPN

随后打开「路由和远程访问」。该管理控制台可以在开始菜单的「管理工具」,或是「服务器管理器」中找到。

右击左侧的服务器名,点击「配置路由和远程访问」,在弹出的向导中,选择「自定义配置」,并勾选「远程访问(拨号或 VPN)」。

Custom-VPN-Configuration
VPN-Access

完成向导,如果有其他选项保持默认。这样我们就搭建好了一个最简单的 VPN 服务器。下面需要配置用户账户,以允许远程访问。

打开「计算机管理」,展开左侧「系统工具」中的「本地用户和组」,点击「用户」,右击右侧你想允许远程登录的用户账户,单击「属性」,在「拨入」选项卡中的网络访问权限里,选择「允许访问」。

如果需要为 VPN 连接分配静态地址池,你需要在「路由和远程访问」里打开服务器属性,在「IPv4」选项卡中,配置「IPv4 地址分配」。

通过以上步骤,你已经建立起一个简单可用的 VPN 服务器,你可以使用其他设备,配置一个 PPTP 协议的 VPN 连接,来测试是否可用。

使用 IKEv2 来代替 PPTP 作为 VPN 协议

与 PPTP/L2TP 相比,IKEv2 具有很多优点,详细的描述可以看这里:浅谈网络安全和 IKEV2 协议

IKEv2 需要一组证书来完成服务端与客户端之间的认证和加密。此外,按照连接方式,IKEv2 可能还需要连接发起方提供其他认证凭据。

由于窝死活摆不平微软爸爸的证书颁发角色,我选择了使用 strongSwan 提供的 ipsec pki 指令来生成证书。当然,使用 openssl 也是没有问题的。首先是生成一张 CA 证书,并签名。其中 C、O、CN 仅供参考:

ipsec pki --gen --outform pem > ca.pem
ipsec pki --self --in ca.pem --dn "C=CN, O=myvpn, CN=VPN CA" --ca --outform pem >ca.cert.pem

继续准备一份服务器证书。其中 CN 是 VPN 服务器的 IP 或域名,错误的 CN 将会导致连接被终止。该证书将被安装至 VPN 服务器:

ipsec pki --gen --outform pem > server.pem
ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=myvpn, CN=123.123.123.123" --san="123.123.123.123" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem

如法炮制一份客户端证书,它将被安装到 VPN 客户端,即连接的发起方:

ipsec pki --gen --outform pem > client.pem
ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=myvpn, CN=VPN Client" --outform pem > client.cert.pem

将服务端证书与客户端证书转化为 p12 格式,就可以安装到 Windows 设备上了。以客户端证书为例:

openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "VPN CA"  -out client.cert.p12

这样我们就将得到一份加密信息拓展文件。安装证书步骤如下:

  开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
  「文件」-「添加/删除管理单元」,添加「证书」单元
  证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
  在左边的「控制台根节点」下选择「证书」-「个人」,然后选右边的「更多操作」-「所有任务」-「导入」打开证书导入窗口。
  选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步「证书存储」选「个人」。
  导入成功后,把导入的 CA 证书剪切到「受信任的根证书颁发机构」的证书文件夹里面。
  打开剩下的那个私人证书,看一下有没有显示「您有一个与该证书对应的私钥」,以及「证书路径」下面是不是显示「该证书没有问题」。
  然后关闭 mmc,提示「将控制台设置存入控制台1吗」,选「否」即可。

完成证书的导入后,就可以使用 IKEv2 作为 VPN 协议进行远程访问了。

在 Linux 下远程登录到 VPN 服务器

Linux 环境下的拨入有两个实现的思路:使用 PPTP 协议或者使用 IKEv2 协议。

使用 PPTP 应该是不难的,很多 Linux 发行版的网络设置内就可以创建 PPTP 协议的连接,即使没有也可以用 pptpsetup 或是手写 peers 文件,然后用 pon 指令连接。然而因为 PPTP 本身的缺陷,有时候会遇到各种各样的问题导致无法使用,这时就可以转而使用 IKEv2。

可以说 Linux 最强大的 IPsec 实现就是 strongSwan 了,我们就将使用这个软件来进行 IKEv2 的拨入。首先你需要下载并解压 strongSwan 的源码:

wget https://download.strongswan.org/strongswan-5.4.0.tar.gz
tar xzvf strongswan-5.4.0.tar.gz && cd strongswan-5.4.0

配置软件并编译:

./configure --prefix=/usr \
    --sbindir=/usr/bin \
    --sysconfdir=/etc \
    --libexecdir=/usr/lib \
    --with-ipsecdir=/usr/lib/strongswan \
    --enable-md4 \
    --enable-sqlite \
    --enable-openssl --enable-curl \
    --enable-sql --enable-attr-sql \
    --enable-farp --enable-dhcp \
    --enable-eap-sim --enable-eap-sim-file --enable-eap-simaka-pseudonym \
    --enable-eap-simaka-reauth --enable-eap-identity --enable-eap-md5 \
    --enable-eap-gtc --enable-eap-aka --enable-eap-aka-3gpp2 \
    --enable-eap-mschapv2 --enable-eap-radius --enable-xauth-eap \
    --enable-ha --enable-vici --enable-swanctl --enable-systemd --enable-ext-auth \
    --disable-mysql --disable-ldap -enable-cmd --enable-forecast --enable-connmark \
    --enable-aesni --enable-eap-ttls --enable-radattr --enable-xauth-pam --enable-xauth-noauth \
    --enable-eap-dynamic --enable-eap-peap --enable-eap-tls --enable-chapoly --enable-unity \
    --with-capabilities=libcap
make -j4 && sudo make install

一个比较坑的地方是,虽然 Arch Linux 的 AUR Script 内启用了 EAP-MSCHAPV2,但是这个认证依赖于 md4,而这个特性并没有被启用,所以导致了无法使用 MSCHAPv2 进行身份验证。

完成安装后,就需要将可爱的证书们和客户端私钥配置好具体步骤:

    1. 将根证书复制到 /etc/ipsec.d/cacerts/ 目录下
    2. 将 CA 颁发的客户端证书复制到 /etc/ipsec.d/certs/
    3. 将 CA 颁发的客户端证书的私钥复制到 /etc/ipsec.d/private/

修改 /etc/ipsec.conf,添加一个 connection,我的配置是添加了一个叫 pv 的连接,你需要修改后面的 eap_identity, right 和 rightid 为自己的选项,rightsubnet 填写分配的静态地址网段:

# ipsec.conf - strongSwan IPsec configuration file

conn %default
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!
    
conn pv
    left=%any
    leftfirewall=yes
    leftauth=eap-mschapv2
    leftsourceip=%config
    eap_identity=Administrator
    right=zh.ali.dimension.moe
    rightauth=pubkey
    rightid="C=CN, O=NTZYZ, CN=zh.ali.dimension.moe"
    rightsubnet=172.16.8.0/24
    auto=add

编辑 /etc/ipsec.secrets,内容为 EAP 身份验证时使用的凭据和私钥文件名:

# either of these two lines depending on leftauth above
: RSA 
 %any : EAP ""

这样我们就完成了基本的配置。连接到 VPN 只需要很简单的输入以下指令:

ipsec start
ipsec up pv

如果没有异常,命令执行完后的输出大致如图:

ipsec-up-pv

其他的一些维护

虽然 IKEv2 具有很多优点,但是还是有时会遭不住国内这样糟糕的互联网环境而被断开(但是比那个 PPTP 不知道高到哪里去了)

最简单的解决方案就是使用任务计划,Linux 下可以使用 crontab,Windows 则可以使用计算机管理提供的任务计划。对于 Linux,我们可以配置以下命令每两小时执行一次:

ipsec up pv

对于 Windows,我们可以准备这样的命令:

rasdial "VPN Connection"

参考链接:

1. HOW TO INSTALL VPN ON WINDOWS SERVER 2012 R2 | Thomas Maurer
2. UBUNTU、CENTOS搭建IPSEC/IKEV2 VPN服务器全攻略
3. 使用 Strongswan 架设 Ipsec VPN
4. strongSwan – Arch Wiki
5. AUR (en) – strongswan – Arch Linux

]]>
https://archive.ntzyz.io/2016/04/22/ikev2-on-windows-server-2012r2/feed/ 0
IKEv2搭建成就Get https://archive.ntzyz.io/2015/09/03/great-success-on-hosting-an-ikev2-vpn/ https://archive.ntzyz.io/2015/09/03/great-success-on-hosting-an-ikev2-vpn/#respond Thu, 03 Sep 2015 15:48:39 +0000 http://blog.dimension.moe/?p=94 继续阅读IKEv2搭建成就Get]]> 放出证书:

Conoha JP节点

DigitalOcean SA节点

服务器地址:

Conoha JP: jp.conoha.dimension.moe

DigitalOcean SA: sa.digitalocean.dimension.moe

导入证书:(摘自这里

开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
「文件」-「添加/删除管理单元」,添加「证书」单元
证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
在左边的「控制台根节点」下选择「证书」-「个人」,然后选右边的「更多操作」-「所有任务」-「导入」打开证书导入窗口。
选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步「证书存储」选「个人」。
导入成功后,把导入的 CA 证书剪切到「受信任的根证书颁发机构」的证书文件夹里面。
打开剩下的那个私人证书,看一下有没有显示「您有一个与该证书对应的私钥」,以及「证书路径」下面是不是显示「该证书没有问题」。
然后关闭 mmc,提示「将控制台设置存入控制台1吗」,选「否」即可。

然后呢,添加一个连接,协议选IKEv2,用户名密码我才不说呢。再把属性调成如下图所示,就完成辣!

连接设置

//搭建过程无限错误,不过总算是搞起来了……

]]>
https://archive.ntzyz.io/2015/09/03/great-success-on-hosting-an-ikev2-vpn/feed/ 0