CentOS L2TP/IPSec vpn
chenzuoqing Lv3

CentOS L2TP/IPSec vpn

基于 centos 6

  1. 需要开发人员在外网可以拨号到开发环境调试代码。
  2. 开发人员拨号后只能访问部分地址,需要通过vpn服务器做SNAT,但是只对服务器内网的某几台机器。
  3. 需要控制vpn服务器的用户密码,系统用户登陆vpn机器后是可以通达整个内网的。
  4. 对vpn端口做外网固定IP的映射。

安装软件

关闭selinux

  1. 安装依赖和xl2tpd服务
    1
    2
    yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof  man
    yum install openswan ppp xl2tpd

修改配置文件

配置ipsec

  1. vim /etc.ipsec.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    config setup
    protostack=netkey
    dumpdir=/var/run/pluto/
    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

    conn L2TP-PSK-NAT
    rightsubnet=vhost:%priv
    also=L2TP-PSK-noNAT

    conn L2TP-PSK-noNAT
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    type=transport
    left=0.0.0.0 # 监听地址,也可以改为外网IP或域名
    leftprotoport=17/1701 # 监听的端口1701
    right=%any
    rightprotoport=17/%any
    include /etc/ipsec.d/*.conf
  2. vim /etc/ipsec.secrets

    1
    2
    3
    include /etc/ipsec.d/*.secrets
    0.0.0.0 %any: PSK "xxx.gz"
    # 上面"xxx.gz"为预共享密钥,客户端连接时候需要填写
  3. 修改内核参数

    • vim /etc/sysctl.conf
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      net.ipv4.ip_forward = 1 
      net.ipv4.conf.default.rp_filter = 0
      net.ipv4.conf.all.send_redirects = 0
      net.ipv4.conf.default.send_redirects = 0
      net.ipv4.conf.all.log_martians = 0
      net.ipv4.conf.default.log_martians = 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.icmp_ignore_bogus_error_responses = 1
    • 修改完执行sysctl -p生效
  4. 验证ipsec状态

    • ipsec setup restart
    • ipsec verify #可能有部分出错信息
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
        .....
      Hardware random device [N/A]
      Two or more interfaces found, checking IP forwarding [OK]
      Checking rp_filter [ENABLED]
      /proc/sys/net/ipv4/conf/enp2s0/rp_filter [ENABLED] # 出现这种网卡设备
      /proc/sys/net/ipv4/conf/enp3s7/rp_filter [ENABLED] # 错误的不用管
      rp_filter is not fully aware of IPsec and should be disabled # 继续后面步骤
      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]

      ipsec verify: encountered 5 errors – see ‘man ipsec_verify’ for help
  5. 启动ipsec服务,加入开机启动项

    1
    2
    service ipsec restart
    chkconfig ipsec on

配置xl2tpd和ppp认证

  1. vim /etc/xl2tpd/xl2tpd.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [global]
    ipsec saref = yes

    [lns default]
    ; vpn客户端地址段
    ip range = 10.1.2.10-10.1.2.254
    ; vpn服务器地址
    local ip = 10.1.2.1
    require chap = yes
    refuse pap = yes
    require authentication = yes
    name = LinuxVPNserver
    ppp debug = yes
    pppoptfile = /etc/ppp/options.xl2tpd
    length bit = yes
  2. cat /etc/ppp/options.xl2tpd

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    require-mschap-v2
    #ms-dns 8.8.8.8
    #ms-dns 8.8.4.4
    asyncmap 0
    auth
    crtscts
    lock
    hide-password
    modem
    debug
    name l2tpd
    proxyarp
    lcp-echo-interval 30
    lcp-echo-failure 4
    # 指定日志文件
    logfile /var/log/xl2tpd.log
  3. 配置登陆用户的认证
    vim /etc/ppp/chap-secrets

    1
    2
    3
    4
    5
    # Secrets for authentication using CHAP
    # client server secret IP addresses
    an00 * passwd *

    #用户名 服务器 密码 ip地址
  4. 重启xl2tpd服务,添加到开机启动项

    1
    2
    service xl2tpd restart
    chkconfig xl2tpd on

配置SNAT,允许vpn客户端访问服务器内网部分机器

原来是没开启iptables的,所以没有其他规则

  1. 在NAT链添加如下规则,只对vpn客户端到内网部分地址做NAT转发
    vim /etc/sysconfig/iptables

    1
    2
    3
    4
    5
    6
    7
    8
    *nat
    :PREROUTING ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A POSTROUTING -s 10.1.2.0/24 -d 172.16.88.125 -o eth0 -j MASQUERADE
    -A POSTROUTING -s 10.1.2.0/24 -d 172.16.88.126 -o eth0 -j MASQUERADE
    -A POSTROUTING -s 10.1.2.0/24 -d 172.16.88.185 -o eth0 -j MASQUERADE
    COMMIT
  2. 启动iptables,加入到开机启动项

    1
    2
    service iptables restart
    chkconfig iptables on

客户端连接配置

  1. 点击右下角网络连接图标
    image

  2. 在出现的设置中左侧点击”VPN”,然后右侧点击”添加VPN连接”
    预共享密钥是上文描述的ipsec.secrets中配置项
    保存,后续即可连接。
    image

  3. 需要修改注册表按win+r键输入regedit

    1
    2
    3
    4
    5
    路径:[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/RasMan/Parameters] 
    修改:ProhibitIPSec的值修改为1
    如果没有ProhibitIPSec项,需要点击右键新建一个dword,重命名为ProhibitIPSec,值设置为1

    重启你的本地电脑,一定记得重启。
  4. 建议做完下面步骤再拨号。

解决拨号后外网不能上的问题

  1. 按上面第一步打开”网络设置
    左侧选择”以太网“,在右侧”相关设置中“点击”更改适配器选项
    新窗口中找到vpn适配器右击 –> 属性
    点击”网络“选项卡 –>双击internet协议版本(TCP/IPv4)
    点击高级 –> IP设置选项卡 –> 取消勾选”在远程网络上使用默认网关“和它的子项
    然后一路确定。

  2. 在桌面编辑一个”xxx.bat”结尾的文件,添加如下内容

    1
    route add 172.16.88.0 mask 255.255.255.0 10.1.2.1
  3. 每次拨号后以管理员身份执行上面的命令会添加一个路由,外网还是走本地网络。

 Comments