IPsec-based VPN Server (简体中文)
本文中介绍了基于 IPsec 的 VPN 服务器的基本的安装与配置过程。
Contents
安装
安装位于AUR的 strongswanAUR。
或者,可以从 strongSwan 官方网站下载源码包自行编译安装:
$ ./configure --enable-eap-identity --enable-eap-md5 \ --enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \ --enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \ --enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock --enable-unity \ --enable-certexpire --enable-radattr --enable-tools --enable-openssl --disable-gmp # make # make install
配置
设置 IPsec 默认参数
可参考以下内容修改/etc/ipsec.conf:
/etc/ipsec.conf
config setup
conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
rekey=no
keyingtries=1
keyexchange=ike
leftsubnet=0.0.0.0/0
leftfirewall=yes
rightsourceip=192.168.99.128/25
right=%any
dpdaction=clear
dpddelay=300s
dpdtimeout=1h
打开 psk aggressive 模式
/etc/strongswan.conf
...
charon {
...
i_dont_care_about_security_and_use_aggressive_mode_psk = yes
...
配置虚拟 IP 地址池和 DNS
客户端连接后需要一个虚拟 IP 地址和 DNS 服务器,此处设定了用于分配的 IP 地址范围和 DNS 服务器。
打开虚拟 IP 地址功能
/etc/strongswan.conf
...
charon {
...
install_virtual_ip = yes
...
配置客户端虚拟 IP 地址池
设置 IP 地址池范围:
/etc/ipsec.conf
config setup
...
conn %default
...
rightsourceip=192.168.99.0/24
...
你可以随意指定一个私有IP地址范围内的地址池,这里我们指定了192.168.99.1~254。
设置客户端虚拟 IP 清理策略:
/etc/ipsec.conf
config setup
...
conn %default
...
dpdaction=clear
dpddelay=300s
dpdtimeout=1h
...
配置 DNS
/etc/strongswan.conf
...
charon {
...
dns1=208.67.222.222
dns2=8.8.8.8
...
此处指定了 208.67.222.222 和 8.8.8.8 两个公用 DNS 服务器,你可以根据自己的需要来设置。
允许一个用户多个连接
这一步不是必要的,如果不做配置,一个用户默认只能有一个在线连接。不过非常建议配置这一步,因为限制用户连接个数可以交给用户认证后端来实现。
修改配置文件,在如下位置添加duplicheck.enable = no和uniqueids=never:
/etc/strongswan.conf
...
charon {
...
duplicheck.enable = no
...
/etc/ipsec.conf
...
config setup
...
uniqueids=never
conn %default
...
用户认证
设定用户认证后端
使用 radius 服务
/etc/strongswan.conf
...
charon {
...
plugins {
...
eap-radius {
#eap_start = yes
accounting = yes
servers {
primary {
address = 127.0.0.1
secret = testing123
auth_port = 1812
acct_port = 1813
}
}
}
...
在 servers {} 内层,你可以指定多个 Radius 服务器,例如 primary,2nd,last1,这里随意起了个名字:primary。
为了支持IKEv1(Cisco IPsec),你还需要添加以下内容:
/etc/strongswan.conf
...
charon {
...
plugins {
...
xauth-eap {
backend = radius
}
...
设定 IKE 交换算法
以下的交换算法至少需要配置一种,也可以两者并存。
IKEv1(Cisco IPsec)
在/etc/ipsec.conf中添加下面的内容:
/etc/ipsec.conf
...
conn %default
...
conn CiscoIPSec
keyexchange=ikev1
auto=add
aggressive=yes
compress=yes
ike=aes256-sha1-modp1024!
esp=aes256-sha1!
leftid=GROUPID
type=tunnel
xauth=server
leftauth=psk
rightauth=psk
rightauth2=xauth-eap
其中leftid=GROUPID对应 xauth-psk 验证方式下的 Group ID,可以设定为你想要的值。
在/etc/ipsec.secrets中添加下面的内容:
%any %any : PSK "GROUPPASS"
其中GROUPPASS对应 xauth-psk 验证方式下的 Group Password,可以设定为你想要的值。
IKEv2
在/etc/ipsec.conf中添加下面的内容:
/etc/ipsec.conf
...
conn %default
...
conn IPSec-IKEv2
keyexchange=ikev2
auto=add
leftauth=pubkey
leftcert=serverCert.pem
rightauth=eap-radius
rightsendcert=never
eap_identity=%identity
compress=yes
...
设置防火墙和 NAT
打开 IP 转发
# echo "1" > /proc/sys/net/ipv4/ip_forward
修改/etc/sysctl.d/10-ip-forward.conf,使配置在每次系统启动时生效:
net.ipv4.ip_forward = 1
iptables
- 你需要将rightsourceip加入 MASQUERADE 或者 SNAT;
- 你需要将rightsourceip加入 FORWARD;
- 你需要放行 UDP 500 和 UDP 4500 端口;
- 你需要放行 ESP。
- 下面是一个完成的例子,如果你不需要 ssh 和 IPsec 以外的服务的话,可以直接套用:
/etc/iptables/iptables.rules
*nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 192.168.99.0/24 -o eth0 -j MASQUERADE COMMIT # Completed on Mon Jul 22 14:53:31 2013 # Generated by iptables-save v1.4.18 on Mon Jul 22 14:53:31 2013 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [432:67301] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p udp -m udp --dport 500 -j ACCEPT -A INPUT -p udp -m udp --dport 4500 -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -p esp -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -s 127.0.0.0/24 -d 127.0.0.0/24 -j ACCEPT -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -j REJECT --reject-with icmp-proto-unreachable -A FORWARD -s 192.168.99.0/24 -j ACCEPT COMMIT
重新启动 iptables:
# systemctl restart iptables
- 关于iptables的设定,请参考Iptables_(简体中文)
(可选)自动添加FORWARD到iptables
在需要的ConnSection中添加 leftfirewall=yes:
/etc/ipsec.conf
config setup
...
conn %default
...
leftfirewall=yes
...
这个选项的作用是当客户端连上后,执行strongswan默认的_updown脚本,自动在iptalbes添加对于客户端虚拟地址的FORWARD规则。所以如果设置了它,可以删除/etc/iptables/iptables.rules中的-A FORWARD -s 192.168.99.0/24 -j ACCEPT。
启动
直接启动
让 strongswan 在前台运行:
# ipsec start --nofork
使用 systemd
AUR的 strongswanAUR 包含了 service 文件。
启动服务:
# systemctl start strongswan.service
开机自动启动:
# systemctl enable strongswan.service