sushuanglei 2012-03-19
1动态分配ip
2网络地址转换NAT
3支持vpn
实现所有以上功能,本着安全,稳定,性价比高的原则,采用linux搭建网关服务器
1首先搭建dhcp服务,实现动态分配ip的功能
2启用squid代理服务
3使用netfilter防火墙功能
4linux的路由功能实现
5网络地址转换nat
6系统以及网络的优化
第一搭建dhcp服务
一dhcp介绍
使用DHCP服务器把TCP/IP网络设置集中起来,动态处理工作站的IP地址配置,用DHCP租约和预置的IP地址相联系,DHCP租约提供自动在TCP/IP网络上安全地分配和租用IP地址的机制,实现IP地址的集中式管理,从而基本上不需要网络管理员的人为干预.
DHCP的全称是动态主机配置协议,详尽的协议内容在RFC文档rfc2131和rfc1541里
Dhcp工作方式简单介绍:
(!)ip租用请求.dhcp客户机启动计算机后,通过UDP端口67广播一个dhcpdiscover信息包,向网络上的任意一个dhcp服务器请求提供ip租约.
(2)ip租用提供.网络上所有的dhcp服务器均会收到此信息包,每台dhcp服务器通过UDP端口68给dhcp客户机回应一个dhcpoffer广播包,提供一个ip地址.
(3)Ip租用选择.客户机从不止一台dhcp服务器接收到提供之后,会选择第一收到的dhcpoffer包,并向网络中广播一个dhcprequest消息包,表明自己已经接受到了一个dhcp服务器提供的ip地址.该广播中包含所接受的ip地址和服务器的ip地址.
(4)Ip租用确认.被客户机选择的dhcp服务器在收到dhcprequest广播后,会使用该广播包中的信息来配置自己的tcp/ip,则租用过程完成,客户机可以在网络中通信.
二dhcp服务配置
1安装dhcp包rpm-ivhdhcp-3.0pl2-6.16.i386.rpm
2复制模本配置文件cp/usr/share/doc/dhcp-3.0pl2/dhcpd.conf.sample/etc/dhcpd.conf
3配置文件vi/etc/dhcpd.conf
ddns-update-styleinterim;
ignoreclient-updates;
subnet192.168.1.0netmask255.255.255.0{
#---defaultgateway
optionrouters192.168.1.1;
optionsubnet-mask255.255.255.0;
optionnis-domain"urp.com.cn";
optiondomain-name"urp.com.cn";
optiondomain-name-servers202.99.8.1;
optiontime-offset-18000;#EasternStandardTime
#optionntp-servers192.168.1.1;
#optionnetbios-name-servers192.168.1.1;
#---Selectspoint-to-pointnode(defaultishybrid).Don'tchangethisunless
#--youunderstandNetbiosverywell
#optionnetbios-node-type2;
rangedynamic-bootp192.168.1.128192.168.1.254;
default-lease-time21600;
max-lease-time43200;]
#wewantthenameservertoappearatafixedaddress
hostns{
next-servermarvin.redhat.com;
hardwareethernet12:34:56:78:AB:CD;
fixed-address207.175.42.254;
}
}
第二搭建squid代理服务器
一代理服务器的优点
1具有代理服务的应用网关可以被配置成唯一可以被外部网络可视的主机,这样就可以保护内部主机免受外部主机的攻击.
2代理服务器可以提供高速的缓存功能.
3在应用网关上可以强制执行用户的身份验证.
4代理服务工作在客户机与真实服务器之间,完全控制会话,所以可以提供很详细的日志.
7在应用网关上可以使用第三方提供的身份认证和日志记录系统.
8代理能阻断危险的URL.
9代理能在危险的内容传送到客户之前过滤掉它们,如病毒和木马.
10使用应用网关可以简化包过滤原则(简化传输层路由),它只把目的地址为应用网关的数据包发给应用网关,而拒绝其他的数据包,这样,过滤原则就变得很简单.
11代理服务能检查返回内容的一致性.
12使用应用网关后,外部网络也无法与被保护的私有网络进行连接.
二安装配置squid
squid-2.5.STABLE12版本
./configure--enable-linux-netfilter--with-pthreads--with-dl--enable-basic-auth-helpers=NCSA
make
makeinstall
#exportCFLAGES='-O2-mcpu=pentium4-march=pentium4-mmmx-msse-msse2'
可以根据你的CPU选择相应的参数
GCC-3.1以上可針對CPU最佳化:
Pentium2:-O2-mcpu=i686-march=i686-mmmx
Pentium3:-O2-mcpu=pentium3-march=pentium3-mmmx-msse
Pentium4:-O2-mcpu=pentium4-march=pentium4-mmmx-msse-msse2
#./configure--prefix=/usr/local/squid--enable-gnuregex--enable-async-io=80--enable-icmp--enable-kill-parent-hack--enable-snmp--disable-ident-lookups--enable-cahce-digests--enable-arp-acl--enable-err-language="Simplify_Chinese"--enable-default-err-languages="Simplify_Chinese"--enable-poll--enable-linux-netfilter--enable-underscore
#make
#makeinstall
我个人安装软件都比较喜欢用源码包自己编译,觉得这样知道你自己在做什么,用rpm包好像不知道做什么的就安装好了。下面我们对各个编译参数进行解释,当然你可以通过./configure--help来查看其他的参数,以及各个参数的英文解释。
--prefix=/usr/local/squid:指定软件的安装路径
--enable-gnuregex:由于Squid大量使用字符串处理做各种判断,加入此项能更好的处理。
--enable-async-io=80:这个主要是设置async模式来运行squid,我的理解是设置用线程来运行squid,如果服务器配置很不错,有1G以上内存,cpu使用SMP的方式的话可以考虑设成160或者更高。如果服务器比较糟糕就根据实际情况设了。另外此项还另cache文件支持aufs
--enable-icmp:加入icmp支持
--enable-kill-parent-hack:关掉suqid的时候,要不要连同父进程一起关掉,这个当然要啦
--enable-snmp:此选项可以让MRTG使用SNMP协议对服务器的流量状态进行监测,因此必须选择此项,使Squid支持SNMP接口。
--disable-ident-lookups:防止系统使用RFC931规定的身份识别方法。
--enable-cahce-digests:加快请求时,检索缓存内容的速度。
--enable-arp-acl:可以在规则设置中直接通过客户端的MAC地址进行管理,防止客户使用IP欺骗。
--enable-err-language="Simplify_Chinese"和
--enable-default-err-languages="Simplify_Chinese":指定出错是显示的错误页面为简体中文
--enable-poll:应启用Poll()函数而不是select()函数,通常而言poll(轮询)比select要好,但configure(脚本程序)已知Poll在某些平台下失效,若你认为你比configure编译配置脚本程序要聪明的话,可以用这个选项启用Poll。总之就是用这个可以提升性能就是啦。
--enable-linux-netfilter:可以支持透明代理
--enable-underscore:允许解析的URL中出现下划先,因为默认squid会认为带下划线的URL地址是非法的,并拒绝访问该地址。
这里我们就安装好了,接下来就是修改配置文件了。
2.修改定义配置参数
下面是我的squid.conf文件
#NETWORKOPTIONS(有关的网络选项)
#-----------------------------------------------------------------------------
http_port3128#代理端口
icp_port3130#icp端口
#OPTIONSWHICHAFFECTTHENEIGHBORSELECTIONALGORITHM(作用于邻居选择算法的有关选项)
#-----------------------------------------------------------------------------
#禁止缓存
hierarchy_stoplistcgi-bin?
hierarchy_stoplist-i^https:\\?
aclQUERYurlpath_regex-icgi-bin\?\.asp\.php\.jsp\.cgi
acldenysslurlpath_regex-i^https:\\
no_cachedenyQUERY
no_cachedenydenyssl
#上面几个就是说遇到URL中有包含cgi-bin和以https:\\开头的都不要缓存,
#还有asp、cgi、php等动态脚本也不要缓存,
#因为这些脚本通常都是动态更新的,这样数据不同步。
#还有https://开通的不缓存是因为一般我们进行电子商务交易,
#例如银行付款等都是采用这个的,如果把信用卡号什么缓存那不是很危险。
#OPTIONSWHICHAFFECTTHECACHESIZE(定义cache大小的选项)
#-----------------------------------------------------------------------------
cache_mem8MB#额外使用内存量,可根据你的系统内存在设定,一般为实际内存的1/3
cache_swap_low90#最低缓存百分比
cache_swap_high95##最高缓存百分比,就是上面那个额外内存的使用百分比
maximum_object_size4096KB#单个文件最大缓存大小,超过这个大小将不缓存
maximum_object_size_in_memory8KB#在内存中单个文件最大缓存大小,超过这个大小将不缓存到内存中
#有DNS正反解所得到的IP存在缓存区的大小,这样可以加快解析速度
ipcache_size1024
ipcache_low90
ipcache_high95
fqdncache_size1024
#LOGFILEPATHNAMESANDCACHEDIRECTORIES(定义日志文件的路径及cache的目录)
#-----------------------------------------------------------------------------
# <cache_dir>;<aufs|ufs>;<目录所在>;<MBytes大小>;<dir1>;<dir2>;
# 那个aufs只有在编译的时候加入--enable-async-io那个选项才有支持,
# 至于目录所在地与所占用的磁盘大小则请视您的主机情况而定,
# 而后面dir1,dir2则是两个次目录的大小,通常16256或6464皆可,
# 一般来说,数字最好是16的倍数,据说性能会比较好啦!
cache_diraufs/Cache110016256
cache_diraufs/Cache210016256
#日志存放位置
cache_access_log/usr/local/squid/var/logs/access.log
cache_log/usr/local/squid/var/logs/cache.log
#TAG:cache_store_log
cache_store_log/usr/local/squid/var/logs/store.log
#TAG:pid_filename
pid_filename/usr/local/squid/var/logs/squid.pid
#OPTIONSFOREXTERNALSUPPORTPROGRAMS(外部支持程序选项)
#-----------------------------------------------------------------------------
#用代理登陆匿名ftp服务选项
#TAG:ftp_user
ftp_userSquid@#用户名
ftp_passiveon#被动模式
#认证
#auth_parambasicchildren5
#auth_parambasicrealmSquidproxy-cachingwebserver
#auth_parambasiccredentialsttl2hours
#auth_parambasiccasesensitiveoff
#OPTIONSFORTUNINGTHECACHE(调整cache的选项)
#-----------------------------------------------------------------------------
#TAG:refresh_patternCache更新时间设置
#<refresh_pattern>;<regex>;<最小时间>;<百分比>;<最大时间>;
refresh_pattern^ftp:144020%10080
refresh_pattern^gopher:14400%1440
refresh_pattern.020%4320
#上面第一行如果网址开头是ftp的话,那么在一天(1440分钟)后,
#如果proxy再次取用这个档案时,则cache内的数据会被更新!
#TIMEOUTS(超时)
#-----------------------------------------------------------------------------
#连接到其他机器的最大尝试时间
connect_timeout1minute
#连接到上层代理的超时时间
peer_connect_timeout30seconds
#返回超时
request_timeout2minutes
#持续连接时间
persistent_request_timeout1minute
#ACCESSCONTROLS(访问控制)
#-----------------------------------------------------------------------------
#TAG:acl
#Examples:
#aclmyexampledst_as1241
#aclpasswordproxy_authREQUIRED
#aclfileuploadreq_mime_type-i^multipart/form-data$
#acljavascriptrep_mime_type-i^application/x-javascript$
#
#Recommendedminimumconfiguration:
aclallsrc0.0.0.0/0.0.0.0
aclmanagerprotocache_object
acllocalhostsrc127.0.0.1/255.255.255.255
aclto_localhostdst127.0.0.0/8
aclSSL_portsport443563
aclSafe_portsport80#http
aclSafe_portsport21#ftp
aclSafe_portsport443563#https,snews
aclSafe_portsport70#gopher
aclSafe_portsport210#wais
aclSafe_portsport1025-65535#unregisteredports
aclSafe_portsport280#http-mgmt
aclSafe_portsport488#gss-http
aclSafe_portsport591#filemaker
aclSafe_portsport777#multilinghttp
aclCONNECTmethodCONNECT
aclinsidesrc192.168.1.0/24#内部网IP段
acllocalmacarp"/usr/local/squid/localmac"#mac地址文件
#TAG:http_access
http_accessallowinside#允许inside规则通过
http_accessallowlocalmac#允许localmac里面有登记的mac地址通过
#
#Recommendedminimumconfiguration:
#
#Onlyallowcachemgraccessfromlocalhost
http_accessallowmanagerlocalhost
http_accessdenymanager
#Denyrequeststounknownports
http_accessdeny!Safe_ports
#DenyCONNECTtootherthanSSLports
http_accessdenyCONNECT!SSL_ports
#
#http_accessdenyto_localhost
#
#Andfinallydenyallotheraccesstothisproxy
http_accessdenyall
#TAG:http_reply_access
http_reply_accessallowall
#TAG:icp_access
#icp_accessallowall
#TAG:cache_peer_access
#ADMINISTRATIVEPARAMETERS(管理参数)
#-----------------------------------------------------------------------------
#TAG:cache_mgr
cache_mgrwebmaster@localhost#管理员信箱
#TAG:cache_effective_user
cache_effective_usersquid#运行squid时的用户
cache_effective_groupsquid#运行squid时的组
#TAG:visible_hostname
visible_hostnameProxyServer#代理服务器名称
#OPTIONSFORTHECACHEREGISTRATIONSERVICE(cache注册服务选项)
#-----------------------------------------------------------------------------
#HTTPD-ACCELERATOROPTIONS(HTTPD加速选项)
#-----------------------------------------------------------------------------
#设定透明代理
httpd_accel_hostProxyServer#主机名
httpd_accel_port80#透明代理端口
httpd_accel_with_proxyon
httpd_accel_uses_host_headeron
#MISCELLANEOUS(杂项)
#-----------------------------------------------------------------------------
#TAG:logfile_rotate
#squid会定期的将日志文件更名并打包。
#比如正在使用的日志文件为access.log,squid会将其更名并打包为access.log.1.gz;
#过了一定时间后,squid又会将access.log.1.gz更名为access.log.2.gz
#并将当前的日志文件更名并打包为access.log.1.gz,以此循环。
#logfile_rotate指定的数字即为打包并备份的文件的数量,当达到这一数目时,
#squid将删除最老的备份文件。默认值为10。如果想手动来进行这些操作,
#可以用logfile_rotate0来取消自动操作。
logfile_rotate4
#TAG:forwarded_foron|off
#关闭此项将在访问某些论坛时显示的IP是unknown,
#如果打开则显示的是你client的内网IP
forwarded_foroff
#图标文件目录
#icon_directory/usr/local/squid/share/icons
#错误提示文件目录
#error_directory/usr/local/squid/share/errors/Simplify_Chinese
#TAG:snmp_port
#SquidcannowservestatisticsandstatusinformationviaSNMP.
#Bydefaultitlistenstoport3401onthemachine.Ifyoudon't
#wishtouseSNMP,setthisto"0".
#
#Default:
#snmp_port3401
#TAG:snmp_access
#AllowingordenyingaccesstotheSNMPport.
#
#Allaccesstotheagentisdeniedbydefault.
#usage:
#
#snmp_accessallow|deny[!]aclname...
#
#Example:
#snmp_accessallowsnmppubliclocalhost
#snmp_accessdenyall
#
#Default:
#snmp_accessdenyall
#DELAYPOOLPARAMETERS(allrequireDELAY_POOLScompilationoption)(延时池参数)
#-----------------------------------------------------------------------------
#TAG:coredump_dir
#当squid突然挂掉的时候,或者突然出现什么故障的时候,将squid在内存中的资料写到硬盘中
coredump_dir/usr/local/squid/var/cache
3.设置iptables支持透明代理
设置squid+iptables支持透明代理前请先设置好NAT,可以使用下面的简单语句
echo"1">;/proc/sys/net/ipv4/ip_forward#设置转发
/sbin/iptables-tnat-APOSTROUTING-jMASQUERADE#设置NAT功能
iptables-tnat-APREROUTING-ieth0-ptcp-s192.168.1.0/24--dport80-jREDIRECT--to-ports3128
#将所有80端口的请求都转发到suqid的3128端口上
其中192.168.1.0/24表示192.168.1.1-254这个网段通过squid和nat做透明代理。
这样,当用户访问www服务的时候可以使用cache作为高速代理,减少流量,而其他服务则通过nat转发。
4.使用上层代理
当你访问国外网站比较慢的时候,可以通过设置代理访问,那么我们自己的代理服务器能否也设置别人的代理来访问国外的网站呢?答案是肯定的。
例如有代理proxy1.cnlinux.net能以较快的速度访问国外,且我们访问它也比较快,所以我们用它来作为我们访问国外网站的上层代理。
我们需要在squid.conf中添加如下参数:
5.启动,关闭squid
a.将cache目录的所有者更改为squid
#chown-Rsquid:squid/Cache1
#chown-Rsquid:squid/Cache2
b.对cache目录进行初始化
#/usr/local/squid/sbin/squid-z
2004/11/0123:06:29|CreatingSwapDirectories
FATAL:Failedtomakeswapdirectory/Cache1/00:(13)Permissiondenied
SquidCache(Version2.5.STABLE7):Terminatedabnormally.
CPUUsage:0.000seconds=0.000user+0.000sys
MaximumResidentSize:0KB
Pagefaultswithphysicali/o:10
如果出现上面这样的错误信息,表示你/Cache1目录权限错误,请检查/Cache1目录所有者是否为squid用户所有。
c.启动squid
#susquid-c"/usr/local/squid/bin/RunCache&"
d.关闭squid
#/usr/local/squid/sbin/squid-kshutdown
要执行两次才能正常关闭suqid
e.重新读取squid.conf文件
#/usr/local/squid/sbin/squid-kreconfigure
需要执行两次才能重新读取squid.conf文件
6.日志分析
Proxy服务器安装好后,我们当然要对服务器进行监控,通过日志分析,我们可以知道那些用户上了那些网站,用了多少流量等,下面为大家介绍sarg这个日志分析工具,在squid的官方网站还推介了其他几种日志分析工具,大家有兴趣的话可以上去看看。
a.安装
#./configure--prefix=/usr/local/sarg--enable-bindir=/usr/local/sarg/bin
#make&&makeinstall
b.设置sarg.conf文件
#vi/usr/local/sarg/sarg.conf
languagelanguageEnglish#由于官方网站还没有发布中文版,所以我们就使用英文好了,那位有兴趣可以自己翻译一下
access_log/usr/local/squid/var/logs/access.log.0#squid日志文件存放位置
title"Squid使用报告"#标题
temporary_dir/tmp#临时目录
output_dir/var/www/html/sarg#生成后的html存放到那里,设置到你的网站目录下,以便浏览
overwrite_reportno#是否覆盖报告,当那个日期的报告已经存在时是否覆盖掉
mail_utilitymail
topsites_num100
exclude_codes/usr/local/sarg/exclude_codes
max_elapsed28800000
charsetGB2312#字符集
c.生成报告
设置好sarg.conf文件后,执行
#/usr/local/sarg/bin/sarg
将提示:SARG:Successfulreportgeneratedon/usr/local/apache/htdocs/sarg/2004Oct31-2004Nov01
表示报告生成成功,还有报告存放位置,可以马上打开您的浏览器查看报告了。
三、关于Cache目录的建议
由于cache目录是经常的读写,所以最好硬盘能用SCSI的,速度比较快而且稳定。如果我们的cache大概需要40G的大小,那么我们尽量使用多硬盘,不要当纯用一个40G的硬盘,可以使用4个10G的硬盘,这样,对于cache的速度更快。比如,当你有10M的东西要写到cache中,如果是只是用一个硬盘的话,虽然可能你已经将4个cache目录分别放在4个分区,可是你只有一个硬盘,同时只有一个在写入,可是当你有4个硬盘的时候,你每个硬盘就只要写入2.5M的东西,那样是不是更快呢?
还有,建议将每个cache目录单独存放在一个分区中,分区不要划分太大,一般2至4G就行,这样proxy搜索资料的时候不用耗费太多的时间。
设置iptable防火墙规则,
这个也不用多说,
由于我做的这个只一个代理,而不是透明代理,
设置iptables只是为了安全,网上有好多iptable的脚本,
可以根据自己的实际情况和需求加以修改就可以用了,
我的这个服务器和功能就只是一个代理服务器,
在/etc/rc.d/下面建脚本文件firewall,把下面的内容为下面的脚本.
然后在/etc/rc.d/rc.local中加入一句
/etc/rc.d/firewall
保存退出.
下面是我的iptable的脚本:
#!/bin/sh
#
/sbin/modprobeipt_MASQUERADE
/sbin/modprobeip_conntrack_ftp
/sbin/modprobeip_nat_ftp
/sbin/iptables-F
/sbin/iptables-tnat-F
/sbin/iptables-X
/sbin/iptables-tnat-X
/sbin/iptables-tmangle-F
###########################INPUT键#########################
/sbin/iptables-PINPUTDROP
/sbin/iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
/sbin/iptables-AINPUT-ptcp-mmultiport--dports110,8080,80,25,22-jACCEPT
#允许内网samba,smtp,pop3,连接
/sbin/iptables-AINPUT-ieth1-pudp-mmultiport--dports53-jACCEPT
#允许dns连接
/sbin/iptables-AINPUT-ptcp--dport1723-jACCEPT
/sbin/iptables-AINPUT-pgre-jACCEPT
允许外网vpn连接
/sbin/iptables-AINPUT-picmp-mlimit--limit3/s-jLOG--log-levelINFO--log-prefix"ICMPpacketIN:"
/sbin/iptables-AINPUT-picmp-mlimit--limit6/m-jACCEPT
/sbin/iptables-AINPUT-picmp-jDROP
#设置icmp阔值,并对攻击者记录在案
/sbin/iptables-AINPUT-ieth0-ptcp--dport22-jDROP
#拒绝外网对22端口访问.
/sbin/iptables-Nsyn-flood
/sbin/iptables-AINPUT-ptcp--syn-jsyn-flood
/sbin/iptables-Isyn-flood-ptcp-mlimit--limit3/s--limit-burst6-jRETURN
/sbin/iptables-Asyn-flood-jREJECT
#防止SYN攻击轻量
#######################FORWARD链###########################
/sbin/iptables-AFORWARD-ptcp-ieth1-mmultiport--dports80,110,21,25,1723-jACCEPT
/sbin/iptables-AFORWARD-pudp-ieth1--dport53-jACCEPT
/sbin/iptables-AFORWARD-pgre-ieth1-jACCEPT
/sbin/iptables-AFORWARD-picmp-ieth1-jACCEPT
#允许vpn客户走vpn网络连接外网
#########################################################
/sbin/sysctl-wnet.ipv4.ip_forward=1&>;/dev/null
#打开转发
#########################################################
/sbin/sysctl-wnet.ipv4.tcp_syncookies=1&>;/dev/null
#打开syncookie(轻量级预防DOS攻击)
/sbin/sysctl-wnet.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800&>;/dev/null
#设置默认TCP连接痴呆时长为3800秒(此选项可以大大降低连接数)
/sbin/iptables-IINPUT-s222.x.x.x-jACCEPT#我自己的机了,全部放行
/sbin/iptables-IINPUT-s202.x.x.x-jACCEPT#老师的机子,全部放行
########################OUTPUT链###########################
/sbin/iptables -P OUTPUT ACCEPT