1. 程式人生 > >linux下搭建簡單的vpn服務

linux下搭建簡單的vpn服務

搭建PPTP VPN服務。包括PPTP的安裝、配置,以及相應的iptables規則。之所以選擇PPTP VPN,是考慮到客戶端連線起來會比較方便

我們幾個人主要都是在Linux Desktop、Windows還有Android上使用VPN,這些終端原生都有連線PPTP的客戶端。

PPTP的配置主要有下面五個步驟:


驗證核心是否載入了MPPE模組
安裝所需的軟體包
配置PPP和PPTP的配置檔案
開啟核心的IP轉發功能
啟動pptpd守護程序
配置iptables防火牆放行和轉發規則

1、驗證核心是否載入了MPPE模組:
modprobe ppp-compress-18 && echo MPPE is ok


2、安裝所需的軟體包:
PPTP使用PPP協議對使用者資料進行封裝,然後將PPP資料幀封裝在IP資料報裡,經由IP網路傳播。因此首先需要支援PPP協議,我們使用的完整版CentOS已經自帶了ppp這個軟體包,如果你安裝的是Minial CentOS之類的精簡系統,則可能需要下面命令安裝ppp:


yum install ppp


–pptpd-
有了PPP協議支援,接下來安裝pptpd。首先到這裡找到最新版適合你的平臺的pptpd。CentOS與RHEL通用,Fedora系統則可以使用字尾含fc字樣的包,然後還需要根據核心選擇32位或者64位的包。找到正確的軟體包以後,複製其URL,然後用wget下載到root的家目錄(或者用rpm -ivh URL直接安裝也行)。 
 wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-1.rhel5.1.x86_64.rpm
 
 rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm
 
 –iptables–
同樣,如果不是Minial的系統,應該不會沒有安裝iptables。這是Linux下最流行的防火牆,預設應該就能找到,如果沒有,則:


yum install iptables
然後像是iptables這樣的軟體,對伺服器非常重要。雖然還沒有配置防火牆的規則,裝完就開啟吧(只要預設放行ssh的22埠就沒問題),開啟以後還需要設定一下,在主要的執行級別自動啟動:


/etc/init.d/iptables start chkconfig --level 35 iptables on




3、配置PPP和PPTP的配置檔案:


接下來需要對ppp和pptpd進行配置,編輯它們的幾個配置檔案。


這些配置檔案中,#號開頭的行均為註釋,對配置不起作用。我們不必關心註釋,所以下面我將使用類似


grep ^[^#] /etc/ppp/options.pptpd
這樣的命令,過濾出配置檔案中有效的行顯示在本文正文中。你在編輯的時候,只需要新增或修改這些有效的行,把不需要的行前面加上#號註釋掉即可 


–ppp–
配置ppp需要編輯它的兩個配置檔案,一個是option(選項)檔案,一個是使用者賬戶檔案。首先編輯option檔案:


vi /etc/ppp/options.pptpd


ms-dns 8.8.8.8
ms-dns 8.8.4.4
兩個比較重要的行就是ms-dns了,它們指定VPN使用的DNS伺服器。畢竟VPS位於國外,所以推薦使用上面通用的Google Public DNS,當然也可以修改為你的VPS所在ISP提供的DNS。


接下來修改另一個,儲存著使用者賬戶的檔案:


vi /etc/ppp/chap-secrets
這個檔案非常簡單,其中用明文儲存VPN客戶的使用者名稱、服務名稱、密碼和IP地址範圍,每行一個賬戶:
# Secrets for authentication using CHAP
# clientserversecretIP addresses
mileweb pptpd "mw123456" *


其中第一第三列分別是使用者名稱和密碼;第二列應該和上面的檔案/etc/ppp/options.pptpd中name後指定的服務名稱一致;最後一列限制客戶端IP地址,星號表示沒有限制。


–pptpd–
下面編輯pptpd的配置檔案:


vi /etc/pptpd.conf
這個檔案中有效的行也很少:


option /etc/ppp/options.pptpd
logwtmp
localip 192.168.0.1
remoteip 192.168.0.207-217


VPN可以這樣理解,Linux客戶端使用一個虛擬網路裝置ppp0(Windows客戶端也可以理解成VPN虛擬網絡卡),連線到伺服器的虛擬網路裝置ppp0上,這樣客戶端就加入了伺服器端ppp0所在的網路。localip就是可以分配給伺服器端ppp0的IP地址,remoteip則是將要分配給客戶端ppp0(或者虛擬網絡卡)的。


這兩項都可以是多個IP,一般localip設定一個IP就行了,remoteip則視客戶端數目,分配一段IP。其中remoteip的IP段需要和localip的IP段一致。


localip和remoteip所處的IP段可以隨意些指定,但其範圍內不要包含實際網絡卡eth0的IP地址。一般情況下,使用上面配置檔案中的配置就好使了,你需要做的只是把192.168.0.207-217這個IP區間修改成你喜歡的192.168.0.a-b,其中1<a<b<255。




4、開啟核心的IP轉發功能:


要使VPN伺服器可以作為網路請求的中轉代理,能夠使客戶端通過VPN訪問Internet,還需要開啟核心的IP轉發功能。可以編輯配置檔案:
 sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0


要使VPN伺服器可以作為網路請求的中轉代理,能夠使客戶端通過VPN訪問Internet,還需要開啟核心的IP轉發功能。可以編輯配置檔案:


vi /etc/sysctl.conf
找到其中的行:


net.ipv4.ip_forward = 0
修改為:


net.ipv4.ip_forward = 1
然後執行下面命令使上述修改生效:


sysctl -p


5、啟動pptpd守護程序:


上面配置完成後,就可以啟動pptpd程序並設定自動啟動了,和上面iptables的例子類似:


/etc/init.d/pptpd start chkconfig --level 35 pptpd on


6、配置iptables防火牆放行和轉發規則:


最後,還需要配置防火牆。這裡配置防火牆有三個目的:一是設定預設丟棄規則,保護伺服器的安全;
二是放行我們允許的資料包,提供服務;
三是通過配置nat表的POSTROUTING鏈,增加NAT使得VPN客戶端可以通過伺服器訪問網際網路。總之我們的原則就是,只放行我們需要的服務,其他統統拒絕。


首先介紹跟PPTP VPN相關的幾項:


允許GRE(Generic Route Encapsulation)協議,PPTP使用GRE協議封裝PPP資料包,然後封裝成IP報文
放行1723埠的PPTP服務
放行狀態為RELATED,ESTABLISHED的入站資料包(正常提供服務的機器上防火牆應該都已經配置了這一項)
放行VPN虛擬網路裝置所在的192.168.0.0/24網段與伺服器網絡卡eth0之間的資料包轉發
為從VPN網段192.168.0.0/24轉往網絡卡eth0的出站資料包做NAT


iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -i eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
上述的IP段192.168.0.1/24可能需要修改成/etc/pptp.conf中你配置的localip和remoteip所在地IP段。


在我們這臺伺服器上,還需要一些其他的服務:


22埠的SSH(非常重要!如果不小心連這個都忘了,基本就只能給VPS服務商發Ticket了)
21埠的FTP控制
80埠的Web服務
允許響應各種icmp請求

#!/bin/bash
### Clear Old Rules
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
### * filter
# Default DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# INPUT Chain
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# OUTPUT Chain
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
# FORWARD Chain
iptables -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -i eth0 -j ACCEPT
### * nat
# POSTROUTING Chain
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE





需要注意的是,這個指令碼開頭首先清除掉了所有iptables規則,然後才部署新的規則,如果你需要保留你機器上現有的規則,請千萬不要執行前面的清除語句,或者做好舊規則的備份再做實驗:


iptables-save > iptables.backup
如果想恢復使用上面命令做好的備份,可以:


iptables-resotre iptables.backup
最後,如果確定所有的iptables規則已經合乎你的心意,就可以執行下面命令,將iptables規則儲存下來。


/etc/init.d/iptables save


安全建議
在Twitter上得到了@alexwwang @helijohnny的指點,知道VPN與這個網站放在一起,可能不安全。他們建議我為VPS增加一個IP,可以讓VPN服務和Web走不同的IP,這樣就不會因為Web網站發表的內容輕易暴露VPN伺服器的IP了。之前我只是在測試機上測試過,今天終於新購得一個IP地址,得以把這一部分補全。