Linux 配置网关服务器详解
时间:2009-03-23 来源:sjhf
LINUX网关服务器搭建详解网关服务器需要实现的功能1 动态分配ip 2 网络地址转换NAT 3 支持vpn 实现所有以上功能,本着安全,稳定,性价比高的原则,采用linux搭建网关服务器 1 首先搭建dhcp服务,实现动态分配ip的功能 2 启用squid代理服务 3 使用netfilter防火墙功能 4 linux的路由功能实现 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广播一个dhcp discover信息包,向网络上的任意一个dhcp服务器请求提供ip租约. (2) ip租用提供.网络上所有的dhcp服务器均会收到此信息包,每台dhcp服务器通过UDP端口68给dhcp客户机回应一个dhcp offer广播包,提供一个ip地址. (3) Ip租用选择. 客户机从不止一台dhcp服务器接收到提供之后,会选择第一收到的dhcp offer包,并向网络中广播一个dhcp request消息包,表明自己已经接受到了一个dhcp服务器提供的ip地址.该广播中包含所接受的ip地址和服务器的ip地址. (4) Ip租用确认.被客户机选择的dhcp服务器在收到dhcp request广播后,会使用该广播包中的信息来配置自己的tcp/ip,则租用过程完成,客户机可以在网络中通信. 二 dhcp服务配置 1 安装dhcp包rpm -ivh dhcp-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-style interim; ignore client-updates; subnet 192.168.1.0 netmask 255.255.255.0 { # --- default gateway option routers 192.168.1.1; option subnet-mask 255.255.255.0; option nis-domain "urp.com.cn"; option domain-name "urp.com.cn"; option domain-name-servers 202.99.8.1; option time-offset -18000; # Eastern Standard Time # option ntp-servers 192.168.1.1; # option netbios-name-servers 192.168.1.1; # --- Selects point-to-point node (default is hybrid). Don't change this unless # -- you understand Netbios very well # option netbios-node-type 2; range dynamic-bootp 192.168.1.128 192.168.1.254; default-lease-time 21600; max-lease-time 43200;] # we want the nameserver to appear at a fixed address host ns { next-server marvin.redhat.com; hardware ethernet 12:34:56:78:AB:CD; fixed-address 207.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 make install #export CFLAGES='-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 #make install 我个人安装软件都比较喜欢用源码包自己编译,觉得这样知道你自己在做什么,用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文件 # NETWORK OPTIONS(有关的网络选项) # ----------------------------------------------------------------------------- http_port 3128 #代理端口 icp_port 3130 #icp端口 # OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM(作用于邻居选择算法的有关选项) #----------------------------------------------------------------------------- #禁止缓存 hierarchy_stoplist cgi-bin ? hierarchy_stoplist -i ^https:\\ ? acl QUERY urlpath_regex -i cgi-bin \? \.asp \.php \.jsp \.cgi acl denyssl urlpath_regex -i ^https:\\ no_cache deny QUERY no_cache deny denyssl #上面几个就是说遇到URL中有包含cgi-bin和以https:\\开头的都不要缓存, #还有asp、cgi、php等动态脚本也不要缓存, #因为这些脚本通常都是动态更新的,这样数据不同步。 #还有https://开通的不缓存是因为一般我们进行电子商务交易, #例如银行付款等都是采用这个的,如果把信用卡号什么缓存那不是很危险。 # OPTIONS WHICH AFFECT THE CACHE SIZE(定义cache大小的选项) # ----------------------------------------------------------------------------- cache_mem 8 MB #额外使用内存量,可根据你的系统内存在设定,一般为实际内存的1/3 cache_swap_low 90 #最低缓存百分比 cache_swap_high 95 ##最高缓存百分比,就是上面那个额外内存的使用百分比 maximum_object_size 4096 KB #单个文件最大缓存大小,超过这个大小将不缓存 maximum_object_size_in_memory 8 KB #在内存中单个文件最大缓存大小,超过这个大小将不缓存到内存中 #有DNS正反解所得到的IP存在缓存区的大小,这样可以加快解析速度 ipcache_size 1024 ipcache_low 90 ipcache_high 95 fqdncache_size 1024 # LOGFILE PATHNAMES AND CACHE DIRECTORIES(定义日志文件的路径及cache的目录) # ----------------------------------------------------------------------------- # <cache_dir>; <aufs|ufs>; <目录所在>; <MBytes大小>; <dir1>; <dir2>; # 那个 aufs 只有在编译的时候加入 --enable-async-io 那个选项才有支持, # 至于目录所在地与所占用的磁盘大小则请视您的主机情况而定, # 而后面 dir1, dir2 则是两个次目录的大小,通常 16 256 或 64 64 皆可, # 一般来说,数字最好是 16 的倍数,据说性能会比较好啦! cache_dir aufs /Cache1 100 16 256 cache_dir aufs /Cache2 100 16 256 #日志存放位置 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 # OPTIONS FOR EXTERNAL SUPPORT PROGRAMS(外部支持程序选项) # ----------------------------------------------------------------------------- #用代理登陆匿名ftp服务选项 # TAG: ftp_user ftp_user Squid@ #用户名 ftp_passive on #被动模式 #认证 #auth_param basic children 5 #auth_param basic realm Squid proxy-caching web server #auth_param basic credentialsttl 2 hours #auth_param basic casesensitive off # OPTIONS FOR TUNING THE CACHE(调整cache的选项) # ----------------------------------------------------------------------------- # TAG: refresh_pattern Cache更新时间设置 #<refresh_pattern>; <regex>; <最小时间>; <百分比>; <最大时间>; refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 #上面第一行如果网址开头是 ftp 的话,那么在一天(1440分钟)后, #如果proxy 再次取用这个档案时,则 cache 内的数据会被更新! # TIMEOUTS (超时) # ----------------------------------------------------------------------------- #连接到其他机器的最大尝试时间 connect_timeout 1 minute #连接到上层代理的超时时间 peer_connect_timeout 30 seconds #返回超时 request_timeout 2 minutes #持续连接时间 persistent_request_timeout 1 minute # ACCESS CONTROLS(访问控制) # ----------------------------------------------------------------------------- # TAG: acl #Examples: #acl myexample dst_as 1241 #acl password proxy_auth REQUIRED #acl fileupload req_mime_type -i ^multipart/form-data$ #acl javascript rep_mime_type -i ^application/x-javascript$ # #Recommended minimum configuration: acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl to_localhost dst 127.0.0.0/8 acl SSL_ports port 443 563 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT acl inside src 192.168.1.0/24 #内部网IP段 acl localmac arp "/usr/local/squid/localmac" #mac地址文件 # TAG: http_access http_access allow inside #允许inside规则通过 http_access allow localmac #允许localmac里面有登记的mac地址通过 # #Recommended minimum configuration: # # Only allow cachemgr access from localhost http_access allow manager localhost http_access deny manager # Deny requests to unknown ports http_access deny !Safe_ports # Deny CONNECT to other than SSL ports http_access deny CONNECT !SSL_ports # #http_access deny to_localhost # # And finally deny all other access to this proxy http_access deny all # TAG: http_reply_access http_reply_access allow all # TAG: icp_access #icp_access allow all # TAG: cache_peer_access # ADMINISTRATIVE PARAMETERS(管理参数) # ----------------------------------------------------------------------------- # TAG: cache_mgr cache_mgr webmaster@localhost #管理员信箱 # TAG: cache_effective_user cache_effective_user squid #运行squid时的用户 cache_effective_group squid #运行squid时的组 # TAG: visible_hostname visible_hostname ProxyServer #代理服务器名称 # OPTIONS FOR THE CACHE REGISTRATION SERVICE(cache注册服务选项) # ----------------------------------------------------------------------------- # HTTPD-ACCELERATOR OPTIONS(HTTPD加速选项) # ----------------------------------------------------------------------------- #设定透明代理 httpd_accel_host ProxyServer #主机名 httpd_accel_port 80 #透明代理端口 httpd_accel_with_proxy on httpd_accel_uses_host_header on # 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将删除最老的备份文件。默认值为1 0。如果想手动来进行这些操作, #可以用logfile_rotate 0来取消自动操作。 logfile_rotate 4 # TAG: forwarded_for on|off #关闭此项将在访问某些论坛时显示的IP是unknown, #如果打开则显示的是你client的内网IP forwarded_for off #图标文件目录 # icon_directory /usr/local/squid/share/icons #错误提示文件目录 # error_directory /usr/local/squid/share/errors/Simplify_Chinese # TAG: snmp_port # Squid can now serve statistics and status information via SNMP. # By default it listens to port 3401 on the machine. If you don't # wish to use SNMP, set this to "0". # #Default: # snmp_port 3401 # TAG: snmp_access # Allowing or denying access to the SNMP port. # # All access to the agent is denied by default. # usage: # # snmp_access allow|deny [!]aclname ... # #Example: # snmp_access allow snmppublic localhost # snmp_access deny all # #Default: # snmp_access deny all # DELAY POOL PARAMETERS (all require DELAY_POOLS compilation option)(延时池参数) # ----------------------------------------------------------------------------- # 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 -t nat -A POSTROUTING -j MASQUERADE #设置NAT功能 iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-ports 3128 #将所有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 -R squid:squid /Cache1 #chown -R squid:squid /Cache2 b.对cache目录进行初始化 #/usr/local/squid/sbin/squid -z 2004/11/01 23:06:29| Creating Swap Directories FATAL: Failed to make swap directory /Cache1/00: (13) Permission denied Squid Cache (Version 2.5.STABLE7): Terminated abnormally. CPU Usage: 0.000 seconds = 0.000 user + 0.000 sys Maximum Resident Size: 0 KB Page faults with physical i/o: 10 如果出现上面这样的错误信息,表示你/Cache1目录权限错误,请检查/Cache1目录所有者是否为squid用户所有。 c.启动squid #su squid -c "/usr/local/squid/bin/RunCache &" d.关闭squid #/usr/local/squid/sbin/squid -k shutdown 要执行两次才能正常关闭suqid e.重新读取squid.conf文件 #/usr/local/squid/sbin/squid -k reconfigure 需要执行两次才能重新读取squid.conf文件 6.日志分析 Proxy服务器安装好后,我们当然要对服务器进行监控,通过日志分析,我们可以知道那些用户上了那些网站,用了多少流量等,下面为大家介绍sarg这个日志分析工具,在squid的官方网站还推介了其他几种日志分析工具,大家有兴趣的话可以上去看看。 a.安装 #./configure --prefix=/usr/local/sarg --enable-bindir=/usr/local/sarg/bin #make && make install b.设置sarg.conf文件 #vi /usr/local/sarg/sarg.conf language language English #由于官方网站还没有发布中文版,所以我们就使用英文好了,那位有兴趣可以自己翻译一下 access_log /usr/local/squid/var/logs/access.log.0 #squid日志文件存放位置 title "Squid 使用报告" #标题 temporary_dir /tmp #临时目录 output_dir /var/www/html/sarg #生成后的html存放到那里,设置到你的网站目录下,以便浏览 overwrite_report no #是否覆盖报告,当那个日期的报告已经存在时是否覆盖掉 mail_utility mail topsites_num 100 exclude_codes /usr/local/sarg/exclude_codes max_elapsed 28800000 charset GB2312 #字符集 c.生成报告 设置好sarg.conf文件后,执行 #/usr/local/sarg/bin/sarg 将提示:SARG: Successful report generated on /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/modprobe ipt_MASQUERADE /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_nat_ftp /sbin/iptables -F /sbin/iptables -t nat -F /sbin/iptables -X /sbin/iptables -t nat -X /sbin/iptables -t mangle -F ###########################INPUT键######################### /sbin/iptables -P INPUT DROP /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables -A INPUT -p tcp -m multiport --dports 110,8080,80,25,22 -j ACCEPT #允许内网samba,smtp,pop3,连接 /sbin/iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT #允许dns连接 /sbin/iptables -A INPUT -p tcp --dport 1723 -j ACCEPT /sbin/iptables -A INPUT -p gre -j ACCEPT 允许外网vpn连接 /sbin/iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: " /sbin/iptables -A INPUT -p icmp -m limit --limit 6/m -j ACCEPT /sbin/iptables -A INPUT -p icmp -j DROP #设置icmp阔值 ,并对攻击者记录在案 /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP #拒绝外网对22端口访问. /sbin/iptables -N syn-flood /sbin/iptables -A INPUT -p tcp --syn -j syn-flood /sbin/iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN /sbin/iptables -A syn-flood -j REJECT #防止SYN攻击 轻量 #######################FORWARD链########################### /sbin/iptables -A FORWARD -p tcp -i eth1 -m multiport --dports 80,110,21,25,1723 -j ACCEPT /sbin/iptables -A FORWARD -p udp -i eth1 --dport 53 -j ACCEPT /sbin/iptables -A FORWARD -p gre -i eth1 -j ACCEPT /sbin/iptables -A FORWARD -p icmp -i eth1 -j ACCEPT #允许 vpn客户走vpn网络连接外网 ######################################################### /sbin/sysctl -w net.ipv4.ip_forward=1 &>;/dev/null #打开转发 ######################################################### /sbin/sysctl -w net.ipv4.tcp_syncookies=1 &>;/dev/null #打开 syncookie (轻量级预防 DOS 攻击) /sbin/sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>;/dev/null #设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数) /sbin/iptables -I INPUT -s 222.x.x.x -j ACCEPT #我自己的机了,全部放行 /sbin/iptables -I INPUT -s 202.x.x.x -j ACCEPT#老师的机子,全部放行 ########################OUTPUT链########################### /sbin/iptables -P OUTPUT ACCEPT |
相关阅读 更多 +