目的:
構建一台單網卡Linux網關(透明代理),該網關撥入某海外VPN服務器,客戶端設定該網關後,網絡出口則為海外VPN服務器,實現加速訪問一些網站的目的。
環境信息:
硬件:DELL機器一台,單網卡(IP:10.39.100.253);
機器名:VpnGW
操作系統:CentOS 6.0 Kernel Linux 2.6.32-71.el6.i686
網絡環境:局域網防火牆需允許該機器使用PPTP協議撥入某公網IP
安裝步驟:
一. 安裝操作系統,設定IP,機器名,可關閉防火牆,SELinux;
修改主機名:設置CentOS主機名稱的配置文件為:/etc/sysconfig/network
修改hosts文件:修改/etc/hosts文件
關閉SELinux: 修改/etc/sysconfig/selinux
SELINUX=disabled #這是最標准的方式
設定系統使用EPEL源:
CentOS 6.x 32-bit (x86/i386):
rpm –Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
CentOS 6.x 64-bit (x64):
rpm –Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
二. 安裝軟件;
檢查ppp, pptp, pptp-setup的安裝情況,沒有則yum install;
三. 使用pptpsetup命令創建VPN節點;
pptpsetup命令用法及說明:
pptpsetup --create <TUNNEL> --server <ip address/hostname> [--domain <DOMAIN NAME>] --u sername <USERNAME> [--password <PASSWORD>] [--encrypt] [--start] pptpsetup –delete <TUNNEL> 刪除一個節點
Options:
* <TUNNEL> 創建的連接名稱,自指定。
* <SERVER> PPTP SERVER的IP或域名。
* <DOMAIN> 所在的域,很多Windows的服務器都是使用“域”來管理認證的。
* <USERNAME> VPN 用戶名(域用戶名)
* <PASSWORD> VPN上用戶密碼,也可以沒這個參數,命令稍後會自動詢問,這樣保證賬號安全
* –encrypt 表示啟用加密,不必指定加密方式,命令會讀取配置文件中的加密方式
URL:http://www.bianceng.cn/OS/Linux/201410/45923.htm
* 當沒使用–encrypt 連接時出現下面的錯誤時,表示使用了加密,這點也可以和VPN的管理員聯系確認一下,遇到下面的情況可以加上該參數。
* CHAP authentication succeeded
* LCP terminated by peer (ZM-76-^@<M-Mt^@^@^BM-f ) 類似亂碼
* –start 創建連接完後馬上連接。
運行該命令後實際上創建了兩個配置文件:
/etc/ppp/chap-secrets
/etc/ppp/peers/連接名
配置文件 /etc/ppp/peers/連接名 需要做些修改,我的如下:
# written by pptpsetup pty "pptp 10.39.100.2 --nolaunchpppd" lock noauth nobsdcomp nodeflate name csnj\\administrator remotename csvpn ipparam csvpn #defaultroute #使用本連接作為默認路由,本文單網卡沒意義,可以不添加,說明見附錄 persist #當連接丟失時讓pppd再次撥號,已驗證 require-mppe-128 refuse-pap refuse-chap refuse-eap refuse-mschap
我在做這一步的時候,始終連接不上,懷疑過加密方法、握手協議什麼的沒用對,最終發現是用戶名填寫的方式要改變下。
需把上述兩個配置文件裡面的"DOMAIN\username" 改為"DOMAIN\\username" ,就可以了。
這點在官方文檔中亦有說明,鏈接:http://pptpclient.sourceforge.net/howto-redhat.phtml#setup
引用:
* The script displays your choice, together with information about specifying a local name: Add a NEW CHAP secret. NOTE:Anybackslashes(\)mustbedoubled(\\). Local Name: This is the 'local' identifier for CHAP authentication. NOTE: If the server is a Windows NT machine, the local name should be your Windows NT username including domain. For example: domain\\username Local Name: your_domain\\your_username
四. 設置撥號腳本;
撥號腳本pon 和poff在下面的目錄 /usr/share/doc/ppp-*/scripts/ 裡:
cp /usr/share/doc/ppp-2.4.5/scripts/pon /usr/sbin
cp /usr/share/doc/ppp-2.4.5/scripts/poff /usr/sbin
chmod +x /usr/sbin/pon /usr/sbin/poff #使pon和poff腳本擁有執行權限
這樣就可以通過pon/poff <tunnel> 來啟停VPN連接。
也可以使用 pppd call <tunnel> / killall pppd來啟動/停止。
五. 設置開機自動撥號,並在撥號後改變路由;
把啟動撥號的命令添加到/etc/rc.d/rc.local文件中:
開機後查看路由已使用vpn通道設備。
六. 查看VPN Log;
相應的LOG可以在 /var/log/message中查看。
to further diagnose a failure, add options to the command(使用命令行撥號並查看屏幕日志):
pppd call vpn_name debug dump logfd 2 nodetach
七. 安裝squid;
yum –y install squid
啟動squid:/etc/rc.d/init.d/squid start
八. 配置squid;
修改配置文件 /etc/squid/squid.conf
配置為透明代理:
# Squid normally listens to port 3128
http_port 10.39.100.253:3128 transparent
配置squid開機自動啟動:
chkconfig squid on
九. 關於訪問控制;
設置完成後,關鍵且重要的任務是訪問控制。Squid支持的管理方式很多,使用起來也非常簡單(這也是有人寧願使用不做任何緩存的Squid,也不願意單獨使用iptables的原因)。
Squid可以通過IP地址、主機名、MAC地址、用戶/密碼認證等識別用戶,也可以通過域名、域後綴、文件類 型、IP地址、端口、URL匹配等控制用戶的訪問,還可以使用時間區間對用戶進行管理,所以訪問控制是Squid配置中的重點。
Squid用ACL (Access Control List,訪問控制列表)對訪問類型進行劃分,用http_access deny 或allow進行控制。
本文通過Mac地址進行控制,在配置文件中修改
acl allowuser arp mac1 mac2
http_access allow allowuser
特別要注意的是,Squid將使用allow-deny-allow-deny……這樣的順序套用規則。例如,當一個用戶訪問代理服務器時, Squid會順序測試Squid中定義的所有規則列表,當所有規則都不匹配時,Squid會使用與最後一條相反的規則。
iptables –t filter –A INPUT –s 10.39.101.152 –I eth0 –j ACCEPT
iptables –t filter –A INPUT –s 10.39.0.0/16 –I eth0 –j DROP
十. 打開內核IP轉發;
方法一:修改/proc下內核參數文件內容
直接修改內核參數ip_forward對應在/proc下的文件/proc/sys/net/ipv4/ip_forward。用下面命令查看ip_forward文件內容:
# cat /proc/sys/net/ipv4/ip_forward
該文件默認值0是禁止ip轉發,修改為1即開啟ip轉發功能。修改命令如下:
# echo 1 >/proc/sys/net/ipv4/ip_forward
URL:http://www.bianceng.cn/OS/Linux/201410/45923.htm
修改過後就馬上生效,即內核已經打開ip轉發功能。但如果系統重啟後則又恢復為默認值0,如果想永久打開需要通過修改/etc/sysctl.conf文件的內容來實現。
方法二.修改/etc/sysctl.conf文件
默認sysctl.conf文件中有一個變量是
net.ipv4.ip_forward = 0
將後面值改為1,然後保存文件。因為每次系統啟動時初始化腳本/etc/rc.d/rc.sysinit會讀取/etc/sysctl.conf文件的 內容,所以修改後每次系統啟動時都會開啟ip轉發功能。但只是修改sysctl文件不會馬上生效,如果想使修改馬上生效可以執行下面的命令:
# sysctl –p
十一. 配置iptables;
1. 將客戶端的請求NAT方式轉給外網進行路由;
iptables -t nat -A POSTROUTING -s 10.39.0.0/16 -o ppp0 -j MASQUERADE
2. 將客戶端對Web端口80的請求轉發到Squid 3128端口,由Squid接手;
iptables -t nat -A PREROUTING -s 10.39.0.0/16 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
保存:/etc/rc.d/init.d/iptables save
重啟:service iptables restart
十二. 安裝過程中,學習了若干(>20)網絡上的博客文章,知識庫,無法一一列出,一並感謝。
網絡中很多文章使用腳本來實現開機自動撥號,斷線重撥等功能,因我不懂腳本,待以後弄懂了再補充。
本文PDF版筆記下載:http://down.51cto.com/data/416640
本文出自 “不談理想” 博客,請務必保留此出處http://netside.blog.51cto.com/766556/870961