目的:
构建一台单网卡Linux网关(透明代理),该网关拨入某海外×××服务器,客户端设定该网关后,网络出口则为海外×××服务器,实现加速访问一些网站的目的。

环境信息:
硬件:DELL机器一台,单网卡(IP:10.39.100.253);
机器名:***GW
操作系统:CentOS6.0KernelLinux2.6.32-71.el6.i686
网络环境:局域网防火墙需允许该机器使用PPTP协议拨入某公网IP

安装步骤:
一.安装操作系统,设定IP,机器名,可关闭防火墙,SELinux;
修改主机名:设置CentOS主机名称的配置文件为:/etc/sysconfig/network
修改hosts文件:修改/etc/hosts文件
关闭SELinux:修改/etc/sysconfig/selinux
SELINUX=disabled#这是最标准的方式


设定系统使用EPEL源:
CentOS6.x32-bit(x86/i386):
rpm–Uvhhttp://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
CentOS6.x64-bit(x64):
rpm–Uvhhttp://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm

二.安装软件;
检查ppp,pptp,pptp-setup的安装情况,没有则yuminstall;

三.使用pptpsetup命令创建×××节点;
pptpsetup命令用法及说明:

 
  
  1. pptpsetup--create<TUNNEL>--server<ipaddress/hostname>[--domain<DOMAINNAME>]--username<USERNAME>[--password<PASSWORD>][--encrypt][--start]

  2. pptpsetup–delete<TUNNEL>删除一个节点

Options:
*<TUNNEL>创建的连接名称,自指定。
*<SERVER>PPTPSERVER的IP或域名。
*<DOMAIN>所在的域,很多Windows的服务器都是使用“域”来管理认证的。
*<USERNAME>×××用户名(域用户名)
*<PASSWORD>×××上用户密码,也可以没这个参数,命令稍后会自动询问,这样保证账号安全
*–encrypt表示启用加密,不必指定加密方式,命令会读取配置文件中的加密方式
*当没使用–encrypt连接时出现下面的错误时,表示使用了加密,这点也可以和×××的管理员联系确认一下,遇到下面的情况可以加上该参数。
*CHAPauthenticationsucceeded
*LCPterminatedbypeer(ZM-76-^@<M-Mt^@^@^BM-f)类似乱码
*–start创建连接完后马上连接。

运行该命令后实际上创建了两个配置文件:
/etc/ppp/chap-secrets
/etc/ppp/peers/连接名

配置文件/etc/ppp/peers/连接名需要做些修改,我的如下:

 
  
  1. #writtenbypptpsetup

  2. pty"pptp10.39.100.2--nolaunchpppd"

  3. lock

  4. noauth

  5. nobsdcomp

  6. nodeflate

  7. namecsnj\\administrator

  8. remotenamecs***

  9. ipparamcs***

  10. #defaultroute#使用本连接作为默认路由,本文单网卡没意义,可以不添加,说明见附录

  11. persist#当连接丢失时让pppd再次拨号,已验证

  12. require-mppe-128

  13. refuse-pap

  14. refuse-chap

  15. refuse-eap

  16. refuse-mschap

我在做这一步的时候,始终连接不上,怀疑过加密方法、握手协议什么的没用对,最终发现是用户名填写的方式要改变下。
需把上述两个配置文件里面的"DOMAIN\username"改为"DOMAIN\\username",就可以了。
这点在官方文档中亦有说明,链接:http://pptpclient.sourceforge.net/howto-redhat.phtml#setup
引用:

 
  
  1. *Thescriptdisplaysyourchoice,togetherwithinformationaboutspecifyingalocalname:

  2. AddaNEWCHAPsecret.

  3. NOTE:Anybackslashes(\)mustbedoubled(\\).

  4. LocalName:

  5. Thisisthe'local'identifierforCHAPauthentication.

  6. NOTE:IftheserverisaWindowsNTmachine,thelocalname

  7. shouldbeyourWindowsNTusernameincludingdomain.

  8. Forexample:

  9. domain\\username

  10. LocalName: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>来启停×××连接。
也可以使用pppdcall<tunnel>/killallpppd来启动/停止。

五.设置开机自动拨号,并在拨号后改变路由;
把启动拨号的命令添加到/etc/rc.d/rc.local文件中:

121347585.jpg

开机后查看路由已使用***通道设备。

121419776.jpg


六.查看×××Log;
相应的LOG可以在/var/log/message中查看。
tofurtherdiagnoseafailure,addoptionstothecommand(使用命令行拨号并查看屏幕日志):
pppdcall***_namedebugdumplogfd2nodetach

七.安装squid;
yum–yinstallsquid
启动squid:/etc/rc.d/init.d/squidstart

八.配置squid;
修改配置文件/etc/squid/squid.conf
配置为透明代理:
#Squidnormallylistenstoport3128
http_port10.39.100.253:3128transparent
配置squid开机自动启动:
chkconfigsquidon

九.关于访问控制;
设置完成后,关键且重要的任务是访问控制。Squid支持的管理方式很多,使用起来也非常简单(这也是有人宁愿使用不做任何缓存的Squid,也不愿意单独使用iptables的原因)。
Squid可以通过IP地址、主机名、MAC地址、用户/密码认证等识别用户,也可以通过域名、域后缀、文件类型、IP地址、端口、URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理,所以访问控制是Squid配置中的重点。
Squid用ACL(AccessControlList,访问控制列表)对访问类型进行划分,用http_accessdeny或allow进行控制。
本文通过Mac地址进行控制,在配置文件中修改
aclallowuserarpmac1mac2
http_accessallowallowuser
特别要注意的是,Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时,Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最后一条相反的规则。
iptables–tfilter–AINPUT–s10.39.101.152–Ieth0–jACCEPT
iptables–tfilter–AINPUT–s10.39.0.0/16–Ieth0–jDROP

十.打开内核IP转发;
方法一:修改/proc下内核参数文件内容
直接修改内核参数ip_forward对应在/proc下的文件/proc/sys/net/ipv4/ip_forward。用下面命令查看ip_forward文件内容:
#cat/proc/sys/net/ipv4/ip_forward
该文件默认值0是禁止ip转发,修改为1即开启ip转发功能。修改命令如下:
#echo1>/proc/sys/net/ipv4/ip_forward
修改过后就马上生效,即内核已经打开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-tnat-APOSTROUTING-s10.39.0.0/16-oppp0-jMASQUERADE
2.将客户端对Web端口80的请求转发到Squid3128端口,由Squid接手;
iptables-tnat-APREROUTING-s10.39.0.0/16-ieth0-ptcp--dport80-jREDIRECT--to-port3128
保存:/etc/rc.d/init.d/iptablessave
重启:serviceiptablesrestart

十二.安装过程中,学习了若干(>20)网络上的博客文章,知识库,无法一一列出,一并感谢。
网络中很多文章使用脚本来实现开机自动拨号,断线重拨等功能,因我不懂脚本,待以后弄懂了再补充。

本文PDF版笔记下载:http://down.51cto.com/data/416640