Tiwb

我的业余生活博客.

搭建和连接VPN

有的时候需要从internet上访问内网,又不方便在internet上开端口,vpn就很有用了,这里我们搭个简单的PPTP服务。

搭建PPTP服务

首先安装ppp

$ yum install ppp

然后安装pptpd,这里我们下载一个rpm包:

$ wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.el6.x86_64.rpm
$ rpm -Uvh pptpd-1.3.4-2.el6.x86_64.rpm

修改/etc/pptpd.conf中的localip和remoteip

localip 192.168.4.1
remoteip 192.168.4.101-200

修改/etc/ppp/pptpd-options

ms-dns 10.10.10.254
mtu 1356

/etc/ppp/chap-secrets中加入允许登录的用户名和密码,注意用tab分隔:

username1 * password1 *

最后要打开防火墙,允许tcp协议1723端口和gre协议,也可以允许PPP端口的转发。同时还要调整ppp连接的mss值。

$ iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
$ iptables -A INPUT -p gre -j ACCEPT
$ iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
$ iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
$ iptables -A FORWARD -p tcp --syn -s 192.168.4.0/24 -j TCPMSS --set-mss 1356

CentOS7:

$ firewall-cmd --permanent --add-masquerade
$ firewall-cmd --permanent --zone=public --add-port=1723/tcp
$ firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -p gre -j ACCEPT
$ firewall-cmd --reload

最后就可以启动pptp服务了:

$ chkconfig pptpd on
$ service pptpd start

搭建L2TP / IPSEC服务

用上面的方法搭的PPTP服务,在Windows下用起来没问题, 但是MacOS上用一会就用不成了,找了好几天都没找到原因,所以干脆再做个L2TP服务。

首先安装所需要的软件:

$ yum install lsof openswan ppp xl2tpd

网上找到的很多资料都说openswan的一个版本有问题,要用旧版本的。我试了下应该问题已经被修复了。

IP转发我们已经开过了,下面再把ICMP转发禁用掉。在文件/etc/sysctl.conf中增加:

# Controls source route verification
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0

# Disable ICP redirects
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

配置文件/etc/ipsec.conf

version       2.0

config setup
  interfaces=%defaultroute
  klipsdebug=none
  nat_traversal=yes
  nhelpers=0
  oe=off
  plutodebug=none
  plutostderrlog=/var/log/pluto.log
  protostack=netkey
  virtual_private=%v4:192.168.4.0/24

conn L2TP-PSK
  authby=secret
  pfs=no
  auto=add
  keyingtries=3
  rekey=no
  type=transport
  forceencaps=yes
  right=%any
  rightsubnet=vhost:%priv
  rightprotoport=17/0
  # Using the magic port of "0" means "any one single port". This is
  # a work around required for Apple OSX clients that use a randomly
  # high port, but propose "0" instead of their port.
  left=%defaultroute
  leftprotoport=17/1701
  # Apple iOS doesn't send delete notify so we need dead peer detection
  # to detect vanishing clients
  dpddelay=10
  dpdtimeout=90
  dpdaction=clear

配置文件/etc/ipsec.d/ipsec.secrets,把0.0.0.0改成服务器的IP:

0.0.0.0      %any:     PSK     "yourPSKHere"

配置文件/etc/xl2tpd/xl2tpd.conf

[global]
listen-addr = 0.0.0.0
force userspace = yes

[lns default]
ip range = 192.168.4.100-192.168.4.200
local ip = 192.168.4.1
refuse pap = yes
require authentication = yes
name = xl2tp
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

配置文件/etc/ppp/options.xl2tpd

ipcp-accept-local
ipcp-accept-remote
ms-dns 192.168.4.1
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000
logfile /var/log/ppp.log

最后还有/etc/ppp/chap-secrets, 这个是和pptp一样的:

# client        server  secret                  IP addresses
user1           *       sgrongPassword1         *
user2           *       strongPassword2         *

配置好以后启动ipsec和xl2tpd服务:

$ service ipsec start
$ service xl2tpd start
$ chkconfig ipsec on
$ chkconfig xl2tpd on

还要打开防火墙端口,在/etc/sysconfig/iptables的*filter里添加:

-A INPUT -i eth1 -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --dport 1701 -j ACCEPT

Linux命令行连接pptp vpn

在有图形界面的设备上连接vpn很容易,要想在linux下用命令行连接vpn,需要安装一个小的工具:

$ yum install pptp-setup

建立一条vpn连接:

$ pptpsetup --create <name> --server <ip> \
            --username <username> \
            --passowrd <password> \
            --encrypt

在centos下, 需要拷贝几个脚本到可执行目录下并给予可执行权限:

$ cd /usr/share/doc/ppp-*/scripts
$ mkdir ~/bin
$ cp pon poff plog ~/bin
$ cd ~/bin
$ chmod +x pon poff plog

还需要修改plog脚本中的log文件路径为/var/log/messages

然后就可以使用pon <name> poff <name> plog命令进行VPN操作了。

使用ssh的ip隧道做vpn

如果只是想连接2台linux服务器,可以直接使用ssh的ip隧道,不用安装其他任何软件,并且很安全。

首先需要在sshd的配置文件中允许隧道:

PermitTunnel yes

比如我们有一台公网上的服务器,叫www.tiwb.com,可以用ssh命令连接到这台服务器:

$ ssh -w4:4 root@www.tiwb.com

这样两台机器上就会同时增加一个tun4的设备, 然后我们就可以像配置普通网卡一样配置它们了。

下面写一个脚本来配置网络连接,我在脚本中用了一个while,用于断线后自动重新连接。

#!/bin/sh

while true; do

ip tuntap add mode tap tun4
ip addr add 192.168.4.254/32 peer 192.168.4.1/32 dev tun4
ip link set tun4 up

ssh -T -w4:4 root@www.tiwb.com <<EOF
ip link set tun4 up
ip addr add 192.168.4.1/32 peer 192.168.4.254/32 dev tun4 
EOF

ip tuntap del mode tap tun4
sleep 60

done