一、软件安装

ipsec 与 l2tp,一般常见的操作系统都直接支持,不需要额外安装软件。所以在选择上优先考虑。

在Debian 10下面安装非常容易,执行以下命令:

apt-get install strongswan xl2tpd strongswan-pki

二、软件配置

StrongSwan 的配置主要为 ipsec.conf、strongswan.conf;
xl2tpd 的配置主要为 xl2tpd.conf、options.xl2tpd;

以下为四个配置文件样例:

1、ipsec.conf

config setup
    uniqueids=no
    charondebug="cfg 2, dmn 2, ike 2, net 0"

conn %default
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%defaultroute
    leftfirewall=yes
    right=%any
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    auto=add

#######################################
# L2TP Connections
#######################################

conn L2TP-IKEv1-PSK
    type=transport
    keyexchange=ikev1
    authby=secret
    leftprotoport=udp/l2tp
    left=%any
    right=%any
    rekey=no
    forceencaps=yes

#######################################
# PSK Connections
#######################################

# Cisco IPSec
conn IKEv1-PSK-XAuth
    keyexchange=ikev1
    leftid=@lostend.com
    leftauth=psk
    rightauth=psk
    rightauth2=xauth
    leftsubnet=0.0.0.0/0
    rightsubnet=10.0.0.0/24
    rightsourceip=10.0.0.0/24

#######################################
# Certificate Connections
#######################################

conn windows7
    keyexchange=ikev2
    rekey=no
    leftauth=pubkey
    leftid=@lostend.com
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=rsa
    rightsourceip=10.0.0.0/24
    rightsendcert=never
    eap_identity=%any

include /var/lib/strongswan/ipsec.conf.inc

2、strongswan.conf

charon {
    load_modular = yes
    send_vendor_id = yes
    plugins {
        include strongswan.d/charon/*.conf
        attr {
            dns = 1.2.4.8, 119.29.29.29
        }
    }
}

include strongswan.d/*.conf

3、xl2tpd.conf

[global]
port = 1701
auth file = /etc/xl2tpd/l2tp-secrets
debug avp = yes
debug network = yes
debug state = yes
debug tunnel = yes
[lns default]
ip range = 10.1.0.2-10.1.0.254
local ip = 10.1.0.1
require chap = yes
refuse pap = yes
require authentication = yes
name = l2tpd
;ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

如上配置中,因为开启了chap的验证,拒绝了pap验证。所以验证文件是 /etc/ppp/chap-secrets ,在使用l2tp连接时,需要用到这个文件进行用户校验。上面的 /etc/xl2tpd/l2tp-secrets 文件是没什么用的。

以下是 /etc/ppp/chap-secrets 用户验证文件的示例:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses

"test" "*" "testpassword" "*"

"test"是用户名,"testpassword"是密码。多个的话,每个一行分开填写。

4、options.xl2tpd

ipcp-accept-local
ipcp-accept-remote
ms-dns 1.2.4.8
ms-dns 119.29.29.29
noccp
auth
idle 1800
mtu 1460
mru 1460
lcp-echo-failure 10
lcp-echo-interval 60
connect-delay 5000

其中mtu,mru 需要根据实际情况填写,不确定的话,填写1280是比较保险的值。

创建好四个配置文件后将其复制到指定位置即可:

# Strongswan Configuration
sudo cp ipsec.conf /etc/ipsec.conf
sudo cp strongswan.conf /etc/strongswan.conf

# XL2TPD Configuration
sudo cp xl2tpd.conf /etc/xl2tpd/xl2tpd.conf
sudo cp options.xl2tpd /etc/ppp/options.xl2tpd

三、证书创建

对于 Windows、Android 等设备可能不支持某些登录方式,比如 IKEv2 PSK,这时需要创建证书,以支持使用 IKEv2 证书登录:

1、生成一个私钥,并基于这个私钥自己签一个 CA 证书:

# create CA certificate
ipsec pki --gen --outform pem > ca.key.pem
ipsec pki --self --in ca.key.pem --dn "C=CN, O=StrongSwan, CN=StrongSwan CA" --ca --outform pem > ca.cert.pem

2、创建服务器证书,并用我们刚才自签的 CA 证书给自己发一个服务器证书:

# create server certificate
ipsec pki --gen --outform pem > server.key.pem 
ipsec pki --pub --in server.key.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.key.pem --dn "C=CN, O=StrongSwan, CN=lostend.com" --san="lostend.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem 

其中 --san 可以指定多个,但一般一个是域名,一个是外网 IP,如果经过了路由,那么只需要写本机的对外暴露网卡的 IP 即可。

--dn, --san,--flag 是一些客户端方面的特殊要求:

iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;
Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),--flag serverAuth;
非 iOS 的 Mac OS X 要求了「IP 安全网络密钥互换居间(IP Security IKE Intermediate)」这种增强型密钥用法(EKU),--flag ikdeIntermediate;
Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。

3、创建客户端证书,然后用刚才自签的 CA 证书来签客户端证书:

ipsec pki --gen --outform pem > client.key.pem 
ipsec pki --pub --in client.key.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.key.pem --dn "C=CN, O=StrongSwan, CN=Test" --outform pem > test.cert.pem 

看懂了服务器的,客户端的也就不难理解了。除了没有那一堆特殊要求别的都一样。

客户端证书可以每个客户端签一个,也可以让它们共用一个。是否多签看用途,一般用于区分设备。

4、生成 pkcs12 证书(可选)

安卓等设备是不支持直接导入客户端证书的,需要转换成 p12 格式,转换过程中需要输入两次密码,该密码为证书使用密码,导入时需要输入:

openssl pkcs12 -export -inkey client.key.pem -in test.cert.pem -name "Test" -certfile ca.cert.pem -caname "StrongSwan CA" -out test.cert.p12 

5、安装证书

创建完成后将证书复制到指定目录即可

sudo cp -r ca.cert.pem /etc/ipsec.d/cacerts/
sudo cp -r server.cert.pem /etc/ipsec.d/certs/
sudo cp -r server.key.pem /etc/ipsec.d/private/
sudo cp -r test.cert.pem /etc/ipsec.d/certs/
sudo cp -r client.key.pem /etc/ipsec.d/private/

CA 证书、客户端证书和 .p12 证书复制出来给客户端用。有几种 Android 配置还需要服务器证书(server.cert.pem)。

四、用户验证文件

ipsec.secrets 文件示例:

ipsec.secrets文件是需要复制到/etc/ipsec.secrets 位置的,很多网上的教程都是错的。这点需要划重点注意。

: PSK "testpassword"                                                                                                                                                                                                  
: RSA server.key.pem                                                                                                                                                                                              
test : EAP "testpassword"                                                                                                                                                                                            
test : XAUTH "testpassword"

在上面的例子中,创建了认证用户test和test的密码。在添加用户的时候,请注意在冒号(:)左右两边都需要一个空格。
上面定义的是四种认证方法。它们之间是遵循「各找各妈」的原则的,可以任意混搭。
每种认证方式找各自的认证内容,具体可以参考官方说明:

https://wiki.strongswan.org/projects/strongswan/wiki/Ipsecsecrets

五、linux转发配置

使用iptables 来进行转发:

sudo iptables -A INPUT -p udp --dport 1701 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -m policy --dir out --pol none -j MASQUERADE
sudo iptables -A FORWARD -s 10.1.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT

sudo vi /etc/sysctl.conf 
net.ipv4.ip_forward=1 
sudo sysctl -p

其中 10.1.0.0/24 和 10.0.0.0/24 就是ipsec.conf 和xl2tpd.conf 里面配置的子网网段。自己根据情况进行修改。
eth0 的网卡名也要根据自己的机器情况作修改。

至此,所以配置就完成了。重启ipsec和xl2tpd 生效

sudo /etc/init.d/ipsec restart
sudo /etc/init.d/xl2tpd restart

六、Windows 7 ikev2 认证配置

使用自带客户端(Agile):

导入证书:

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

至此,证书导入完成。

注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。

建立连接:

  1. 「控制面板」-「网络和共享中心」-「设置新的连接或网络」-「连接到工作区」-「使用我的 Internet 连接」
  2. Internet 地址写服务器地址,使用 IP 或都是 URL。
  3. 描述随便写。
  4. 点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到「安全」选项卡。
  5. VPN 类型选 IKEv2
  6. 数据加密是「需要加密」
  7. 身份认证这里使用私人证书认证的话就选择「使用计算机证书」。

配置完成。

标签: none

仅有一条评论

  1. Hbear Hbear

    感谢分享,博主写得很用心

添加新评论