Centos下PPTP環境部署記錄

散盡浮華發表於2017-01-21

 

PPTP(點到點隧道協議)是一種用於讓遠端使用者撥號連線到本地的ISP,通過因特網安全遠端訪問公司資源的新型技術。它能將PPP(點到點協議)幀封裝成IP資料包,以便能夠在基於IP的網際網路上進行傳輸。PPTP使用TCP(傳輸控制協議)連線的建立,維護,與終止隧道,並使用GRE(通用路由封裝)將PPP幀封裝成隧道資料。被封裝後的PPP幀的有效載荷可以被加密或者壓縮或者同時被加密與壓縮。常見的PPTP都是在路由器上配置的,不過linux下也可以實現PPTP伺服器的功能。別的也不多說了,下面直接記錄下Centos下部署PPTP的VPN環境過程:

1)驗證PPP
用cat命令檢查是否開啟ppp,一般伺服器都是開啟的,除了特殊的VPS主機之外。
[root@bastion-IDC ~]# cat /dev/ppp
cat: /dev/ppp: No such device or address
cat出現上面結果,則說明ppp是開啟的,可以正常的配置pptp了。

2)安裝PPP
[root@bastion-IDC ~]# yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers
[root@bastion-IDC ~]# yum -y install ppp iptables
iptables一般情況預設都是系統裝好後就已經有了,安裝iptables是為了做NAT,讓PPTP客戶端能夠通過PPTP伺服器上外網。

3)安裝PPTP(這裡選擇rpm包安裝,也可以選擇原始碼包安裝)
下載地址:https://pan.baidu.com/s/1dFIGpyx
提取密碼:cefm
[root@bastion-IDC ~]# rpm -ivh pptpd-1.3.4-2.el6.x86_64.rpm

4)配置pptp
/etc/pptpd.conf是pptpd的基本配置檔案;
[root@bastion-IDC ~]# vim /etc/pptpd.conf
.......
option /etc/ppp/options.pptpd    //指定pptpd擴充套件屬性配置檔案options.pptpd 的位置
logwtmp
debug               //開啟除錯模式,有關 pptpd 的資訊和錯誤都會記錄在 /var/logs/message 中,方便排錯和除錯
stimeout 30      //設定客戶端連線 pptpd server 時的最長連線等待時間(連線超時時間),30 秒
localip 192.168.1.5       //pptp伺服器端IP,可以設定為伺服器上繫結的任意一個IP地址(比如這裡設定內網ip)
remoteip 192.168.100.101-150       //客戶端成功連線VPN後獲取的IP地址範圍(可以和pptp伺服器在同一內網段內,但是建議不要設定和PPTP伺服器內網一樣的網段)

[root@bastion-IDC ~]# vim /etc/ppp/options.pptpd
......
name pptpd      //pptpd server 的名稱(這個很重要,在下面新增VPN賬戶配置裡會用到)
debug        //開啟除錯模式,相關資訊同樣記錄在/var/logs/message中
ms-dns 8.8.8.8      //修改成為VPN使用者分配的dns地址
ms-dns 8.8.4.4

5)新增vpn的帳號和密碼

[root@bastion-IDC ~]# vim /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client    server  secret          IP addresses
xqsj pptpd xqsj@123 *

解釋:
一行新增一個賬號,每個帳號需要新增的4個欄位,分別為:使用者名稱、服務、密碼、分配的ip地址如果IP為*,則表示隨機分配,分配範圍採用pptp.conf中的設定

6)開啟系統的ip路由轉發功能
[root@bastion-IDC ~]# echo 1 > /proc/sys/net/ipv4/ip_forward         //臨時開啟,重啟伺服器後失效
[root@bastion-IDC ~]# vim /etc/sysctl.conf             //永久開啟
.....
net.ipv4.ip_forward = 1
[root@bastion-IDC ~]# sysctl -p

7)啟動服務
[root@bastion-IDC ~]# /etc/init.d/pptpd start
Starting pptpd: [ OK ]
[root@bastion-IDC ~]# lsof -i:1723          //PPTP服務預設埠是1723
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
pptpd 19714 root 6u IPv4 33130051 0t0 TCP *:pptp (LISTEN)

將服務配置為開機自動啟動
[root@bastion-IDC ~]# chkconfig pptpd on

8)配置iptables轉發
[root@bastion-IDC ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 133.110.186.55   //確保客戶機連上VPN後能正常上網
[root@bastion-IDC ~]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 1723 -j ACCEPT
[root@bastion-IDC ~]# /etc/init.d/iptables save
[root@bastion-IDC ~]# /etc/init.d/iptables restart
上面命令表示:
讓192.168.100.0這個段的ip地址(即pptpd.conf配置的remoteip地址段)可以通過133.110.186.55這個公網IP訪問外網。
其中133.110.186.55是pptp部署機的公網ip地址,否則撥上來的VPN使用者只能訪問內網。
開通pptp服務埠1723訪問

9)接著就可以在客戶端新建VPN(加密方式為預設)連線來測試了。(下面是win10下的操作記錄)

檢視客戶端連線成功後的ip資訊,是否正常上網等

一定要勾選上“在遠端網路上使用預設閘道器”的選項,確保成功連線VPN後能正常上網,並且出口ip是PPTP伺服器的外網ip(還有關閉客戶機的防火牆)

-------------------------------------------------------------------------------------------------------
VPN環境部署好,並待客戶機遠端連線成功後,PPTP伺服器上會有虛擬網路卡PPP0的資訊:

[root@bastion-IDC ~]# ifconfig
........
ppp0      Link encap:Point-to-Point Protocol  
          inet addr:192.168.1.5  P-t-P:192.168.100.101  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1396  Metric:1
          RX packets:213 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:25943 (25.3 KiB)  TX bytes:902 (902.0 b)

檢視/var/log/messages日誌,發現如果有下面報錯:
[root@bastion-IDC ~]# tail -f /var/log/messages
......
kernel: ppp: compressor dropped pkt

原因是因為pptp不相容windows的客戶端造成的。Windows客戶端mtu值為1400以上,Linux pptp伺服器預設mtu為1396。

解決辦法:嘗試手動配置mtu值
[root@bastion-IDC ~]# ifconfig ppp0 mtu 1400
改完後,發現確實解決了上面報錯,但只是暫時性的,重啟後依然會恢復到1396。

[root@bastion-IDC ~]# ifconfig
........
ppp0      Link encap:Point-to-Point Protocol  
          inet addr:192.168.1.5  P-t-P:192.168.1.101  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1400  Metric:1
          RX packets:213 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:25943 (25.3 KiB)  TX bytes:902 (902.0 b)

永久解決措施:
[root@bastion-IDC ~]# cat /etc/ppp/ip-up

#!/bin/bash
# This file should not be modified -- make local changes to
# /etc/ppp/ip-up.local instead

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

LOGDEVICE=$6
REALDEVICE=$1

[ -f /etc/sysconfig/network-scripts/ifcfg-${LOGDEVICE} ] && /etc/sysconfig/network-scripts/ifup-post --realdevice ${REALDEVICE} ifcfg-${LOGDEVICE}

/etc/ppp/ip-up.ipv6to4 ${LOGDEVICE}

[ -x /etc/ppp/ip-up.local ] && /etc/ppp/ip-up.local "$@"

exit 0

從上面配置檔案中得知pptp啟動指令碼中支援ip-up.local名字的指令碼。
所以可以編寫自動配置mtu值的指令碼,啟服務時會自動執行該指令碼即可解決該問題。

[root@bastion-IDC ~]# cat /etc/ppp/ip-up.local
#!/bin/sh
CURRENT_MTU="`ifconfig $1 | grep -Po '(?<=MTU:)([0-9]+)'`"
FIXED_MTU="`expr $CURRENT_MTU + 4`"
ifconfig $1 mtu $FIXED_MTU
echo "Increased MTU for $1 to $FIXED_MTU (from $CURRENT_MTU) to fix MPPE Microsoft Point-to-Point bug #330973"

將指令碼放置在/etc/ppp/目錄中,命名為ip-up.local,最後給許可權
[root@bastion-IDC ~]# chmod 755 /etc/ppp/ip-up.local

---------------------------------------------------------------------------------------------------------------------
發現一個現象:
按照上面的部署,在客戶端連線VPN成功後,可以正常上網,分配到的內網ip地址也正常。
但是連線後的出口ip並不是PPTP伺服器的公網ip。

解決辦法:
是因為在前面/etc/pptpd.conf檔案裡配置的localip填寫的是PPTP本機的內網ip,這樣客戶機成功連線後能正常上網,但出口ip不變!
只需要將這個localip改成PPTP的外網ip地址,那麼客戶機成功連線後的出口ip就會變成PPTP伺服器外網ip了。

--------------------------------------------------------------------------------------------------------------------
Linux下在PPTP伺服器上檢視VPN線上使用者數:
[root@bastion-IDC ~]# ifconfig | grep ppp

檢視哪些使用者線上:
[root@bastion-IDC ~]# last | grep still | grep ppp

--------------------------------------------------------------------------------------------------------------------
有一個問題:
如果上面將/etc/pptpd.conf檔案中的remoteip設定成和PPTP伺服器內網在同一網段,
比如:PPTP伺服器內網ip為192.168.1.5,外網ip為133.110.186.55,設定如下:
[root@bastion-IDC ~]# vim /etc/pptpd.conf
.....
localip 133.110.186.55
remoteip 192.168.100.101-150

防火牆規則如上設定:
配置iptables轉發
[root@bastion-IDC ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 133.110.186.55
[root@bastion-IDC ~]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 1723 -j ACCEPT
[root@bastion-IDC ~]# /etc/init.d/iptables save
[root@bastion-IDC ~]# /etc/init.d/iptables restart

如上設定後,客戶端連線VPN後,本機ip就能變成PPTP伺服器端ip,並且正常上網。
只是客戶機連線VPN後,不能ping通PPTP服務端同網段的內網ip(除非localip 配置成PPTP伺服器內網ip)

------------------------------------------------------------------------------------------------------------------------
接著順便說下mac下連線pptp的操作記錄:
依次選擇"系統偏好設定"->"網路"->開啟左下角的"+",新增VPN網路,選擇vpn的種類(PPTP),然後填寫vpn的連線資訊:vpn地址和使用者名稱。服務名稱:可以隨意添,預設為VPN(PPTP)

選擇鑑定設定,輸入VPN帳戶密碼

注意一點:點選"高階"->"通過VPN連線傳送所有通訊",這個選項一定要打勾!這樣,vpn連線成功後,mac本地的外網ip才會變成vpn伺服器的外網ip。

最後,選擇應用,正常連線就ok!

----------------------------------遇到的問題--------------------------------
mac連線PPTP的VPN是正常的,但是連線成功後不多久就不了網。
這種現象通常在連線3-5分鐘時出現,斷開VPN連線後重新連線,就會恢復正常,3-5分鐘後再次掉線。(L2TP的vpn連線後貌似沒有這種現象)

解決辦法:
mac是wifi連結的,開啟網路偏好設定,選中wifi,點選[高階],進入[硬體]選項卡,配置改為手動,MTU將預設的1500改為1280(或1450),MTU也就是Maximum Transmission Unit。
出現這個問題的原因是所使用的網路不標準,不支援MTU協商,導致系統一開始就是用了最大的MTU,也就是預設的1500。VPN伺服器那邊不買賬,就給斷開了。

中國運營商的很多劣質網路有幾個常見問題:
1)不支援MTU自動協商,閘道器上的MTU又不標準。(這個是唯一一種可以自己解決的,只要手動改MTU即可,如上)
2)出口是動態的,一會兒切換一次,一切換,公網IP就變了,連線必斷。(部分地區可以投訴,讓運營商給你這個賬號固定出口的)
3)多層 NAT,然後中間某一層的閘道器在調整。一般常見於非電信聯通的小運營商,企業網路,二三線城市的電信聯通網路。
4)都會網路或骨幹網丟包。(這個無解,中國總國際出口是低於當前網民所需的,所以等壟斷企業擴容吧)

相關文章