最近做各種vpn,記錄一下pptp的流程
#yum install -y perl ppp iptables //centos默認安裝了iptables和ppp
#yum install pptpd
3. 修改配置文件
3.1 配置文件/etc/ppp/options.pptpd
#cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak #vi /etc/ppp/options.pptpd
將如下內容添加到到options.pptpd中(如果需要使用代碼來啟動進程方式,需要修改name,這個name和chap-secets文件中的第二項對應):
ms-dns 8.8.8.8 ms-dns 8.8.4.4
然后保存這個文件。
解析:ms-dns 8.8.8.8, ms-dns 8.8.4.4是使用google的dns服務器
3.2 配置文件/etc/ppp/chap-secrets
#cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bak #vi /etc/ppp/chap-secrets
chap-secrets內容如下:
# Secrets for authentication using CHAP # client server secret IP addresses myusername pptpd mypassword *
PS:
//myusername是你的vpn帳號
pptpd和options.pptpd中的name對應
mypassword是你的vpn的密碼
*表示允許任何ip連接該pptp vpn
我這里根據這個格式,假設我的vpn的帳號是ksharpdabu,密碼是 sky。那么,應該如下:
ksharpdabu pptpd sky *
3.3 配置文件/etc/pptpd.conf
#cp /etc/pptpd.conf /etc/pptpd.conf.bak #vi /etc/pptpd.conf
修改下面:
connection 100 #最大連接數 localip 192.168.9.1 #vpn服務占用的ip remoteip 192.168.9.11-30 //表示vpn客戶端獲得ip的范圍
3.4 配置文件/etc/sysctl.conf
#vi /etc/sysctl.conf //修改內核設置,使其支持轉發
將net.ipv4.ip_forward = 0 改成 net.ipv4.ip_forward = 1
保存修改后的文件
#/sbin/sysctl -p
4. 啟動pptp vpn服務和iptables
#service pptpd start
經過前面步驟,我們的VPN已經可以撥號登錄了,但是還不能訪問任何網頁。
最后一步就是添加iptables轉發規則了,輸入下面的指令:
啟動iptables和nat轉發功能,很關鍵的呀:
#/sbin/service iptables start //啟動iptables #iptables -t nat -A POSTROUTING -p tcp --syn -s 192.168.9.0/24 -j TCPMSS --set-mss 1356 #這里主要是解決pptp無法訪問https站點的問題,還有一種方法是連接后修改ppp0的mtu值,但是每次都需要手動修改太麻煩了 #iptables -t nat -A POSTROUTING -s 192.168.9.0/24 -j SNAT --to-source 207.210.83.140 #添加轉發規則 //注意: 需要注意的是,“192.168.9.0/24”是根據之前的配置文件中的“localip”網段來改變的(這個網段是用戶自定義的 ),比如你設置的 “10.0.0.1”網段,則應該改為“10.0.0.0/24” to-source 的值寫外網網卡的ip地址即可 #/etc/init.d/iptables save //保存iptables的轉發規則 #/sbin/service iptables restart //重新啟動iptables
5. 重啟pptp vpn
#service pptpd restart
客戶端如何撥號登陸vpn,我就不寫了,大家可以自行google
6. 設置pptp vpn 開機啟動
#chkconfig pptpd on //開機啟動pptp vpn服務 #chkconfig iptables on //開機啟動iptables
7. 過程中遇到的問題
之前pptp測試都是好的,可是在其他環境部署的時候出現了問題
LCP: timeout sending Config-Requests Jun 3 14:52:05 localhost pppd[29491]: Connection terminated. Jun 3 14:52:05 localhost pppd[29491]: Modem hangup Jun 3 14:52:05 localhost pppd[29491]: Exit. Jun 3 14:52:05 localhost pptpd[29490]: GRE: read(fd=6,buffer=7fc6156eb480,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs Jun 3 14:52:05 localhost pptpd[29490]: CTRL: PTY read or GRE write failed (pty,gre)=(6,7) Jun 3 14:52:05 localhost pptpd[29490]: CTRL: Client 192.168.1.112 control connection finished
往上各種說法,可能情況不同
基本上是:
1. 注釋pptpd.conf中的logwtmp(版本不匹配的原因)
2. 注釋options.pptpd中的require-mschap-v2和require-mppe-128
嘗試后都沒有成功,最終找到了解決方案:
是兩個內核模塊沒有在機器啟動的時候加載進來:nf_conntrack_pptp和nf_conntrack_proto_gre
原因是這樣的:
在內核版本為3.18或者更高時,模式在開機時已經加載了nf_conntrack_pptp模塊
如果低版本內核,開機沒有加載該模塊,需要手動加載modprobe nf_conntrack_pptp
iptables支持pptp gre模塊的規則過濾需要有上述模塊的支持,在沒有加載的該模塊的時候iptables都會將pptp和gre的數據包識別為invalid類型,drop掉
手動加載
# modprobe nf_conntrack_pptp
開機加載
sudo touch /etc/modules-load.d/nf_conntrack_pptp.conf sudo echo "nf_conntrack_pptp" > /etc/modules-load.d/nf_conntrack_pptp.conf
希望可以幫到同樣問題的人