詳解Linux下搭建VPN伺服器(CentOS、pptp)_Linux

來源:互聯網
上載者:User

本文介紹在安裝CentOS作業系統的Xen VPS上,如何搭建PPTP VPN服務。包括PPTP的安裝、配置,以及相應的iptables規則。本文暫時不涉及PPTP流量控制的部分,等抽空學明白了FreeRADIUS,再來寫續篇。2011年7月20日更新:在安全建議這一部分,增加了使用不同的IP地址,分別提供VPN服務和Web等其他常規服務,以及使用不同IP地址時如何書寫iptables規則的內容。

寫在前面

在Godaddy一美元COM網域名稱的慫恿下,這幾天先是拿到了這個gnailuy.com,然後覬覦了很久的VPS也就順便到手了。所以說萬事嘛,總是要有個開端。

按照之前的構想,下個月起這個VPS將由我和幾個好朋友合租,配置虛擬機器主機,各自建立自己的小網站,還能合用VPS上的VPN服務。從成本上考慮,只要有些鑽研技術的精神,加上幾個志同道合的朋友,合租一台不太高端的VPS自建伺服器,應該還是低於同時購買網域名稱、Web託管以及VPN這幾樣的成本之和的。這是第一個月,我們會先熟悉熟悉技術,做做各種測試,多學習多發些技術文章,供有同樣想法的朋友們借鑒。

本文

在Google苦海裡遊了兩天兩夜,終於完成了PPTP VPN還有這個Wordpress小站的基本配置,今天先寫一下VPN。這些天因為嫌Google中文首頁太醜,搜尋資料的時候大都是用英文,本來也打算用英文寫這篇文章,但考慮到下面兩個原因,於是作罷:一是到自己這英語寫作能力,實在不濟;二是可能熱衷於搭建VPN的個人或者團體,大概也許基本都是在中國大陸上網的吧,o(∩∩)o…

之所以選擇PPTP VPN,是考慮到用戶端串連起來會比較方便。我們幾個人主要都是在Linux Desktop、Windows還有Android上使用VPN,這些終端原生都有串連PPTP的用戶端。當然還有一個原因,就是我們購買的VPS是基於Xen PV技術的,可以搭建PPTP。這個原因本來其實是結果,當初要買基於Xen PV的而不是OpenVZ的,就是因為打算在上面搭建PPTP服務。BTW,Xen PV是種半虛擬化技術,不能跑Windows,但據說比全虛擬化的Xen HVM跑Linux效率高。

平台簡介

  • “硬”件平台:Xen PV, 215M Memory, 512M Swap, 1T Transfer
  • 作業系統:CentOS release 5.6 (Final)
  • 核心:2.6.18-194.32.1.el5xen i686 i386 GNU/Linux
  • 網路:1 IP, 1 Network Adapter(eth0)

配置概覽

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

  • 驗證核心是否載入了MPPE模組
  • 安裝所需的軟體包
  • 配置PPP和PPTP的設定檔
  • 開啟核心的IP轉寄功能
  • 啟動pptpd守護進程
  • 配置iptables防火牆允許存取和轉寄規則

詳細步驟

開機以後,首先是登入VPS。我平時用Linux,就直接ssh命令登入上去。如果是在Winodws下,推薦使用PuTTY,有一點需要注意,就是串連之前最好把字元集設定成UTF-8,因為Linux預設的locale都是UTF-8了,如果出現非ASCII字元,不設定字元集就會出現亂碼,具體的設定方法Google知道。

下面的所有配置操作都需要root許可權,如無特別說明,所有命令都在root的家目錄下執行。順便,最好在VPS上禁用root直接登入,盡量建立一個普通使用者然後su到root,具體細節偏題了,也請自行Google。

1、驗證核心是否載入了MPPE模組:

核心的MPPE模組用於支援Microsoft Point-to-Point Encryption。Windows內建的VPN用戶端就是使用這種加密方式,主流的Linux Desktop也都有MPPE支援。其實到了我們這個核心版本,預設就已經載入了MPPE,只需要使用下面命令驗證一下,顯示MPPE ok即可:

modprobe ppp-compress-18 && echo MPPE is ok

2、安裝所需的軟體包:

–ppp–

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

yum install ppp

作為一個懶人,如果沒有特殊的自訂要求,我一般盡量用yum安裝軟體。只要軟體源裡有,yum比較方便一些,還能自動解決依賴關係。

–pptpd-

有了PPP協議支援,接下來安裝pptpd。首先到這裡找到最新版適合你的平台的pptpd。CentOS與RHEL通用,Fedora系統則可以使用尾碼含fc字樣的包,然後還需要根據核心選擇32位或者64位的包。找到正確的軟體包以後,複製其URL,然後用wget下載到root的家目錄(或者用rpm -ivh URL直接安裝也行)。譬如我的32位核心CentOS 5,使用下面命令下載:

wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.rhel5.i386.rpm

這篇文章預設不考慮”wget: command not found”此類初級的錯誤。如果看到類似錯誤,一是檢查命令有沒有拼錯,二是yum install it,三是Google it。其實,這篇文章裡總共也用不到幾條容易Not Found的命令。

下載完成後,安裝:

rpm -ivh pptpd-1.3.4-2.rhel5.i386.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進行配置,編輯它們的幾個設定檔。如果有Linux基礎的話,當然推薦使用vi/vim來編輯設定檔。如果不熟悉也不想熟悉vi,那麼可以用更容易上手的nano替換下面我將要使用的vi命令。本文不涉及文字編輯器的基礎知識,只需要知道如何開啟檔案、編輯檔案、儲存檔案和退出文字編輯器就可以了。

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

grep ^[^#] /etc/ppp/options.pptpd

這樣的命令,過濾出設定檔中有效行顯示在本文本文中。你在編輯的時候,只需要添加或修改這些有效行,把不需要的行前面加上#號注釋掉即可。

–ppp–

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

vi /etc/ppp/options.pptpd

我編輯這個檔案時,它已經是存在的,並且其中的內容也幾乎不需要編輯,如果這個檔案不存在,自行建立它並填入下面的有效配置就行了。下面是這個檔案中有效行:

name pptpdrefuse-paprefuse-chaprefuse-mschaprequire-mschap-v2require-mppe-128ms-dns 8ms-dns 4proxyarplocknobsdcompnovjnovjccompnologfd

其中name後面的pptpd是服務名稱,可以任意修改成你喜歡的名字,在後面的配置中將對應的pptpd替換為你在這裡修改的名字即可。

接下來的幾行以refuse或者require開頭的指令,是配置拒絕和接受的加密方式,這裡接受的mschap-v2和mppe-128都是較新的比較安全的加密方式,其中mppe-128需要第一步中驗證的核心模組支援。

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

剩下後面幾個選項,就不在這裡敘述了,需要知道其含義的童鞋可以參考這個範例檔案中的注釋。

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

vi /etc/ppp/chap-secrets

這個檔案非常簡單,其中用明文儲存VPN客戶的使用者名稱、服務名稱、密碼和IP位址範圍,每行一個賬戶:

username1  pptpd  passwd1  *username2  pptpd  passwd2  *

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

–pptpd–

下面編輯pptpd的設定檔:

vi /etc/pptpd.conf

這個檔案中有效行也很少:

option /etc/ppp/optionspptpdlogwtmplocalip 1remoteip 207-217

其中option選項指定使用/etc/ppp/options.pptpd中的配置;logwtmp表示使用WTMP日誌。

後面兩行是比較重要的兩行。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轉寄功能。可以編輯設定檔:

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

如果你其他的防火牆規則已經配置好無需改動,只需要增加上述相關VPN相關的規則,那麼執行下面幾條命令即可(第三條一般不用執行,除非你原來的防火牆連這個規則都沒允許,但是多執行一遍也無妨):

iptables -A INPUT -p gre -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPTiptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A FORWARD -s 0/24 -o eth0 -j ACCEPTiptables -A FORWARD -d 0/24 -i eth0 -j ACCEPTiptables -t nat -A POSTROUTING -s 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請求

根據上述需求,加上伺服器的基本要求,我寫了下面的shell指令碼。這個指令碼預設DROP掉沒有明確允許的規則,然後允許包括上面VPN相關的規則和上述幾項其他服務所需的規則。可以根據你的實際需求,修改這個指令碼,然後執行這個指令碼快速部署iptables規則。

#!/bin/bash### Clear Old Rulesiptables -Fiptables -Xiptables -Ziptables -t nat -Fiptables -t nat -Xiptables -t nat -Z### * filter# Default DROPiptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT DROP# INPUT Chainiptables -A INPUT -p gre -j ACCEPTiptables -A INPUT -i lo -p all -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPTiptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPTiptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT# OUTPUT Chainiptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT# FORWARD Chainiptables -A FORWARD -s 0/24 -o eth0 -j ACCEPTiptables -A FORWARD -d 0/24 -i eth0 -j ACCEPT### * nat# POSTROUTING Chainiptables -t nat -A POSTROUTING -s 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地址,得以把這一部分補全。

單網卡配置多個IP地址

CentOS下單網卡配置多個IP很容易。例如,假設現在網卡eth0已經有一個IP地址是123.123.123.123/24,想要增加一個IP是123.123.123.124/24,可以在/etc/sysconfig/network-scripts/目錄下增加一個新的虛擬網卡設定檔ifcfg-eth0:0。想省事的話可以直接把ifcfg-eth0複製成ifcfg-eth0:0。然後編輯其內容,例如:

DEVICE=eth0:0BOOTPROTO=staticONBOOT=yesIPADDR=124NETMASK=0

虛擬網卡eth0:0配置的資訊看起來有些少,其實它會共用實際裝置eth0的配置資訊,因此如上簡單的配置就夠了。另外如果在這張網卡上還需要添加更多的IP地址,照此例增加eth0:1、eth0:2等等虛擬設備既可。

多IP的iptables配置

然後關於iptables配置,思路就是在INPUT鏈上使用-d區別目的IP,只在Web等服務使用的IP上允許存取22和80等幾個連接埠,VPN服務的IP上只允許存取1723連接埠。

如果喜歡的話也可以為新增加的IP綁定一個不同的網域名稱,只要防火牆配置好了,然後VPN使用的IP網域名稱都不公開,理論上是挺難找到VPN服務地址的,這也是自建VPN的一個好處。這裡再提供一個iptables規則的配置指令碼,與上面的指令碼類似,只是做了少量的修改,適用於多IP的情況:

#!/bin/bash # Clear Old Rulesiptables -Fiptables -Xiptables -Ziptables -t nat -Fiptables -t nat -Xiptables -t nat -Z### * filter# Default DROP and ACCEPTiptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT DROP # INPUT Chainiptables -A INPUT -p gre -j ACCEPTiptables -A INPUT -i lo -p all -j ACCEPTiptables -A INPUT -p tcp -m tcp -d 123 --dport 21 -j ACCEPTiptables -A INPUT -p tcp -m tcp -d 123 --dport 22 -j ACCEPTiptables -A INPUT -p tcp -m tcp -d 123 --dport 80 -j ACCEPTiptables -A INPUT -p tcp -m tcp -d 123 --dport 443 -j ACCEPTiptables -A INPUT -p tcp -m tcp -d 124 --dport 1723 -j ACCEPTiptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPTiptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # OUTPUT Chainiptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT # FORWARD Chainiptables -A FORWARD -s 0/24 -o eth0 -j ACCEPTiptables -A FORWARD -d 0/24 -i eth0 -j ACCEPT ### * nat # POSTROUTING Chainiptables -t nat -A POSTROUTING -s 0/24 -o eth0 -j MASQUERADE

 這樣配置完成後,對公開的Web網域名稱進行連接埠掃描,就只能掃描到80等連接埠,而VPN服務使用的網域名稱IP不公開,就保證了安全性。我手欠掃描了一下我們的伺服器,結果就成了這樣:

[root@sheldon ~]# nmap -sS gnailuycom Starting Nmap 21 ( http://nmaporg ) at 2011-07-20 20:46 CSTNmap scan report for gnailuycom (One of our IP address)Host is up (31s latency)Not shown: 996 filtered portsPORT  STATE SERVICE21/tcp open ftp22/tcp open ssh80/tcp open http443/tcp open httpsNmap done: 1 IP address (1 host up) scanned in 44 seconds[root@sheldon ~]# nmap -sS vpnserversdomainname Starting Nmap 21 ( http://nmaporg ) at 2011-07-20 20:53 CSTNmap scan report for vpnserversdomainname (Our another IP address)Host is up (32s latency)Not shown: 999 filtered portsPORT   STATE SERVICE1723/tcp open pptp Nmap done: 1 IP address (1 host up) scanned in 52 seconds

 後記

這篇文章是邊爬搜尋引擎邊學習邊實驗寫成的,在摸索的過程中學習,確實學到了不少東西。學習和設定管理員的過程中,我不斷的Google到相關的文章,中文的英文的已經有一大把,於是我就在想,我寫這篇文章,應該完成哪些現有的資料尚不完善的地方。技術上我只是個初學者,除了搜尋、思考、組織之外,暫時沒有可能創造出新的技術來,於是只好從語言群組織、資訊翔實程度和對配置細節的解釋上盡量提高本文的含金量,希望成為中文文章中比較有用的一篇,能夠為其他有這方面想法的朋友提供一些小小指引。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.