快速建立linux下的vpn服務器做加密代理
一:背景
對VPN的分類什么的有個大概的了解,知道是個大概怎么回事,如果不大清楚的朋友可以google一下,喜歡看英文文檔的朋友可以看下面兩個文檔對VPN的介紹,很清晰。本文就不對這些內(nèi)容進行具體的介紹了。
http://hmyblog.vmmatrix.net/sdbwww/pub/books/Packt.Publishing.
OpenVPN.Building.And.Integrating.Virtual.Private.Networks.Mar.2006.pdf
http://hmyblog.vmmatrix.net/sdbwww/pub/books/Packt.Publishing.Building.And.
Integrating.Virtual.Private.Networks.With.Openswan.Jan.200620060628185701.rar
說到這里,baoz忍不住要打個岔,如果是剛接觸一個新領域新知識的話,最好少看中國大陸人寫的技術文檔,那信不過,一來說不清楚(比如本文,呵呵),二來很多地方忽悠人,說不定他自己也不清楚,亂寫一氣,要不就在關鍵的地方漏一點或者改一點,照搬人家老外的東西連目錄文件名不改竟然還叫原創(chuàng)。具體大家在搜索swan +vpn的時候就有機會遇到了。反正不想被帶著瞎走就最好看英文文檔或者中國臺灣人寫的東西,比如那個叫鳥哥的人寫的文章還不錯,雖然很基礎,但講的很清楚,他出了本書,叫《鳥哥的私房菜》來著,很適合linux的入門者閱讀。另外一些大點的程序在官方網(wǎng)站都有DOCUMENT或者HOWTO,F(xiàn)AQ什么之類的,認真看看哪怕不去做也會收獲不少,起碼知道那軟件大概是怎么回事。
baozi大致的看了一下上面的兩個PDF,收益良多,再次推薦一下,對VPN和openswan,openvpn介紹的十分詳細。
目標系統(tǒng) red hat linux 9默認安裝
二:需求
說白了就是用肉雞做加密代理
1:對系統(tǒng)盡可能小的改變,包括添加文件和系統(tǒng)日志,因為我們用的是肉雞。
2:是client-->server的模式,而不是net-net的模式,瀏覽網(wǎng)頁而已。
3:無論server還是client都要配置方便,簡單好用,我們要的是快速。
三:選型
1:*swan
A:ipsec vpn的代表,默認端口tcp/udp 500
B:優(yōu)點:加密強,對網(wǎng)絡游戲什么的支持好(我們用不上)
C:缺點:部署麻煩,配置麻煩,關鍵是他的nat-t,就是nat穿越功能需要打內(nèi)核補丁,重新編譯內(nèi)核才行,這事在肉雞做不得,呵呵。具體的可以看上面的那個openswan的rar,講的十分詳細。大概的說說swan系列吧,最開始是freeswan,然后貌似在2004年停止開發(fā)了,衍生出openswan和strongswan兩個分支,我看了一下,貌似openswan發(fā)展的不錯,strongswan連個rpm包都沒,當然,那是貌似。因為我不懂得code,說啥都得加貌似二字的,不過千萬別小看scriptkid哦,因為你不知道什么時候他就在你的系統(tǒng)里用uid0在script,雖然我還是多次被別人B4,呵呵。繞回來……swan系列分兩塊,一個是用戶空間程序,一個是內(nèi)核空間程序。用戶空間程序叫p什么來o來著,至于到底是p什么o,你裝裝就知道了,要不裝,知道了也沒啥意義。:)內(nèi)核空間的包括模塊和補丁,大概就那么回事。就是說,要做到nat-t,就需要用戶空間程序,lkm和內(nèi)核補丁,需要重新編譯內(nèi)核,這個我們在肉雞沒法做,drop之。還有他要用root運行。
2:pptpd
A:pptp vpn的典型代表,默認端口tcp 1723
B:優(yōu)點:windows帶了他的client,安裝也方便,就幾個rpm,配置也不難
C:缺點:一撥進去他就會改缺省網(wǎng)關,很煩,要么撥進去自己route add/delete幾下改改,一直別斷開,看個網(wǎng)站犯得著那么麻煩嗎
3:openvpn
A:SSL VPN的典型代表,默認端口tcp/udp 1194
B:優(yōu)點:簡單好裝,一個rpm搞定,要壓縮的話多一個lzo的rpm包。配置也是簡單的很,就生成一個static.key,還可以chroot,并且可以以nobody運行,肉雞的安全也是很重要的,保管不好就被搶了,不過chroot就沒必要了,有興趣的朋友可以自己搞搞:) ldd一下把要的東西都丟到一個地方然后加上配置文件就差不多了,再改改啟動腳本。
還有就是撥進VPN之后,他不會改你默認網(wǎng)關,免去了折騰的煩惱,我們可以把sf.net的地址加到靜態(tài)路由去。
在server那邊只需要開一個udp or tcp端口就可以了,不怎么需要去動別人的iptables。
貌似好象還有負載均衡什么的,這個和我們的目的差距有點大了,ignore之。
C:缺點:除了要額外裝一個client之外,相對我們的需求來說貌似沒什么缺點了。
#p#四:開搞
1:安裝client and server程序
http://dag.wieers.com/packages/openvpn/openvpn-2.0.7-1.rh9.rf.i386.rpm
[root@RH9 root]# rpm -ivh lzo-1.08-2_2.RHL9.at.i386.rpm
warning: lzo-1.08-2_2.RHL9.at.i386.rpm: V3 DSA signatur E: NOKEY, key ID 66534c2b
Preparing... ########################################### [100%]
1:lzo ########################################### [100%]
[root@RH9 root]# rpm -ivh openvpn-2.0.7-1.rh9.rf.i386.rpm
warning: openvpn-2.0.7-1.rh9.rf.i386.rpm: V3 DSA signatur E: NOKEY, key ID 6b8d79e6
Preparing... ########################################### [100%]
1:openvpn ########################################### [100%]
2:服務端配置
[root@RH9 root]# cat > /etc/openvpn/server.conf
dev tun
ifconfig 10.8.0.1 10.8.0.2
secret static.key ;天王蓋地虎,寶塔鎮(zhèn)河妖
user nobody ;降權限,保安全
group nobody
port 3389 ;改端口,忽啊悠-->不過別改1024以下的端口,那需要root權限,就得把上面兩行nobody的刪除。
comp-lzo ;起壓縮,加速度
;keep alive
keepalive 10 60 ;推連接,不掉線
ping-timer-rem
persist-tun
persist-key
;no-log ;不記錄啊不日志
verb 0
status /dev/null
log /dev/null
log-append /dev/null
server配置完畢。
3:客戶端配置
安裝這個http://www.openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe
然后打開開始--程序--openvpn--Generate a static OpenVPN key,這會在C:\Program Files\OpenVPN\config下生成一個叫key.txt的文件,把他重命名為static.key。
然后把這個文件復制到linux肉雞的/etc/openvpn/static.key去
最后在C:\Program Files\OpenVPN\config目錄下創(chuàng)建一個叫client.ovpn的文件,內(nèi)容如下
remote 肉雞的IP
dev tun
ifconfig 10.8.0.2 10.8.0.1
secret static.key
port 3389
verb 3
comp-lzo
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
client配置完畢。
注意,無論是服務端還是客戶端的IP,都不要和系統(tǒng)有的IP段沖突,另外改了端口需要在client and server都改一致。
#p#4:啟動并連接
A:啟動服務端
[root@RH9 root]# /etc/init.d/openvpn start
Starting openvpn: [ OK ]
這個時候理論上會發(fā)現(xiàn)多了一個接口,等會我們要收拾這個口子。
[root@RH9 root]# ifconfig tun0
tun0 Link encap:Point-to-Point Protocol
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@RH9 root]# netstat -an | grep 3389
udp 0 0 0.0.0.0:3389 0.0.0.0:*
這個時候理論上會起了一個3389的udp口,如果這兩個事情都有了,那就OK了,一般除了RP有WT之外,這里基本都不怎么可能出現(xiàn)錯誤。:)
如果有錯誤的話,就把上面的
verb 0
status /dev/null
log /dev/null
log-append /dev/null
改成
verb 9
status /usr/lib/0
log /usr/lib/1
log-append /usr/lib/1
然后重新啟動openvpn服務并查看日志,注意,這個時候messages會有日志,調(diào)試完畢記得刪除/usr/lib/0 /usr/lib/1。 B:啟動客戶端
開始--程序--openvpn--OpenVPN GUI
連接服務端
點右下角紅色的圖標--connect
圖標變綠,就是成功連接并分配到地址了,注意讓你的防火墻通過。
如果沒變綠色,從那個圖標那view log,如果發(fā)現(xiàn)不到問題,就把client的配置文件的verb設置為9,重新連接,再看日志,再google。
C:檢查連接:
在client里看到有這么個信息
Ethernet adapter 本地連接 4:
Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 10.8.0.2
Subnet Mask . . . . . . . . . . . : 255.255.255.252
Default Gateway . . . . . . . . . :
C:\>ping 10.8.0.1
Pinging 10.8.0.1 with 32 bytes of data:
Reply from 10.8.0.1: bytes=32 time=7ms TTL=64
連接木有問題,這個時候就根據(jù)個人的喜好,是改默認網(wǎng)關還是只根據(jù)目的地址route add一下了
如果肉雞速度快的話改默認網(wǎng)關吧。
C:\>route delete 0.0.0.0
C:\>route add 0.0.0.0 mask 0.0.0.0 10.8.0.1 -->注意啊,是vpn server的tun0的地址。
如果DNS服務器不在內(nèi)網(wǎng)的話,自己再route add一次DNS的地址就OK,如果想長期生效,可在route add語句最后加-p參數(shù)。
D:服務端打開轉發(fā)
做個nat,但注意一下eth0需要是可以去外網(wǎng)的接口啊,否則等會數(shù)據(jù)走不出去,如果肉雞是單接口的話就不需要擔心。
[root@RH9 root]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
再看看轉發(fā)開了沒
[root@RH9 root]# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 0
我們把他打開
[root@RH9 root]# sysctl -w net.ipv4.ip_forward=1
5:找錯
VPN一般出問題就只有三個地方,client的防火墻,server的防火墻,和轉發(fā)開關是否打開,所以我們在服務端抓抓包就完全可以找到出問題的地方。ipsec pptp都可以這么找錯。
A:在server的tun0口抓一切包,以檢測client-->server是否連通,廢話,肯定連通的,否則那圖標怎么會是綠色....
[root@RH9 root]# tcpdump -n -i tun0
tcpdump: listening on tun0
B:在server的eth0口抓目標地址包,以檢測轉發(fā)是否有問題。
[root@RH9 root]# tcpdump -n -i eth0 dst host baoz.net
tcpdump: listening on eth0
C:
這個時候我們telnet一下baoz.net看看
C:\>telnet baoz.net
兩邊都看到有包就對了。如果有一邊看不到包,就自己折騰一下好了??纯匆宦愤^來是不是都沒搞錯。
到此為止,我們已經(jīng)可以
#p#五:肉雞中的隱藏
1:肉雞哪來?
A:web app漏洞,awstat什么的,沒事就留意一下milw0rm.com的webapp部分,出新漏洞了就google hacking一把。 B:ssh or telnet弱口令 沒事就找?guī)讉€A BLOCK掃掃看。推薦xfocus冰河的X-Scan。 C:0day exp ? 這個我就不清楚了。 D:蜜罐,上面三種情況都可能是蜜罐,不過沒關系,就做個代理上上網(wǎng)嘛,蜜罐就蜜罐了,只要網(wǎng)速快就行。
2:日志
日志的處理上面在服務端配置部分已經(jīng)提到了的,小心處理就是,只要你比系統(tǒng)(安全)管理員更XX你就可以玩的下去,其中XX可以用細心,堅韌,不拔等形容詞代替。
3:進程、端口和連接
A:sk2一裝,用sk2的client進去啟動openvpn,動態(tài)隱藏進程端口和網(wǎng)絡連接 B:adore,貌似要改改才行,不過我暫時沒這個需求,sk2已經(jīng)很爽了。 C:shv5,最近抓到的一個rootkit,替換ELF文件的,很容易被查出來,沒啥意思,他的特征是默認有個/usr/lib/libsh目錄。
4:ifconfig
這個是最關鍵的也是最麻煩的,因為一般的人都會ifconfig敲著玩玩的,一不小心就會被發(fā)現(xiàn)多了個tun0。。。。呵呵,我想了想辦法有兩: A:使用awk or sed腳本替換/sbin/ifconfig,過濾掉tun0相關的輸出,但這個比較容易被chkrootkit這樣的東西發(fā)現(xiàn),不過即使被人家用chkrootkit發(fā)現(xiàn)了也挺光榮的,至少用chkrootkit的人還稍微比較專業(yè)點,總比被人家ifconfig發(fā)現(xiàn)了好吧…… B:修改ifconfig的源程序,讓他輸出的時候不顯示tunX設備,這個相對穩(wěn)妥,因為一般檢查ifconfig都是對比那混雜模式而已的,當然還有文件類型。
[root@RH9 root]# rpm -q --whatprovides /sbin/ifconfig
net-tools-1.60-12
查了一下,在這個軟件包里,想改的自己可以改改,不想改的就去找找有沒人改好的現(xiàn)成的了,就當留給我和各位有興趣的朋友的家庭作業(yè)好了:)
六:TODO
tunX的穩(wěn)妥隱藏
chroot openvpn
七:參考
http://openvpn.net/howto.html
http://www.securityfocus.com/infocus/1821
Packt.Publishing.OpenVPN.Building.And.Integrating.Virtual.Private.Networks.pdf
Packt.Publishing.Building.And.Integrating.Virtual.Private.Networks.With.Openswan.pdf
八:寫在最后
信息安全是一把雙刃劍,自己知道了可以盡可能怎么攻擊,該怎么攻擊,其中會有什么地方可以被發(fā)現(xiàn),才有可能知道了人家想怎么攻擊,會怎么攻擊,也才有機會發(fā)現(xiàn)入侵企圖或入侵者,進而把入侵者趕出去或攔在門外,否則被人家root了幾年還不知道怎么回事。呵呵,我是不是做XX還立牌坊了?無論怎樣那卻是不爭的事實。
責任編輯 趙毅 zhaoyi#51cto.com TEL:(010)68476636-8001