标签 vpn 下的文章

OpenSSH建立二层和三层加密隧道

OpenSSH 可以使用tun/tap设备来创建一个加密隧道,SSH隧道类似mode TCP模式下的OpenVPN,对于有需求快速设置一个基于IP的VPN来说非常方便。使用SSH隧道的优点:

  1. 不需要安装和配置额外的软件
  2. 使用SSH认证并自带加密,不需要使其它VPN软件一样配置共享密钥或者证书
  3. 兼容性强,可以建立二层隧道或三层隧道,所有3/4层协议如:ICMP、TCP/UDP 等都可支持
  4. 配置过程简单

当然也有缺点:

  1. 基于TCP协议,其传输效率较低
  2. 隧道依赖于单个TCP连接,容易中断或假死
  3. 需要ROOT权限

这里还要说明一下二层和三层的区别:

  • layer 2 : 交换单元是帧,只识别MAC地址,只有交换功能,相关协议:Ethernet、VLAN、STP、PPP、FDDI、ARP(OSI模型)、MPLS(介于2层3层之间)等,在Linux中是虚拟点对点设备,显示为tap
  • layer 3 : 交换单元是包,能识别MAC地址和IP,有交换和路由功能,相关协议:IP、ICMP、IGMP、IPsec等,在Linux中是虚拟以太网设备,显示tun

在Linux中tun/tap都可以设置IP,只是模拟的工作层有区别,tun是模拟三层网络设备,收发的是IP包,无法处理以太网数据帧。tap模拟的是二层设备,收发的是以为网数据帧,更接近物理网卡,可以和物理网卡通过网桥绑定。我们日常用的wmware虚拟机中的nat网络,对应的就是tun,桥接网络对应的就是tap。

一、ssh server端配置

首先要使用ssh的二层和三层隧道,尽量保证系统差别不要太大,我这里两边都是oracle linux 8,SSH版本更新到最新。server端需要允许root登录和隧道,编辑/etc/ssh/sshd_config:

PermitRootLogin yes
PermitTunnel yes
#建议添加
TCPKeepAlive yes

PermitTunnel yes代表允许point-to-point (layer 3)和ethernet (layer 2)

二、三层隧道配置

2.1 建立三层隧道

在client端执行:

ssh -w any:any  root@[server_ip] 

如果客户端和服务器端没有其它的tun设备,就会在客户端和服务器端各生成一个名为tun0设备,指定any可以自动分配可用的设备。查看设备:

[root@centos8 ~]# ip addr
3: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 500
    link/none 

可以看到有个tun0 <POINTOPOINT,MULTICAST,NOARP>,这个设备是未激活的状态,如果用ifconfig命令查看,需要加上-a参数才能看到。

为安全起见,建议使用以下命令:

ssh -NTCf -w 5:5 root@[server_ip]
  • “-N”:不执行远程命令
  • “-T”:不分配终端
  • “-C”:压缩传输的流量
  • “-f”:在客户端后台运行

执行完该命令client和server各自会创建一个tun5的点对点设备,下一步就是需要激活设备并分配IP。

2.2 分配IP并激活隧道

分配IP不要与服务器和客户端网段有冲突,这里假设:

客户端IP:10.0.0.2 tun5
服务器IP:10.0.0.1 tun5

服务器激活点对点设备并分配IP和路由:

ip link set tun5 up
ip addr add 10.0.0.1/32 peer 10.0.0.2 dev tun5

客户端同理:

ip link set tun5 up
ip addr add 10.0.0.2/32 peer 10.0.0.1 dev tun5

这时隧道已经建立成功,此时用查看一下状态:

[root@centos8 ~]# ip addr
14: tun5: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none 
    inet 10.0.0.1 peer 10.0.0.2/32 scope global tun5

可以看到比之前多了“UP,LOWER_UP”,说明已经激活。正常情况下客户端和服务器已经可以相互ping。

客户端用一条命令也能搞定:

ssh \
  -o PermitLocalCommand=yes \
  -o LocalCommand="ip link set tun5 up && ip addr add 10.0.0.2/32 peer 10.0.0.1 dev tun5 " \
  -o TCPKeepAlive=yes \
  -w 5:5  root@[server_ip] \
  'ip link set tun5 up && ip addr add 10.0.0.1/32 peer 10.0.0.2 dev tun5'
  

2.3 添加其它网段的路由

如果服务器端有其它内网段,需要继续添加客户端路由才能ping通,例如,客户端想与服务器端网段10.0.12.0/24互通,需在客户端执行:

ip route add  10.0.12.0/24 dev tun5

按需添加即可,更改路由是高风险操作,需要格外小心,同时也要确保ssh连接不要中断。

三、二层隧道配置

由于linux中允许为tap设备设置ip,所以二层隧道和三层隧道也可以完全一样的进行配置。区别是tap设备可以和物理网卡进行绑定,也就是桥接,同时由于工作在二层,允许Arp通过,能支持STP生成树、PPP等协议。

3.1 建立二层隧道

在客户端执行:

ssh  -o Tunnel=ethernet -w 6:6    root@[server_ip] 

这里参数 -o 需要在 -w 前面,查看一下客户端和服务器的网卡:

[root@centos8 ~]# ip addr
20: tap6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

在ip命令中 tap6: <BROADCAST,MULTICAST>,和物理网卡显示的一样,说明模拟的是物理网卡。

3.2 创建并配置网桥

二层可以进行网卡桥接,桥接可以多块网卡,也可以一块网卡,这里测试为了省事只用一块网卡,创建网桥有三种工具:

  1. 使用bridge-utils中的brctl命令
  2. 使用oracle linux 8 系列自带的nmcli
  3. 使用ip命令

建议用ip命令建立:

ip link add br0 type bridge

将tap6加入网桥:

ip link set tap6 master br0

配置服务器端网桥IP信息并启动网桥:

ip address add 10.0.0.1/32 dev br0
ip link set tap6 up
ip link set br0 up

客户端流程一样,只是客户端的ip是10.0.0.2

在客户端测试ARP包能不能通过:

[root@oracle8 ~]# arping -I br0 10.0.0.1
ARPING 10.0.0.1 from 10.0.0.2 br0
Unicast reply from 10.0.0.1 [3A:E7:2F:3F:42:24]  193.222ms
Unicast reply from 10.0.0.1 [3A:E7:2F:3F:42:24]  191.903ms

如果是三层隧道,就无法使用arping。

看似很多内容,其实使用很简单,OpenSSH套件功能真强大。

参考文章
https://help.ubuntu.com/community/SSH_VPN
https://www.cyberciti.biz/faq/centos-8-add-network-bridge-br0-with-nmcli-command/
https://gobomb.github.io/post/build-l2-l3-vpn-by-openssh/

体验Wireguard的简单之美

wireguard是Linus Torvalds为数不多夸过的技术,称赞它是:it's a work of art。

wireguard优点和缺点官网有很好的介绍,我简单总结一下,优点:

  1. 快速 速度是比传统的IPsec和OpenVPN等快的多,已经合并到高版本的内核,性能更高
  2. 现代 有良好的设计及考量
  3. 简单 源代码只有三四千行,同时管理和配置也非常简单
  4. 安全 使用了最先进的加密技术,并且经过多位密码学家的审查,而且由于简单,攻击面更小
  5. 通用 跨平台,支持各种操作系统

缺点:

  1. Wireguard专注实现简单可靠的加密,不关注流量混淆,容易被DPI检测到,同时由于特征明显,流量有可能被中继或在握手阶段阻断
  2. 专注性能,只能使用UDP,不支持TCP模式,当然可以借助udptunnel和udp2raw等软件实现
  3. 使用最先进的算法,没有专有硬件加速支持,有可能导致CPU使用率高或DoS,这点现代的cpu基本无需担心
  4. 非量子安全

总结一下,wireguard配置简单且安全高效,适合服务器之间互联。由于国内udp限速及特征明显,不适合个人当梯子用。

一、服务器端安装wireguard

如果系统是BSD之类的系统安装在用户空间,直接安装即可,如果是linux系统强烈建议使用最新的发行版,并更新内核到最新。

1.1 更新内核并重启

Centos系列:

yum update  -y  
reboot

1.2 安装epel源及ELRepo源:

centos 7系统:

sudo yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
sudo yum install yum-plugin-elrepo

centos 8系统:

dnf install elrepo-release epel-release -y

安装wireguard:

sudo yum install kmod-wireguard wireguard-tools -y

二、配置服务器端

2.1 创建wireguard配置目录并生成公私钥:

mkdir -p /etc/wireguard/
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

2.2 编辑wireguard的配置文件

vim /etc/wireguard/wg0.conf

写入以下内容:

[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = 生成的server_private.key内容

[Peer]
PublicKey = 客户端的client public.key内容
AllowedIPs = 10.10.0.2/32

客户端的公钥需在客户端生成,并替换这里的内容,已可以在执行一下2.1节中的命令,生成另外一对公私钥供客户端使用。

设置权限,只允许root读取wireguard内容:

 chmod 600 /etc/wireguard/ -R

2.3配置ip forwarding及防火墙

2.3.1 配置ip forwarding:

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

使以上配置生效:

sysctl -p

2.3.2 配置地址伪装并放行端口

centos 7有firewalld和iptables两种防火墙,如果使用firewalld作为防火墙:

firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --permanent --add-port=51820/udp
systemctl reload firewalld

如果使用iptables作为防火墙:

iptables -A FORWARD -i wg0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
iptables -I INPUT 1 -p udp --dport 51820 -j ACCEPT

ip6tables -A FORWARD -i wg0 -j ACCEPT
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -I INPUT 1 -p udp --dport 51820 -j ACCEPT

2.4启动服务器端

可以使用wg-quick或者systemctl进行管理,使用wg-quick命令:

启动wireguard:

wg-quick up /etc/wireguard/wg0.conf

关闭wireguard:

wg-quick down /etc/wireguard/wg0.conf
wg-quick down wg0

或者使用systemctl命令:

systemctl start wg-quick@wg0.service

查看启动日志:

journalctl -eu wg-quick@wg0.service

设置为开机启动:

systemctl enable wg-quick@wg0.service

启动成功后,使用ifconfig命令即可看到wg0的网卡,使用wg命令可以看到详细的信息。

三、客户端配置

wireguard在各平台都有客户端,下载地址: https://www.wireguard.com/install/

3.1 客户端配置

如果开客户端是图形界面,一般打开客户端就有生成公私钥对的选项;如果是客户端也是linux等服务器系统,可以按上面服务器端的生成方法,使用已有的公私钥对也可以。

客户端配置文件:

[Interface]
PrivateKey = 客户端自己的私钥
Address = 10.10.0.2/32
DNS = 1.1.1.1,8.8.8.8

[Peer]
PublicKey = 服务器端的公钥
#PresharedKey = XXX    # 可选
AllowedIPs = 0.0.0.0/0
Endpoint = 服务器公网地址:51820
PersistentKeepalive = 10

客户端有几个配置需注意:

  1. 这里需将客户端的公钥,添加到2.2节中的服务器端配置中,并重启服务器端
  2. AllowedIPs = 0.0.0.0/0 表示客户端所有流量都通过VPN服务器中转,即全局代理
  3. PersistentKeepalive = 10,每10秒发送keepalive心跳,如果没有此配置,客户端连接后,需在有流量活动的情况下才会激活连接
  4. DNS建议使用公共dns,如果服务器端有配置dns server,可以指定成服务器端vpn的IP
  5. PresharedKey 预共享密钥能增强安全性,每个peer均不相同,通过“wg genpsk”命令生成

启动客户端后,在服务器端使用wg命令查看是否有客户端信息,并测试客户端到服务器、服务器到客户端的连接情况。

多个客户端时,需在server端配置多个peer,每个peer指定独立的静态ip和各自的公钥。

四、一些技巧

wireguard支持PreUp、PostUp、PreDown、PostDown参数,可以在wireguard启动、关闭前后执行一些自定义脚本或命令,实现一些特殊的需求。

4.1 设置策略路由

wiregard提供Table参数进行设置路由表,Table默认值是auto,由wireguard自动设置路由,也可以按需创建路由表,并设置策略路由,客户端和服务器端都可以设置该参数。在 [interface] 下面添加以下的配置即可:

Table = 1234
PostUp = ip rule add ipproto tcp dport 25 table 1234
PreDown = ip rule delete ipproto tcp dport 25 table 1234

4.2 通过AllowedIPs进行ACL设置

AllowedIPs控制了哪些流量允许使用该vpn,未匹配的流量会直连。个人翻墙时会使用全局VPN,但服务器之间连接时,基本不会把wiregaurd当做全局VPN使用。设置这里就非常方便。

AllowedIPs = 0.0.0.0/0,::/0 表示所有ipv4及ipv6的流量都要走vpn,适合个人用户。
AllowedIPs = 10.10.0.0/24,192.168.1.0/24 表示只有目的IP是这两个网段时走wireguard,其余流量走服务器默认的路由。

4.3 VPN kill switch功能

VPN Kill Switch 持续监控客户端与VPN服务器的连接,连接意外断开时会阻止设备客户端访问网络。从而防止泄露客户端的隐私。很多商业VPN都提供该功能,实现起来很简单,通过PreDown、PostDown执行更改客户端的防火墙、路由表、或者网卡配置即可。

五、故障排查

5.1 查看wireguard日志

wireguard的客户端都会有连接的日志,查看wireguard服务器端日志只能通过查看内核日志的方方式,内核要支持Dynamic Debugging,正常情况下需编译内核开启CONFIG_DYNAMIC_DEBUG,有些发型版已经默认开启。可以执行以下命令进行查看:

mount | grep debug

debugfs on /sys/kernel/debug type debugfs (rw,relatime)

如果和上面的显示一样,就说明已开启。配置开启调试日志:

modprobe wireguard 
echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

开启之后,可以通过以下两个命令查看日志:

 dmesg -wH
 journalctl -kf

由于wireguard对低版本内核支持不好,实际测试中centos 7系统日志很少,centos 8系统日志就比较详细,这也是为什么安装wireguard之前建议升级内核的原因。

5.2 其它遇到的故障

报错1: linux做为客户端时启动wireguard报错: RTNETLINK answers: Operation not supported

该报错需重启服务器或客户端

报错2: vpn服务器ping客户端时报错: ping: sendmsg: Required key not available

该错最有可能是服务器端的peer部分AllowedIPs配置不对,网上一些教程使用SaveConfig=true,该配置是在关闭或重启wireguard时才添加配置,导致如果客户端连接后如果服务器端未重启,就会出现该错误,不建议使用saveConfig=true。

报错3: 服务器端ping客户端时提示: ping: sendmsg: Destination address required
一般是服务器端更改配置后,客户端未重新连接,客户端重新连接即可

报错4: 启动wireguard时报错: Error: Unknown device type. Unable to access interface: Protocol not supported 或执行 modprobe wireguard 命令报错: modprobe: FATAL: Module wireguard not found in directory

这个错误通常是因为升级内核导致的,wireguard的内核模块安装在旧版内核上,新内核没有wireguard模块,解决方法是卸载旧版内核、旧版kernel-header、旧版kernel-devel等,重新安装wireguard即可。

报错5: yum或dnf无法安装kmod-wireguard

dnf install kmod-wireguard
Repository epel is listed more than once in the configuration
Last metadata expiration check: 1:02:21 ago on Thu 13 May 2021 02:45:45 PM HKT.
Error: 
 Problem: cannot install the best candidate for the job
  - nothing provides kernel(__skb_flow_dissect) = 0xd82bed9c needed by kmod-wireguard-3:1.0.20210424-1.el8_3.elrepo.x86_64
  - nothing provides kernel(flow_keys_basic_dissector) = 0xa7e38f12 needed by kmod-wireguard-3:1.0.20210424-1.el8_3.elrepo.x86_64
  - nothing provides kernel(ipv6_stub) = 0xf3965b90 needed by kmod-wireguard-3:1.0.20210424-1.el8_3.elrepo.x86_64
  - nothing provides kernel(totalram_pages) = 0xde9360ba needed by kmod-wireguard-3:1.0.20210424-1.el8_3.elrepo.x86_64
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

此错误是因为centos stream系统默认没有wireguard导致,需执行以下命令启用COPR库中的wireguard:

dnf install epel-release
dnf copr enable jdoss/wireguard
dnf install wireguard-dkms wireguard-tools

综上,配置非常简单,功能可玩性高!

参考文章:
https://www.wireguard.com/
https://www.linuxbabe.com/centos/wireguard-vpn-server-centos

openvpn的搭建与使用

openvpn多数人用来科学上网,能保证安全性与速度,同时配置和稳定性也非常好。我在生产环境中也使用了很久,但比较懒一直都没有整理文档,这次正好有两台服务器之间要做加密连接,简单整理了一下

一、安装

下载:


wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.11.tar.gz

依赖包:

yum install gcc gcc-c++ make  -y
yum install lzo lzo-devel -y
yum install pam pam-devel -y
yum install openssl openssl-devel -y

编译和安装:

./configure --prefix=/usr/local/openvpn
make && make install

epel源里有openvpn,也可以用yum 安装:


yum install -y epel-release
yum install openvpn easy-rsa

二、SSL证书生成

easy-rsa是openvpn生成服务端证书的脚本,自openvpn 2.3开始easy-rsa已经独立出来,下载:

git clone https://github.com/OpenVPN/easy-rsa
cd easy-rsa/easyrsa3/

初始化生成证书所需的信息,按实际情况修改:

cp vars.example vars

取消并修改以下选项:

set_var EASYRSA_REQ_COUNTRY     "CN"
set_var EASYRSA_REQ_PROVINCE    "Hongkong"
set_var EASYRSA_REQ_CITY        "Hongkong"
set_var EASYRSA_REQ_ORG         "NIXOPS.ME"
set_var EASYRSA_REQ_EMAIL       "admin@nixops.me"
set_var EASYRSA_REQ_OU          "Nixops Openvpn"

其它参数可以默认,也可以按需修改

初始化并创建ca根证书:

./easyrsa init-pki
./easyrsa build-ca

一路回车即可,ca证书需要输入密码,这个密码是给服务器端和客户端签名时用的
创建并签名服务器端证书:

./easyrsa gen-req server-ssl nopass
./easyrsa sign server server-ssl

同样一路回车即可
创建Diffie-Hellman证书,该证书主要作用是确保共享KEY安全穿越不安全网络:

./easyrsa gen-dh

创建并签名客户端证书:

./easyrsa gen-req client-ssl nopass
./easyrsa sign client client-ssl

所有证书文件:

[root@nixops.me easyrsa3]# tree pki
pki
├── ca.crt    -->ca证书, server/client 都需要
├── certs_by_serial
│   ├── 01.pem
│   └── 02.pem
├── dh.pem    -->Diffie-Hellman证书,server端需要
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── issued
│   ├── client-ssl.crt    --> 客户端证书
│   └── server-ssl.crt    --> 服务器端证书
├── private
│   ├── ca.key
│   ├── client-ssl.key    --> 客户端私钥
│   └── server-ssl.key    --> 服务器端私钥
├── reqs
│   ├── client-ssl.req
│   └── server-ssl.req
├── serial
└── serial.old

三、配置openvpn服务器端和客户端

3.1 服务器端配置

openvpn的源码目录中已经有配置模版了,复制模版:

[root@nixops.me openvpn-2.3.11]# cp   sample/sample-config-files/server.conf  /etc/openvpn/

复制证书文件:

[root@nixops.me easyrsa3]# cp pki/ca.crt pki/issued/server-ssl.crt pki/private/server-ssl.key /etc/openvpn/

贴一份服务器端配置:

#openvpn监听本地ip地址,可选
;local a.b.c.d
#监听tcp或udp端口,如果有多个服务端,要设置不同的端口
port 1194
#tcp模式还是udp模式
proto tcp
#虚拟网络接口类型:1. TUN :路由模式,工作在三层,无物理地址,效率高;无法与物理网卡桥接,会无视广播包,客户端可以是TUN/TAP
#2. TAP :桥接模式,工作在二层,有物理地址,效率不如TUN;可以与物理网卡桥接,广播包可以通过,客户端必须是TAP
dev tun
#证书配置
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server-ssl.crt
key /etc/openvpn/server-ssl.key
dh /etc/openvpn/dh.pem
#客户端使用的网段
server 10.8.0.0 255.255.255.0
#维持客户和ip的对应关系,重连后能保持虚拟ip
ifconfig-pool-persist ipp.txt
#为客户端推送路由,允许客户端访问其它网段
;push "route 192.168.10.0 255.255.255.0"
#设置所有客户端默认网关为VPN,所有流量经过vpn
;push "redirect-gateway def1 bypass-dhcp"
#为客户端推送DNS
;push "dhcp-option DNS 208.67.222.222"
#允许客户端之间互相访问
client-to-client
#允许多个客户端使用相同证书连接
duplicate-cn
#存活检测,每10秒检测一次,120秒未响应则认为连接丢失
keepalive 10 120
#对数据进行压缩,server和client 需保持一致
comp-lzo
#最大客户端数量
;max-clients 100
#重新连接时,不重新读取key和保持tun/tap设备在线
persist-key
persist-tun
#记录openvpn状态信息
status openvpn-status.log
#记录并追加日志
;log         openvpn.log
;log-append  openvpn.log
#日志级别
verb 5

前台启动,检查配置是否正确:

/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server.conf

如果启动没有错误,即可以daemon后台运行server:

/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf

开启路由转发:

sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
sysctl -p

防火墙策略配置:

允许vpn客户端所在网段流量转发到其它网卡:

iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT

将vpn客户端的流量转到eth0,允许vpn客户端上网,即NAT:

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

还需根据vpn服务器端的工作模式放开tcp/udp的1194端口,这个规则就不写了

3.2 客户端配置

客户端各系统下都有现成包,配置是通用的,我这里还是在linux下使用openvpn的客户端。

复制一份样板:

cp sample/sample-config-files/client.conf /etc/openvpn/

直接贴一份配置:

client
dev tun
proto tcp
remote openvpn.nixops.me  1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client-ssl.crt
key /etc/openvpn/client-ssl.key
remote-cert-tls server
comp-lzo
verb 3

多个vpn client在不同的内网时,可以在client.conf中根据client的网段push路由,会比在server.conf中指定更方便
测试启动:

/usr/local/sbin/openvpn --config /etc/openvpn/client.conf 

启动:

/usr/local/sbin/openvpn --daemon --config /etc/openvpn/client.conf --log /var/log/openvpn.log

总的来说配置还是比较简单的

openvpn添加本地路由表

默认情况下,VPN连接成功后会自动增加一些路由,并把网关设置成vpn的,所以所有的流量都会通过VPN来传送,但是如果使用openvpn,可以自己修改路由,指定某些ip走vpn,或者某些ip不走vpn,从而达到节省流量或者提高访问速度的目的。openvpn有两种方法修改路由表:

1.从客户端修改

这种情况只要改本地配置文件即可,服务器不需要修改。适合客户端比较多且网络条件比较复杂,某些客户端有定制路由的需求,或者临时有修改的情况。例如打开openvpn的配置文件open.ovpn,在“max-routes 1000” 后加入相应的路由就:

route 172.16.100.0 0.0.0.0 net_gateway
route 10.252.252.0 255.255.255.0 net_gateway
route 103.103.103.0 255.255.255.0 net_gateway

最后一个参数“net_gateway”表示强行指定IP段不使用vpn,还有一个正好相反的“vpn_gateway”强行指定IP段使用VPN。

2.在服务器端配置
在服务器中配置推送全局路由,客户端不需要更改任何配置,适合客户端网络条件比较相似的情况。在openvpn服务器的配置文件中加入:

push "route 172.16.100.0 0.0.0.0 net_gateway"
push "route 10.252.252.0 255.255.255.0 net_gateway"
push "route 192.168.1.0 255.255.255.0 net_gateway"
重启服务:
killall openvpn
openvpn --daemon --config /etc/openvpn/2.0/conf/server.conf

windows/linux下都可以用“ netstat -nr ”来查看路由是否添加成功。
当然windows/linux下也可以用route命令永久添加路由,采用什么方法,看你的需求和习惯了。

参考文章:
http://xiaolife.com/wordpress/use-openvpn-route-and-vpn_gateway/

amazon aws 搭建pptp VPN服务器

根据我的测试,亚马逊日本机房在国内的速度是最快的,我是深圳电信最慢的时候ping值在190ms左右,快点时候在100ms以内,下面说下centos 6 32位/64位下搭建pptp VPN的过程,不仅适用aws,其他服务商也是通用的。

一、新建服务器

在日本区launch一个新服务器,由于使用不多,机型选micro instance系统选择 centos 6,32位或者64位都可以,最好不要使用amazon instance store的镜像,因为使用以后无法直接创建ebs ami镜像,如果有问题维护起来不那么方便。新建完成后记得在secruity groups打开1723端口。

二、安装

2.1需要的软件

检查内核是否包含mppe,基本上CentOS都有的,输入这个命令,如果是ok就可以:

modprobe ppp-compress-18 && echo ok

安装PPTP需要ppp和iptables这两个软件支持,这里用yum来安装,输入这个命令:

yum install -y ppp iptables

iptables centos系统都是自带的

2.2下载安装包

下载pptpd和ppp的rpm包并安装,要注意ppp和pptpd包的版本需要对应,也可以使用yum安装

方法1下载安装包安装,32位:

cd /tmp
wget http://poptop.sourceforge.net/yum/stable/rhel6/i386/dkms-2.0.17.5-1.noarch.rpm
wget http://poptop.sourceforge.net/yum/stable/rhel6/i386/ppp-2.4.5-23.0.rhel6.i686.rpm
wget http://poptop.sourceforge.net/yum/stable/rhel6/i386/pptpd-1.3.4-2.el6.i686.rpm
rpm -ivh dkms-2.0.17.5-1.noarch.rpm
rpm -ivh ppp-2.4.5-23.0.rhel6.i686.rpm
rpm -ivh pptpd-1.3.4-2.el6.i686.rpm

64位:

cd /tmp
wget http://poptop.sourceforge.net/yum/stable/rhel6/x86_64/dkms-2.0.17.5-1.noarch.rpm
wget http://poptop.sourceforge.net/yum/stable/rhel6/x86_64/ppp-2.4.5-23.0.rhel6.x86_64.rpm
wget http://poptop.sourceforge.net/yum/stable/rhel6/x86_64/pptpd-1.3.4-2.el6.x86_64.rpm
rpm -ivh dkms-2.0.17.5-1.noarch.rpm
rpm -ivh ppp-2.4.5-23.0.rhel6.x86_64.rpm
rpm -ivh pptpd-1.3.4-2.el6.x86_64.rpm

方法2使用yum安装:

rpm -i http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm
yum -y install pptpd ppp

2.3配置

2.3.1 options.pptpd

编辑配置文件/etc/ppp/options.pptpd 内容如下(将原文件备份,新建一个文件输入下面内容):

name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
ms-dns 8.8.8.8
ms-dns 8.8.4.4

options.pptpd文件只需要增加ms-dns的配置,其他默认即可。

2.3.2 pptpd.conf

编辑配置文件/etc/pptpd.conf 内容如下(将原文件备份,新建一个文件输入下面内容):

option /etc/ppp/options.pptpd
logwtmp
localip 172.16.36.0
remoteip 172.16.36.1-40
2.3.3 chap-secrets

编辑配置文件/etc/ppp/chap-secrets,配置用户名为52os,密码为52os.net,内容如下:

52os pptpd 52os.net *

格式为(用户 pptpd 密码 允许访问的ip)一行一个

2.3.4 /sysctl.conf

修改配置文件/etc/sysctl.conf,允许包转发:

net.ipv4.ip_forward = 1
sysctl -p
2.3.5 iptables

配置/etc/sysconfig/iptables,
允许GRE协议:

iptables -A INPUT -p gre -j ACCEPT
    iptables -A INPUT -p tcp --dport 1723 -j ACCEPT

如果没有允许GRE协议(第47号协议)和pptpd开启的1723端口,在一些情况下会导致VPN用户无法注册

转发vpn流量:

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

设置iptables和pptpd开机自动启动:

chkconfig pptpd on
chkconfig iptables on

三、测试

使用windows或者手机新建一个vpn连接,拨号测试是否成功

四、遇到的问题

1. 无法连接成功

日志中:

Dec  8 06:38:21 web pptpd[20551]: GRE: read(fd=6,buffer=6124a0,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs
Dec  8 06:38:21 web pptpd[20551]: CTRL: PTY read or GRE write failed (pty,gre)=(6,7)

解决方法:

iptables -A INPUT -p gre -j ACCEPT

2.日志中报错

Sep  9 13:01:27 digitalocean kernel: conntrack: generic helper won't handle protocol 47. Please consider loading the specific helper module.

解决方法:

修改/etc/pptpd.conf,去掉logwtmp这一行

3.日志中报错

Sep  9 13:10:38 digitalocean pppd[2137]: LCP: timeout sending Config-Requests

解决方法:

modprobe nf_nat_proto_gre
modprobe nf_conntrack_pptp

修改 /etc/ppp/options,加入将默认的lock改为 silent,如果还不行,尝试清空该文件

3.能拨号成功,无法上网

无法上网有如下几个地方要检查:

  1. ms-dns配置
  2. net.ipv4.ip_forward 是否打开
  3. iptables 规则是否正确或有冲突

在一些系统中,系统装好后默认会有下面两条规则,会和流量转发的规则冲突需注释掉:

-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

参考文档

http://sqsa110.blog.163.com/blog/static/182616369201162105819194/
https://www.digitalocean.com/community/tutorials/how-to-setup-your-own-vpn-with-pptp
http://blog.solidshellsecurity.com/2013/01/11/ctrl-pty-read-gre-write-failed-ptygre67/

最新文章

最近回复

  • immortal: 大佬好强!!!
  • myogg: 您好,这个能不能将发...
  • 大青蛙子: 照着大佬的命令行复刻...
  • see: 把虚拟机平台下面其他...
  • see: 感觉是兼容性问题,我...
  • see: 做了。因为inter...
  • see: 遇到一个ipv6问题...
  • pluveto: 这功能很好
  • mgt: 从fail2ban的...
  • see: 设置容器 allo...

分类

归档

统计

  • 文章总数:169篇
  • 分类总数:5个
  • 评论总数:130条
  • 页面总数:173个
  • 本站运行:5262天

其它