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