安装 openswan 及其环境

一、 openswan 介绍

OpenSWan是linux选Ipsec及I2tp协议的一个不错的实现方案。他支持和ipsec相关的大多数的扩展(RFC+IETF drafts)。Openswan项目起源于FreeS/WAN 2.04项目,该项目的功能很强大,可以很大程度上保证数据在跨网传输中的安全性、完整性,特别是通过它,可以很好地实现跨机房或异地办公场所实现局域网互联解决方案,如果和openvpn工具配合,可以实现将注入门户网站的多机房互访及vpn的各种强大解决方案.  
能实现 IPsec 的目前总体上有 openswan,libreswan,strongswan 这3种。 libreswan 是基于 openswan 的 fork,所以现在各个发行版基本已经看不到 openswan 的身影了。 当然也有使用 strongswan 的。

二、环境

实现目标:外网服务器和公司网络打通,实现内网互通:  

环境:   
外部服务器: (外网)106.75.20.16 (内) 10.10.68.61  (VPN)
            测试  10.10.68.62 
公司:       (外网) 58.22.123.82(内)192.168.99.168  (VPN)
            测试  192.168.99.169
架构图

image

三、安装 openswan 及其环境(两台都要装)

3.1 软件安装

centos7:

1
2
3

yum -y install ppp libreswan xl2tpd firewalld lsof
yum install -y openswan

centos6:

1
2
3
4
5
6
7
8

yum -y remove libevent-devel
yum -y install libevent2-devel
yum -y install nss-devel nspr-devel pkgconfig pam-devel \
libcap-ng-devel libselinux-devel lsof \
curl-devel flex bison gcc ppp make iptables gmp-devel \
fipscheck-devel unbound-devel xmlto libpcap-devel xl2tpd
yum install -y openswan

Ubuntu:

1
2
apt-get update
apt-get install -y openswan lsof

(ubuntu 会交互安装,第一个询问启用 X.509 证书的时候选择 no,第二个只要点 ok 就可以。)

3.2、开启 linux 主机的路由功能(所有为ipsec vpn server 的主机都要开启)

1
2
3
4
5
6
7
8
9
10
# vim /etc/sysctl.conf
## 开启主机路由转发
net.ipv4.ip_forward = 1
## 关闭源路由验证
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0

## 关闭icmp重定向
# sysctl -a | egrep "ipv4.*(accept|send)_redirects" | awk -F "=" '{print$1"= 0"}' >> /etc/sysctl.conf
修改完成后执行 sysctl -p 加载配置。

3.3 检测服务正常(所有为 ipsec vpn server 的主机)

1
2
3
4
5
# service ipsec start
Starting pluto IKE daemon for IPsec: . [ OK ]
# service ipsec status
pluto (pid 23914) is running...
IPsec connections: loaded 3, active 1

3.4、在控制台上的防火墙添加 ipsec vpn 所用的端口

两边开启UDP 端口500,4500

3.4 测试udp端口

1
2
3
4
nc -vuz 58.22.123.82 500
Connection to 58.22.123.82 500 port [udp/isakmp] succeeded!
nc -vuz 58.22.123.82 4500
Connection to 58.22.123.82 4500 port [udp/isakmp] succeeded!

3.5 VPN自动启动

1
chkconfig ipsec on
将/etc/ipsec.conf 文件中的 auto=add 改为 auto=start

四、验证环境

ipsec verify (一个 N/A 和一个 DISABLED 不影响 ipsec vpn 的建立,Ubuntu 主机可能在checking /bin/sh 会多一个 warning,也不影响。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# ipsec verify
Verifying installed system and configuration files

Version check and ipsec on-path [OK]
Libreswan 3.15 (netkey) on 2.6.32-431.1.2.0.1.el6.x86_64
Checking for IPsec support in kernel [OK]
NETKEY: Testing XFRM related proc values
ICMP default/send_redirects [OK]
ICMP default/accept_redirects [OK]
XFRM larval drop [OK]
Pluto ipsec.conf syntax [OK]
Hardware random device [N/A]
Two or more interfaces found, checking IP forwarding [OK]
Checking rp_filter [OK]
Checking that pluto is running [OK]
Pluto listening for IKE on udp 500 [OK]
Pluto listening for IKE/NAT-T on udp 4500 [OK]
Pluto ipsec.secret syntax [OK]
Checking 'ip' command [OK]
Checking 'iptables' command [OK]
Checking 'prelink' command does not interfere with FIPSChecking for obsolete ipsec.conf options [OK]
Opportunistic Encryption [DISABLED]

五、配置服务

5.1 配置认证 key(所有为 ipsec vpn server 的主机)

1
2
3
4
5
6
# vim /etc/ipsec.secrets
##include /etc/ipsec.d/*.secrets

##源IP 目标IP: PSK "(key)" (0.0.0.0 即为所有 vpn 都使用这个 key)

0.0.0.0 0.0.0.0 : PSK "www.172173.com" (注意空格格式不能错)

5.3 配置ipsec.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
# cat /etc/ipsec.conf
version 2

# basic configuration
config setup
# which IPsec stack to use, "netkey" (the default), "klips" or "mast".
# For MacOSX use "bsd"
protostack=netkey //使用2.6内核内建模块netkey,2.6以下是KLIPS模块
nat_traversal=yes //nat穿透
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10
dumpdir=/var/run/pluto/
logfile=/var/log/pluto.log //log location
include /etc/ipsec.d/*.conf

5.2 配置VPN主体

公司服务器:192.168.99.168 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# cat /etc/ipsec.d/campany.conf  
conn BY-to-UC
# 第一阶段(两端要保持一致)
ike=3des-sha1
authby=secret //使用预共享密钥方式进行认证
# 第二阶段(两端要保持一致
phase2=esp //用于连接的ESP加密/认证算法。
phase2alg=3des-sha1
compress=no //所有计划的IPsec sa都要包含IPCOMP(压缩)。如果KLIPS没有配置IPCOMP支持,会忽略该选项。
type=tunnel //使用tunnel隧道模式
pfs=yes //完全加密

leftid=106.75.20.16
left=106.75.20.16
leftsubnet=10.10.0.0/16
leftnexthop=%defaultroute

rightid=58.22.123.82
right=192.168.99.168
rightsubnet=192.168.0.0/16
rightnexthop=%defaultroute
auto=start //add代表只是添加,但并不会连接,如果为start则代表着启动自动连接
外部服务器:106.75.20.16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# cat /etc/ipsec.d/outside.conf 
conn UC-to-BY
# 第一阶段(两端要保持一致)
ike=3des-sha1
authby=secret //使用预共享密钥方式进行认证
# 第二阶段(两端要保持一致
phase2=esp //用于连接的ESP加密/认证算法。
phase2alg=3des-sha1
compress=no //所有计划的IPsec sa都要包含IPCOMP(压缩)。如果KLIPS没有配置IPCOMP支持,会忽略该选项。
type=tunnel //使用tunnel隧道模式
pfs=yes //完全加密

leftid=106.75.20.16
left=10.10.68.61
leftsubnet=10.10.0.0/16
leftnexthop=%defaultroute

rightid=58.22.123.82
right=58.22.123.82
rightsubnet=192.168.0.0/16
rightnexthop=%defaultroute
auto=start //add代表只是添加,但并不会连接,如果为start则代表着启动自动连接
第一阶段选择 ikev1 主模式(main mode),参数为 3des、sha、group2。  

第二阶段选择模式为 tunnel,参数为 esp、3des、sha。  

启用 pfs 和 nat-t(nat 穿越)。  

六、测试完成与错误定位

6.1 测试

1
2
3
4
5
ipsec auto --up BY-to-UC
002 "BY-to-UC" #371: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS+UP+IKEV1_ALLOW+IKEV2_ALLOW+SAREF_TRACK+IKE_FRAG_ALLOW {using isakmp#370 msgid:76bf0615 proposal=3DES(3)_000-SHA1(2)_000 pfsgroup=OAKLEY_GROUP_MODP1536}
117 "BY-to-UC" #371: STATE_QUICK_I1: initiate
002 "BY-to-UC" #371: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
004 "BY-to-UC" #371: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP/NAT=>0x26978c24 <0xdf95b93d xfrm=3DES_0-HMAC_SHA1 NATOA=none NATD=106.75.20.16:4500 DPD=passive}

这个状态即为启动成功,两端可互相 ping 通。

1
IPsec SA established tunnel mode

排查错误常用命令

1
2
3
4
ipsec auto --status  //状态
tail -f /var/log/ipsec.log //ipsec日志
tail -f /var/log/secure //安全日志
tail -f /var/log/messages //系统日志

6.2 其他主机路由

其他云主机如果要通过 ipsec 访问对端要增加相应的路由,或者网关指向本地的 ipsec服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在10.10.68.62  (外部测试)上,执行:

# route add -net 192.168.0.0/24 gw 10.10.68.61 dev eth0

在10.10.68.61 (外部VPN)上,执行:

# route add -net 192.168.0.0/24 gw 10.10.68.61 dev eth0

在192.168.99.168 (公司VPN)上执行 :

# route add -net 10.10.0.0/16 gw 192.168.99.168 dev eth0

在192.168.99.169(公司测试)上执行:
或者 公司可以在三层交换机上添加以下路由,就所有的公司内网服务器都可以到外网服务器内网,不需要每台都加

# route add -net 10.10.0.0/16 gw 192.168.99.168 dev eth0

6.3 故障排查

1)、发生no connection named “xxxxx”的报错时基本为配置文件错误或者conn名字错误,检查conn名称、配置文件格式,并查看/var/log/messages中具体错误参数/格式提示。

1
2
initiating all conns with alias="net-to-net"
no connection named "net-to-net"
2)、发生第一阶段(STATEMAINI1)或者第二阶段(STATEQUICKI1)初始化超时报错的时候,多为两端参数配置错误导致的协商失败,需要查看/var/log/secure以及对端的日志确定具体哪个参数协商错误。
1
2
010 "sample" #2: STATE_QUICK_I1: retransmission; will wait 20s for response
010 "sample" #2: STATE_QUICK_I1: retransmission; will wait 40s for response

6.4 测试

相互ping