隧道技术近年来多用于实现混合云的场景, 实现云环境到自己的 IDC 机房, A 云到 B 云等需求.本篇文档主要介绍两个云之间, 使用 Linux 服务器做对接的情况. 
 
具体原理这里不讲, 主要讲具体搭建步骤, 这里我准备了两个脚本来搭建隧道环境
configIPsec.sh 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 #!/bin/bash yum install -y openswan lsof echo  "" "net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 vm.swappiness = 0 net.ipv4.neigh.default.gc_stale_time = 120 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_synack_retries = 2 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.eth0.rp_filter=0 #net.ipv4.conf.ip_vti0.rp_filter=0 net.ipv4.ip_forward = 1" ""  >> /etc/sysctl.confsysctl -p systemctl restart ipsec sleep 2 ipsec verify 
在执行 ipsec verify 命令后, 必须保证如下回显中所有的状态均为绿色 (Hardware random device 可以为[N/A]; Opportunistic Encryption 可以为 [DISABLE]; 其他均为 ok)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@99-5 ~] Verifying installed system and configuration files Version check and ipsec on-path                         [OK] Libreswan 3.15 (netkey) on 3.10.0-327.18.2.el7.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] 
保证上面的环境检查通过后, 执行如下脚本 configTunnel.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #!/bin/bash ip_remote="59.110.174.253"  ip_remote_vlan="192.168.20.0/24"  ip_public=`curl http://members.3322.org/dyndns/getip` ip_private=`ifconfig  | grep "inet"  | grep "192.168"  | awk '{print $2}' ` net_vlan=`ifconfig  | grep "inet"  | grep "192.168"  | awk '{print $2}'  | awk -F "."  '{print $3}' ` subnet="192.168.59.0/24"  token="20150509"  sed -i 's/#version 2/version 2/g'  /etc/ipsec.conf  sed -i '/protostack=netkey/a\        nat_traversal=yes\n        oe=off'  /etc/ipsec.conf echo  "" "conn tunnel$net_vlan          ike=3des-sha         authby=secret         phase2=esp         phase2alg=3des-sha         compress=no         pfs=yes         type=tunnel         left=$ip_private          leftid=$ip_public          leftsubnet=$subnet          leftnexthop=%defaultroute         right=$ip_remote          rightid=$ip_remote          rightsubnet=$ip_remote_vlan          rightnexthop=%defaultroute         auto=start" ""  >> /etc/ipsec.d/tunnel"$net_vlan " .confecho  "0.0.0.0 $ip_remote : PSK \"$token \""  >> /etc/ipsec.secrets systemctl restart ipsec 
配置完毕后, 启动该条隧道
1 ipsec auto --up tunnelName 
注意: 这里的 tunnelName 是上面的脚本中根据网段序号生成的, 换成上面生成的隧道名即可 
单边配置好后, 在对端以同样的方式配置并启动隧道即可
参考文档:
http://blog.leanote.com/post/251689658@qq.com/阿里云openwan与网康实现IPsec对接