Ubuntu 下搭建PPTPD VPN Server

转自:http://dickwu.com/posts/2012/01/1046.html

一、检查VPS的TUN-TAP支持

很多VPS购买时会有这个选项需要勾选,反正不要钞票最好大家都勾选~如果没有勾选也不要紧,发个Ticket让他打开~检测代码如下

# cat /dev/ppp
# cat /dev/net/tun

如果这两个命令输入后反馈是这样:

cat: /dev/ppp: No such device or address
cat: /dev/net/tun: File descriptor in bad state

那就是VPS支持TUN-TAP~下一步。

 二、安装PPTP

 $ sudo apt-get install pptpd

这一步安装PPTP,哗啦哗啦安装完成后,就是最重要的配置环节。

三、配置PPTP

首先配置pptpd.conf,建议用vim编辑

# vim /etc/pptpd.conf

ctrl+w找到

#localip 192.168.0.1
#remoteip 192.168.0.234-238,192.168.0.245

去掉前面的#号变成如下:

localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

接下来修改chap-secrets文件添加用户:

#vim /etc/ppp/chap-secrets

空白文件内容如下:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses

在client server secret IP address下,添加相应的属性
client下填写用户名,server下填写pptpd,secret下填写密码,IP address是许可的IP地址,由于中国是动态IP,所以填写*。用户一行一个~
修改后例子一枚:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
  user1         pptpd   1122333                 *
  user2         pptpd   1122333                 *

然后设置VPS的DNS防止VPN的DNS污染:

# vim /etc/ppp/options

ctrl+w找到ms-dns,去掉前面的#号修改为

ms-dns 8.8.8.8
ms-dns 8.8.4.4

打开VPS转发

# vim /etc/sysctl.conf

ctrl+w找到#net.ipv4.ip_forward=1,去掉#号

net.ipv4.ip_forward=1

最后重启pptpd,激活转发参数,并配置IPtables,三条命令如下~

# /etc/init.d/pptpd restart
# sysctl –p
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

————————————————————————————————————————–

1. 安装及配置.

1.1. 安装pptp
# apt-get install pptpd

1.2. 配置pptp

1.2.1. 编辑/etc/pptpd.conf
执行命令# vim /etc/pptpd.conf
文件内容如下:
option /etc/ppp/pptpd-options
#logwtmp
localip 192.168.9.1
remoteip 192.168.9.11-30

说明:
其中192.168.9.1是为了不和本地局域网的IP冲突
其中remoteip 192.168.9.11-30设置了当外部计算机通过pptp联接到vpn后所能拿到的ip地址范围和服务器的ip地址设置
其中/etc/ppp/pptpd-options指的是我们在1.2.2中编辑的文件
其中logwtmp注释掉

1.2.2. dns解析支持
执行命令# vim /etc/ppp/pptpd-options
文件内容如下:
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 208.67.220.220

说明:
name pptpd:pptpd server的名称。
refuse-pap:拒绝pap身份验证模式。
refuse-chap:拒绝chap身份验证模式。
refuse-mschap:拒绝mschap身份验证模式。
require-mschap-v2:在端点进行连接握手时需要使用微软的mschap-v2进行自身验证。
require-mppe-128:MPPE 模块使用 128 位加密。
ms-dns 8.8.8.8:ppp 为 Windows 客户端提供 DNS 服务器 IP 地址,第一个 ms-dns 为 DNS Master,第二个为 DNS Slave。
ms-dns 208.67.220.220:ppp 为 Windows 客户端提供 DNS 服务器 IP 地址,第一个 ms-dns 为 DNS Master,第二个为 DNS Slave。
proxyarp:建立 ARP 代理键值。
lock:锁定客户端 PTY 设备文件。
nobsdcomp:禁用 BSD 压缩模式。
novj:这个真没查到是干什么用的
novjccomp:禁用 Van Jacobson 压缩模式。
nologfd:禁止将错误信息记录到标准错误输出设备(stderr)。

1.2.3. 添加VPN用户.
执行命令# vim /etc/ppp/chap-secrets
username1 pptpd password1 *
username2 pptpd password2 *
说明:
其中username和passwd自己设定,其他的如pptpd和星号不用变。

5.允许转发
编辑/etc/sysctl.conf
执行命令# vim /etc/sysctl.conf
看一下net.ipv4.ip_forward=1前面是不是有井号,如果不是就把net.ipv4.ip_forward=1前面井号删掉
然后使新配置生效:
执行命令# sysctl -p
说明:
其中“-p”参数为从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

6.开启iptables转发
#./sbin/iptables -t nat -A POSTROUTING -s 192.168.9.0/24 -o eth0 -j MASQUERADE
如果你的iptable没开启这个也不需要开启.

7.重新启动pptp.
# /etc/init.d/pptpd restart

8.查看端口是否打开.
# netstat -antl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN
tcp 0 284 xxx.xxx.xxx.xxx:22 xxx.xxx.xxx.xxx:1027 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
其中
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN
是配置成功的证明

—————————————————————————————————————————-

 

因为众所周知的原因,目前Gmail等相关服务原来越不稳定,虽然可以通过SSH来解决,但是打开网站一多SSH也有些力不从心,VPS侦探以前发表过在Linode VPS安装PPTP VPN的教程,相对于PPTP来说OpenVPN加密型更强,而且穿透性更强。

本教程也适用其他的基于Debian/Ubuntu Linux的VPS/服务器,也已在DiaHostingVPSYOUPhotonVPS123Systems、oplink上测试通过,如有问题欢迎反馈。(Linode购买及测试教程:http://www.vpser.net/usa-vps/linode.html

如果您觉得本文对您有所帮助,并想购买 Linode VPS [1GB内存, 24GB SSD硬盘, 1个独立IP, 2TB流量/月 = 10美元/月],请点击 [链接]访问官网,购买时在Referral Code栏填写:8dbfedc418b92f8c07e6f03860ece56ea1bd1ec6 感谢。目前Linode仅支持Visa/Master信用卡,没有可以联系军哥代购,联系方式见右侧。

1、安装

apt-get install openvpn udev lzop

2、使用easy-rsa生成服务端证书

将OpenVPN所需的配置文件复制到/etc/openvpn/下面:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/

生产CA证书:

cd /etc/openvpn/easy-rsa/2.0
source vars
./clean-all
./build-ca

./build-ca时会提示输入一些信息,可以都直接回车按默认信息。

生成服务器端证书和密钥,server为名字可以自定义:

./build-key-server server

此 步也是会提示输入一些信息,前面的信息直接回车按默认信息,提示Sign the certificate? [y/n]:时输入y,提示1 out of 1 certificate requests certified, commit? [y/n] 也是输入y。

生成客户端证书和密钥,client为名字可以自定义,注意前面的./build-key-server与./build-key client输入的名字不能相同:

./build-key client

前面的信息直接回车按默认信息,提示Sign the certificate? [y/n]:时输入y,提示1 out of 1 certificate requests certified, commit? [y/n] 也是输入y

生成其他的客户端就是执行:./build-key 你想添加的客户端的名字。

生成的证书和密钥存放在/etc/openvpn/easy-rsa/2.0/keys/下面。

生成Diffie Hellman参数:

./build-dh

3、配置OpenVPN服务

编辑/etc/openvpn/server.conf 文件,如果没有可以创建一个,加入下面的内容:

local 服务器IP
port 8080 #端口,需要与客户端配置保持一致
proto udp #使用协议,需要与客户端配置保持一致
dev tun #也可以选择tap模式

ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
ifconfig-pool-persist ipp.txt

server 10.168.1.0 255.255.255.0 #给客户的分配的IP段,注意不要与客户端网段冲突!

push “redirect-gateway”
push “dhcp-option DNS 8.8.8.8”
push “dhcp-option DNS 8.8.4.4”

client-to-client
;duplicate-cn
keepalive 20 60

comp-lzo
max-clients 50

persist-key
persist-tun

status openvpn-status.log
log-append openvpn.log

verb 3
mute 20

按上述说明修改服务器IP,复制到VPS上是可以把注释信息删除。

安装iptables

apt-get install iptables   #如果已经安装可以跳过

设置IP转发

iptables -t nat -A POSTROUTING -s 10.168.0.0/16 -o eth0 -j MASQUERADE
iptables-save > /etc/iptables.rules

上面的eth0要替换为你的网卡标识,可以通过ifconfig查看。

在/etc/network/if-up.d/目录下创建iptables文件,内容如下:

#!/bin/sh
iptables-restore < /etc/iptables.rules

给脚本添加执行权限:

chmod +x /etc/network/if-up.d/iptables

修改/etc/sysctl.conf的内容为:

net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

重新载入/etc/sysctl.conf使其生效,执行如下命令:

sysctl -p

重启OpenVPN及网络:

/etc/init.d/openvpn restart
/etc/init.d/networking restart

4、安装配置OpenVPN客户端

下载客户端

打开http://openvpn.net/download.html,点击Windows Installer后的链接,下载OpenVPN Windows客户端。

下载完成后,安装,安装中的选项全部按默认即可。

下载客户端证书及密钥:

证书和密钥存放在/etc/openvpn/easy-rsa/2.0/keys/下面,可以使用winscp链接到VPS上下载。

将/etc/openvpn/easy-rsa/2.0/keys/下面的ca.crt、client.crt、client.key下载到C:\Program Files\OpenVPN\config 下面。

创建客户端配置文件

在C:\Program Files\OpenVPN\config 下面创建一个linode.ovpn的文件,添加如下内容:

client
dev tun       #要与前面server.conf中的配置一致。
proto udp              #要与前面server.conf中的配置一致。
remote 服务器IP 8080    #将服务器IP替换为你的服务器IP,端口与前面的server.conf中配置一致。
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
redirect-gateway
keepalive 20 60
#tls-auth ta.key 1
comp-lzo
verb 3
mute 20
route-method exe
route-delay 2

5、OpenVPN客户端连接测试:

运行OpenVPN GUI,会在屏幕右下角的系统托盘区,会显示右击该图标,会在菜单中出现我们添加的服务器,点击Connect,OpenVPN客户端就会开通链接OpenVPN服务器,过一会儿,OpenVPN图标变成绿色就是链接成功了。

—————————————————————————————————————

问题

IPtables中SNAT和MASQUERADE的区别

解决方案

IPtables中可以灵活的做各种网络地址转换(NAT)

网络地址转换主要有两种:SNAT和DNAT

SNAT是source network address translation的缩写

即源地址目标转换

比如,多个PC机使用ADSL路由器共享上网

每个PC机都配置了内网IP

PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip

当外部网络的服务器比如网站web服务器接到访问请求的时候

他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip

这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了

所以叫做SNAT,基于源地址的地址转换

DNAT是destination network address translation的缩写

即目标网络地址转换

典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip

互联网上的访问者使用公网ip来访问这个网站

当访问的时候,客户端发出一个数据包

这个数据包的报头里边,目标地址写的是防火墙的公网ip

防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip

然后再把这个数据包发送到内网的web服务器上

这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了

即DNAT,基于目标的网络地址转换

MASQUERADE,地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别

但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT –to-source 192.168.5.3

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT –to-source 192.168.5.3-192.168.5.5

这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址

但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip

假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变

而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址

这个时候如果按照现在的方式来配置iptables就会出现问题了

因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的

每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip

这样是非常不好用的

MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT

比如下边的命令:

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

如此配置的话,不用指定SNAT的目标ip了

不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去

这样就实现了很好的动态SNAT地址转换