Windard +
Github Zhihu RSS

Cent OS 7 下安装 VPN

在 Cent OS 7 下 安装 VPN

为什么是 Cent OS 呢?因为一般服务器常用的都是 Cent OS,性能还是可以的,个人电脑上用 Ubuntu ,比如说我,那么 VPN 的客户端连接就是用的 Ubuntu。

为什么是 Cent OS 7 呢?到目前 2016.10.14 为止最新的,虽然说新的容易出现新的问题,但是也意味着修复了很多旧的问题,所以用最新的,安全性有所保障。

但是在 Cent OS 7 上有一个很坑的问题,Cent OS 7 的默认防火墙不是常用的 iptables ,而是 firewall ,本文尽量用给出两种防火的使用策略。

为什么是 VPN?ss ( Shadowsocks ) 的安装教程在 Github 上的 Wiki 上写的清清楚楚明明白白,简单易懂一看就会,ss 在 Github 上 被删除了,相信你能找得到。

前言

你可以使用 cat /etc/redhat-release 查看你的 Cent OS 版本,使用 virt-what 查看你的 VPS 的虚拟化机制 ,需要虚拟化机制为 Xen 或 KVM 的。

VPN (Virtual Private Network) ,虚拟专用网络, 一般常见的有很多种不同的协议,分别有不同的软件来实现,比如说 PPTP,OpenVPN,L2TP/IPsec 等。

PPTP

检测系统是否支持 PPTP

[[email protected]_1_214_centos conf.d]# cat /dev/ppp
cat: /dev/ppp: No such device or address
[[email protected]_1_214_centos conf.d]# modprobe ppp-compress-18 && echo ok
ok
[[email protected]_1_214_centos conf.d]# cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state

如上结果即为可以安装 PPTP 。

安装组件

yum install -y ppp iptables pptpd

修改配置

编辑修改 /etc/ppp/options.pptpd ,将以下字段前的 # 号去掉并修改

#ms-dns 10.0.0.1
#ms-dns 10.0.0.2

改为 Google 的 DNS 服务器

ms-dns 8.8.8.8
ms-dns 8.8.4.4

编辑修改 /etc/pptpd.conf,将以下字段前的 # 号去掉即可

localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

编辑修改 /etc/ppp/chap-secrets 按照以下格式输入你的账号和密码

username pptpd password *

或者是使用 vpnuser add username password 也可以。

编辑修改 /etc/sysctl.conf ,加入以下一句,使其支持路由转发

net.ipv4.ip_forward = 1

然后是修改即刻生效

sysctl -p

配置防火墙

iptables

打开防火墙 1723 端口,设置 iptables 转发规则

iptables -I INPUT -p tcp --dport 1723 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
iptables -I FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

但是 iptables 的自带的配置在这里是有问题的,所以需要先清除之前的配置,提供一份完整版的 iptables 配置。

iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

firewalld

暂无

使用 PPTP

开启 pptpd

service pptpd start

重启 pptpd

service pptpd restart

关闭 pptpd

service pptpd stop

查看状态 pptpd

service pptpd status

可以使用 iptables-save > /etc/sysconfig/iptables 保存转发规则,使用 chkconfig pptpd on 设置 VPN 开机启动。

OpenVPN

安装 EPEL (Extra Packages for Enterprise Linux),因为 OpenVPN 不在 Cent OS 的默认软件包里,不过奇怪的是好像腾讯云的服务器里有。。。

yum install epel-release

安装 OpenVPN

yum install -y openvpn easy-rsa

配置 OpenVPN

将 OpenVPN 提供的默认配置文件移到 OpenVPN 的配置文件位置

cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

编辑修改配置文件

vim /etc/openvpn/server.conf

;push "redirect-gateway def1 bypass-dhcp"
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
;user nobody
;group nobody
;log-append  openvpn.log

将 NDS 服务器改为 Google 的 DNS 服务器,连接设备采用 DHCP 分配子网 IP。

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
user nobody
group nobody
log-append  openvpn.log

准备生成密钥和证书文件

mkdir -p /etc/openvpn/easy-rsa/keys
cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

编辑修改密钥配置

vi /etc/openvpn/easy-rsa/vars

配置以下各项的,内容自定义即可

export KEY_COUNTRY="CN"
export KEY_PROVINCE="Shaanxi"
export KEY_CITY="Xian"
export KEY_ORG="Windard"
export KEY_EMAIL="[email protected]"
export KEY_OU="Windard"

export KEY_NAME="openvpn"

export KEY_CN="openvpn.windard.com"

制作证书

cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca

因为之前已经配置好参数,所以现在只需一路回车就可以。

创建服务器端证书

./build-key-server server   

同样一路回车,最后需要输入密码,设置密码即可,密码在后面用,在是否签名证书时输入 y

Sign the certificate? [y/n]:y

创建密钥文件

./build-dh

生成服务器端证书

cd  /etc/openvpn/easy-rsa/keys
cp  dh2048.pem  ca.crt  server.crt  server.key   /etc/openvpn
cd  /etc/openvpn/easy-rsa
./build-key client

同样的一路回车,在最后的密码的地方输入你前面设置的密码,在最后是否签名证书的时候输入 y

现在一切都已准备就绪了,最后又到了设置路由的地方了。

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

同样的开启路由转发

vi /etc/sysctl.conf

写入

net.ipv4.ip_forward = 1

然后重启网络服务使其生效

systemctl restart network.service

使用 OpenVPN

开启 OpenVPN

systemctl -f enable [email protected]
systemctl start [email protected]

查看状态

systemctl status [email protected]

如果遇到了问题,可以查看 /etc/openvpn/openvpn.log 查看日志。

配置OpenVPN 客户端

现在客户端需要的文件就是以下三个

/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key

使用客户端连接的时候可以设置这仨的位置,也可以将他们写入到一个 .ovpn 的配置文件中。

client
dev tun
proto udp
remote XXX.XXX.XXX.XXX 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
<ca>
ca.crt的内容粘贴到这里
</ca>

<cert>
client.crt的内容粘贴到这里
</cert>

<key>
client.key的内容粘贴到这里
</key>

然后使用

sudo openvpn --config ~/path/to/client.ovpn

就可以使用了。

L2TP

这个是最安全的 VPN 解决方案,因为它是基于 IP 层的加密隧道,采用 IPsec 加密机制。

同时它的限制也比较多,除了上面出现过的使用 openVZ 虚拟化的服务器必须支持 TUN 和 PPP 模块之外,还要求服务器必须有自己的固定公网 IP,而不能是弹性公网IP。

前言

  1. 如何检测是否支持TUN模块?

执行命令:

cat /dev/net/tun

如果返回信息为:cat: /dev/net/tun: File descriptor in bad state 说明正常

  1. 如何检测是否支持ppp模块?

执行命令:

cat /dev/ppp

如果返回信息为:cat: /dev/ppp: No such device or address 说明正常

  1. 如何检查是否为固定公网 IP?

执行命令

ifconfig

如果返回网卡信息中有 公网 IP,而说明正常,非常不幸,腾讯云使用的是弹性公网 IP,所以不能搭建 L2TP VPN 服务器,阿里云学生服务器也不能。

安装配置 openswan

yum install openswan

然后配置 /etc/ipsec.conf

config setup
    nat_traversal=yes
    protostack=netkey
    oe=off
    interfaces="%defaultroute"
    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=XXX.XXX.XXX.XXX
    leftid=XXX.XXX.XXX.XXX
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any
    dpddelay=40
    dpdtimeout=130
    dpdaction=clear

在上面的 leftleftid 两项填入你自己的 IP 地址

配置 L2TP 的 PSK password, 编辑文件 /etc/ipsec.secrets

XXX.XXX.XXX.XXX %any: PSK "YourPsk"

安装配置 ppp

yum install ppp

编辑 PPP 的密码文件 /etc/ppp/chap-secrets

# client       server  	 	 secret                  IP addresses
username 	   l2tpd		 password 					*

安装配置 xl2tpd

yum install xl2tpd

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

[global]
listen-addr = XXX.XXX.XXX.XXX
[lns default]
ip range = 192.168.18.2-192.168.18.254
local ip = 192.168.18.1
require chap = yes
refuse pap = yes
require authentication = yes
name = LinuxVPNserver
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

同样的,在 listen-addr 中填入你的 IP 地址

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

ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
ms-dns  8.8.8.8
ms-dns  8.8.4.4
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
name l2tpd
debug
lock
proxyarp
connect-delay 5000

配置 sysctl

echo "# Added by L2TP VPN" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf

for each in `ls /proc/sys/net/ipv4/conf/`
do
    echo "net.ipv4.conf.${each}.accept_source_route=0" >> /etc/sysctl.conf
    echo "net.ipv4.conf.${each}.accept_redirects=0" >> /etc/sysctl.conf
    echo "net.ipv4.conf.${each}.send_redirects=0" >> /etc/sysctl.conf
    echo "net.ipv4.conf.${each}.rp_filter=0" >> /etc/sysctl.conf
done
sysctl -p

配置防火墙

iptables

iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.18.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

firewalld

firewall-cmd --permanent --add-port=4500/udp
firewall-cmd --permanent --add-port=1701/udp
firewall-cmd --permanent --add-service=ipsec
firewall-cmd --permanent --add-service=xl2tpd
firewall-cmd --permanent --add-masquerade

测试使用

开启

ipsec start

重启

service xl2tpd restart
ipsec restart

测试

ipsec verify

测试结果如下即可用使用

Verifying installed system and configuration files

Version check and ipsec on-path                       	 	   [OK]
Libreswan 3.15 (netkey) on 3.10.0-327.36.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]

使用一键脚本

需 root 权限

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/across/master/l2tp.sh
chmod +x l2tp.sh
./l2tp.sh

headlogo   Windard

但行好事,莫问前程

Blog

Opinion

Project

页阅读量:  ・  站访问量:  ・  站访客数: