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地址,得以把這一部分補全。