在Ubuntu上安装IPSEC VPN服务

操作系统实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。

关于作者:

  • 张丹(Conan), 程序员R,Nodejs,Java
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/ubuntu-vpn-ipsec

前言

随着iphone的IOS版本升级到了10以后,PPTP协议的VPN不再支持了。为了能够继续使用Google的服务,提升对信息的准确查询,那么只能基于新的标准,再重新搭建一套的环境。用PPTP搭建VPN请参考文章:在Ubuntu上安装PPTP VPN服务

本文只是在纯技术层面进行介绍,如何使用IPSEC协议来搭建VPN服务。

目录

  1. IPSEC协议
  2. 服务器端程序搭建
  3. 客户端测试
  4. 剖析脚本

1. IPSEC协议

IPSec(Internet Protocol Security)是一种开放标准的框架结构,通过使用加密的安全服务以确保在 Internet 协议 (IP) 网络上进行保密而安全的通讯。它通过端对端的安全性来提供主动的保护以防止专用网络与 Internet 的攻击。在通信中,只有发送方和接收方才是唯一必须了解 IPSec 保护的计算机。

IPSEC包封装过程

我们有一个生活中简单的例子,来说明一下IPSEC包封装过程。

假设2个小朋友A和B要邮寄包裹,A要寄东西给B,A的爸爸和B的爸爸正巧在一家公司工作,所以A就把给B的包裹,交给了A的爸爸,再由A的爸爸转交给B的爸爸,B的爸爸最后把包裹给B的手中。回寄也一样,通过B的父亲发回给A的父亲再回给A。

这种通讯实现方式要依赖以下几个因素:

  • A的爸爸和B的爸爸可以见到。
  • A发包裹,把包裹交给A的爸爸。
  • A的爸爸收到儿子的包裹后,能够正确的处理,并且重新包装过的包裹能够正确送出去。
  • 另外一端,B的爸爸收到包裹开以后,能够正确地交给B。
  • 反过来的流程一样。

2. 服务器端程序搭建

本来安装和配置IPSEC服务,不是一件容易,但无意中发现了 IPsec VPN 服务器一键安装脚本 项目,让这一切都变得非常简单。感谢项目作者 Lin Song

我的服务器环境是Ubuntu 16.04 LTS,主机在香港。

一键安装,只需要3个步骤。

  1. 从网上下载一个shell脚步。
  2. 修改登录的用户名、密码、秘钥。
  3. 运行脚本

1. 从网上下载一个shell脚步。


~ wget https://git.io/vpnsetup -O vpnsetup.sh

2. 修改登录的用户名、密码、秘钥。


~ vi vpnsetup.sh

# Define your own values for these variables
# - IPsec pre-shared key, VPN username and password
# - All values MUST be placed inside 'single quotes'
# - DO NOT use these characters within values:  \ " '
    
YOUR_IPSEC_PSK='abc'       # 设置密钥
YOUR_USERNAME='conan'      # 设置用户名
YOUR_PASSWORD='12345678'   # 设置密码

# 省略...

3. 运行脚本


~ sudo sh vpnsetup.sh

3. 客户端测试

我的iphone-7手机,OS的版本为10.3.3,打开VPN的设置界面。设置–>通用–>VPN–>添加VPN配置。

具体配置

测试VPN是否正常工作,打开浏览器,访问www.google.com网页。

如果你也看到google,那么恭喜你就配置成功了!!

4. 剖析脚本

通过上面的操作,我们已经完成了VPN服务器的搭建,那么为什么还要有剖析脚本这个部分呢。我本来也自己尝试着参考网上的一些文章,以及一些开源VPN服务器的说明去配置,但花了几天的时间,一直都没有完全调通。这里其实有不少的网络知识点,是需要我们理解和掌握的。

正好可以查看 vpnsetup.sh 文件,一步一步的分析。

4.1 安装依赖包。


// 更新源
~ apt-get update

// 基础工具包
~ apt-get -yq install wget dnsutils openssl 
~ apt-get -yq install iproute gawk grep sed net-tools

// VPN相关的包
~ apt-get -yq install libnss3-dev libnspr4-dev pkg-config libpam0g-dev \
  libcap-ng-dev libcap-ng-utils libselinux1-dev \
  libcurl4-nss-dev flex bison gcc make \
  libunbound-dev libnss3-tools libevent-dev 
~ apt-get -yq --no-install-recommends install xmlto 
~ apt-get -yq install ppp xl2tpd 

// SSH相关的包
~ apt-get -yq install fail2ban
~ apt-get -yq install libsystemd-dev 

4.2 下载及安装libreswan包


~ wget https://download.libreswan.org/libreswan-3.21.tar.gz
~ tar xzf libreswan-3.21.tar.gz && cd libreswan-3.21
~ make -s programs && make -s install

4.3 修改配置文件

  • /etc/ipsec.conf
  • /etc/ipsec.secrets
  • /etc/xl2tpd/xl2tpd.conf
  • /etc/ppp/options.xl2tpd
  • /etc/ppp/chap-secrets
  • /etc/ipsec.d/passwd
  • /etc/sysctl.conf
  • /etc/iptables.rules

4.3.1 查看/etc/ipsec.conf


~ vi /etc/ipsec.conf

version 2.0

config setup
  virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!192.168.42.0/24,%v4:!192.168.43.0/24
  protostack=netkey
  nhelpers=0
  interfaces=%defaultroute
  uniqueids=no

conn shared
  left=%defaultroute
  leftid=123.123.123.123   # 当前服务器的IP
  right=%any
  encapsulation=yes
  authby=secret
  pfs=no
  rekey=no
  keyingtries=5
  dpddelay=30
  dpdtimeout=120
  dpdaction=clear
  ike=3des-sha1,3des-sha2,aes-sha1,aes-sha1;modp1024,aes-sha2,aes-sha2;modp1024,aes256-sha2_512
  phase2alg=3des-sha1,3des-sha2,aes-sha1,aes-sha2,aes256-sha2_512
  sha2-truncbug=yes

conn l2tp-psk
  auto=add
  leftprotoport=17/1701
  rightprotoport=17/%any
  type=transport
  phase2=esp
  also=shared

conn xauth-psk
  auto=add
  leftsubnet=0.0.0.0/0
  rightaddresspool=192.168.43.10-192.168.43.250
  modecfgdns1=8.8.8.8               # DNS 解析1
  modecfgdns2=8.8.4.4               # DNS 解析2
  leftxauthserver=yes
  rightxauthclient=yes
  leftmodecfgserver=yes
  rightmodecfgclient=yes
  modecfgpull=yes
  xauthby=file
  ike-frag=yes
  ikev2=never
  cisco-unity=yes
  also=shared
                   

4.3.2 查看/etc/ipsec.secrets


~ vi /etc/ipsec.secrets

%any  %any  : PSK "abc"                    # 设置ipsec的登录权限,秘钥为abc

4.3.3 查看/etc/xl2tpd/xl2tpd.conf


~ vi /etc/xl2tpd/xl2tpd.conf

[global]
port = 1701                                 # 连接端口

[lns default]
ip range = 192.168.42.10-192.168.42.250     # VPN内网IP段
local ip = 192.168.42.1                     # 主机的内网IP
require chap = yes                          # 要求chap身份认证模式
refuse pap = yes                            # 拒绝pap身份认证模式
require authentication = yes                # 要求认证登录
name = l2tpd                                # 服务名称为l2tpd
pppoptfile = /etc/ppp/options.xl2tpd        # ppp的配置文件
length bit = yes

4.3.4 查看/etc/ppp/options.xl2tpd


~ vi /etc/ppp/options.xl2tpd

ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8                  # DNS 解析1
ms-dns 8.8.4.4                  # DNS 解析2
noccp
auth
mtu 1280
mru 1280
proxyarp                        # arp代理
lcp-echo-failure 4
lcp-echo-interval 30
connect-delay 5000

4.3.5 查看 /etc/ppp/chap-secrets


~ vi /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client  server  secret  IP addresses
# 用户名  服务类型   密码   分配的ip地址
"conan" l2tpd "12345678" *                          # 设置客户端登录账户和密码,4个字段用空格分隔, *表示任意类型

4.3.6 查看 /etc/ipsec.d/passwd


~ vi  /etc/ipsec.d/passwd

conan:$1$rkrg5ssz$3lTGfeeazreqrR79pAoggh1:xauth-psk    # 使用秘钥加密后的密码

4.3.7 查看 /etc/sysctl.conf


~ vi /etc/sysctl.conf

kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

net.ipv4.ip_forward = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

net.core.wmem_max = 12582912
net.core.rmem_max = 12582912
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912

4.3.8 查看/etc/iptables.rules


~ vi /etc/iptables.rules

# Modified by hwdsl2 VPN script
# Generated by iptables-save v1.6.0 on Mon Sep 18 22:36:46 2017
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.42.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.43.0/24 -o eth0 -m policy --dir out --pol none -j MASQUERADE
COMMIT
# Completed on Mon Sep 18 22:36:46 2017
# Generated by iptables-save v1.6.0 on Mon Sep 18 22:36:46 2017
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol none -j DROP
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m multiport --dports 500,4500 -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT
-A INPUT -p udp -m udp --dport 1701 -j DROP
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -i eth0 -o ppp+ -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ppp+ -o eth0 -j ACCEPT
-A FORWARD -s 192.168.42.0/24 -d 192.168.42.0/24 -i ppp+ -o ppp+ -j ACCEPT
-A FORWARD -d 192.168.43.0/24 -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.43.0/24 -o eth0 -j ACCEPT
-A FORWARD -s 10.1.20.0/24 -j ACCEPT
-A FORWARD -j DROP
COMMIT
# Completed on Mon Sep 18 22:36:46 2017

4.4 查看连接日志

接下来,我们用手机连接VPN,然后查看日志输出 。

连接日志


~ tail -f /var/log/syslog

Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: Connection established to 36.102.226.172, 65287.  Local: 21666, Remote: 20 (ref=0/0).  LNS session is 'default'
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: start_pppd: I'm running:
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "/usr/sbin/pppd"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "passive"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "nodetach"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "192.168.42.1:192.168.42.10"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "refuse-pap"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "auth"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "require-chap"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "name"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "l2tpd"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "file"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "/etc/ppp/options.xl2tpd"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "plugin"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "pppol2tp.so"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "pppol2tp"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "8"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "pppol2tp_lns_mode"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "pppol2tp_tunnel_id"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "21666"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "pppol2tp_session_id"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: "21136"
Sep 19 13:54:28 i-vtnhoxsp xl2tpd[20115]: Call established with 36.102.226.172, Local: 21136, Remote: 10537, Serial: 1
Sep 19 13:54:28 i-vtnhoxsp pppd[23553]: Plugin pppol2tp.so loaded.
Sep 19 13:54:28 i-vtnhoxsp pppd[23553]: pppd 2.4.7 started by root, uid 0
Sep 19 13:54:28 i-vtnhoxsp pppd[23553]: Using interface ppp0
Sep 19 13:54:28 i-vtnhoxsp pppd[23553]: Connect: ppp0 <-->
Sep 19 13:54:28 i-vtnhoxsp pppd[23553]: Overriding mtu 1500 to 1280
Sep 19 13:54:28 i-vtnhoxsp pppd[23553]: Overriding mru 1500 to mtu value 1280
Sep 19 13:54:28 i-vtnhoxsp pppd[23553]: Overriding mtu 1500 to 1280
Sep 19 13:54:32 i-vtnhoxsp charon: 05[KNL] 192.168.42.1 appeared on ppp0
Sep 19 13:54:32 i-vtnhoxsp charon: 03[KNL] 192.168.42.1 disappeared from ppp0
Sep 19 13:54:32 i-vtnhoxsp charon: 07[KNL] 192.168.42.1 appeared on ppp0
Sep 19 13:54:32 i-vtnhoxsp pppd[23553]: Cannot determine ethernet address for proxy ARP
Sep 19 13:54:32 i-vtnhoxsp pppd[23553]: local  IP address 192.168.42.1
Sep 19 13:54:32 i-vtnhoxsp pppd[23553]: remote IP address 192.168.42.10
Sep 19 13:54:32 i-vtnhoxsp charon: 10[KNL] interface ppp0 activated

断开手机的VPN连接,查看日志。


~ tail -f /var/log/syslog

Sep 19 13:55:53 i-vtnhoxsp xl2tpd[20115]: result_code_avp: result code endianness fix for buggy Apple client. network=768, le=3
Sep 19 13:55:53 i-vtnhoxsp xl2tpd[20115]: control_finish: Connection closed to 36.102.226.172, serial 1 ()
Sep 19 13:55:53 i-vtnhoxsp pppd[23553]: LCP terminated by peer (User request)
Sep 19 13:55:53 i-vtnhoxsp xl2tpd[20115]: Terminating pppd: sending TERM signal to pid 23553
Sep 19 13:55:53 i-vtnhoxsp pppd[23553]: Connect time 1.4 minutes.
Sep 19 13:55:53 i-vtnhoxsp pppd[23553]: Sent 93199 bytes, received 34500 bytes.
Sep 19 13:55:53 i-vtnhoxsp charon: 06[KNL] interface ppp0 deactivated
Sep 19 13:55:53 i-vtnhoxsp xl2tpd[20115]: result_code_avp: result code endianness fix for buggy Apple client. network=256, le=1
Sep 19 13:55:53 i-vtnhoxsp xl2tpd[20115]: control_finish: Connection closed to 36.102.226.172, port 65287 (), Local: 21666, Remote: 20
Sep 19 13:55:53 i-vtnhoxsp charon: 03[KNL] 192.168.42.1 disappeared from ppp0
Sep 19 13:55:53 i-vtnhoxsp pppd[23553]: Overriding mtu 1500 to 1280
Sep 19 13:55:53 i-vtnhoxsp pppd[23553]: Overriding mru 1500 to mtu value 1280
Sep 19 13:55:53 i-vtnhoxsp pppd[23553]: Terminating on signal 15
Sep 19 13:55:56 i-vtnhoxsp pppd[23553]: Connection terminated.
Sep 19 13:55:56 i-vtnhoxsp charon: 11[KNL] interface ppp0 deleted
Sep 19 13:55:56 i-vtnhoxsp pppd[23553]: Modem hangup
Sep 19 13:55:56 i-vtnhoxsp pppd[23553]: Exit.

对于脚本的分析,虽然没有给出结论,而且很多配置我还是不太理解。不过要坚持学习,不断的提升自己的能力,不然永远都要等着大牛们提供一键安装的脚本。

转载请注明出处:
http://blog.fens.me/ubuntu-vpn-ipsec

打赏作者

This entry was posted in 操作系统, 网络技术