CentOS系统中squid透明代理+iptables防火墙详细配置2015-03-0216:12:04|分类:http|标签:|举报|字号大中小订阅看到很多人都在不停地问iptables+squid做透明代理的问题,鄙人不才,斗胆在此做统一解答。如有任何纰漏还望各位批评指教。===================================看到很多人都在不停地问iptables+squid做透明代理的问题,鄙人不才,斗胆在此做统一解答。如有任何纰漏还望各位批评指教。=====================================================================相关资源:man.chinaunix.net,左下角有iptables的man,仔细看看。系统:CentOS4.2,三块网卡,两个内网,一个外网。双至强,2GHz,2GB内存。服务器主要开了squid,sshd,其他的一律闭掉了。eth0:192.168.100.1eth1:192.168.168.12eth2:A.B.C.D――外网地址=====================================================================squid设定可以根据自己的情况来,我们假设其端口为3128,在三块网卡上都有监听(不要绑定某一个IP或网卡)。/etc/squid/squid.confhttp_port3128cache_mem1000MBcache_swap_low90cache_swap_high95cache_dirufs/opt/cache/squid800016256cache_access_log/var/log/squid/access.logcache_store_log/var/log/squid/store.logdns_nameservers210.77.192.88maximum_object_size409600KBmaximum_object_size_in_memory64000KBemulate_httpd_logonipcache_size1024ipcache_low90ipcache_high95fqdncache_size1024forwarded_foroffcoredump_dir/opt/cache/squid/coredumphttpd_accel_port80httpd_accel_hostvirtualhttpd_accel_with_proxyonhttpd_accel_single_hostoffhttpd_accel_uses_host_headeronaclallsrc0.0.0.0/0acllixiaedu100src192.168.100.0/24acllixiaedu168src192.168.168.0/24http_accessallowlixiaedu100http_accessallowlixiaedu168http_accessdenyallcache_effective_usersquidcache_effective_groupsquidcache_mgrzhaobing8181@163.comvisible_hostnamelixiaedu======================================================================iptables设定。iptables的设定分为两部分,一是如何进行SNAT,二是在开设了squid的情况下如何进行安全防护的问题。一、SNATmodprobeip_tablesmodprobeiptable_natmodprobeiptable_filtermodprobeip_conntrack_ftpmodprobeip_nat_ftp加挂一些iptables的必要的模块,以便调用。echo1/proc/sys/net/ipv4/ip_forward打开“转发”功能。让数据包可以在不同的网卡间“流动”。iptables-tnat-APOSTROUTING-s192.168.100.0/24-oeth2-jSNAT--toA.B.C.Diptables-tnat-APOSTROUTING-s192.168.168.0/24-oeth2-jSNAT--toA.B.C.Diptables-tnat-APREROUTING-s192.168.100.0/24-ieth0-ptcp--dport80-jREDIRECT--to-port3128iptables-tnat-APREROUTING-s192.168.168.0/24-ieth1-ptcp--dport80-jREDIRECT--to-port3128上面这四句比较重要,是进行透明代理的关键。前两句的作用是进行“源地址转换”,也就是说要进行内网地址到外网地址的转换。执行了这两句,即使没有squid,内网机器也可以上网了。后面两句是对从两个内网网卡进入的、tcp协议的、目的端口号是80的,做“端口重定向”。重定向到3128端口。这样,squid就可以接到这个数据包了。OK!如果你的squid没有问题,而且你也执行了上面的语句,并且没有报错。那就恭喜你,一个iptables+squid的透明代理做成了。如果你不相信,有两个方法可以测试:一是登录:,这是一个国外网站,可以显示你的外网ip地址,还有是否被代理过。二是在一台内网机器上下载一个文件,或者看一页图片很多而且较慢的网页,然后转到另一台内网机器上下载同样的文件或看刚才的图片网页。比较一下速度,就能感觉出来了。二、firewall如果你把这样一台服务器放到internet上,无异于是想“自杀”。防火墙没有任何的保护机制和过滤功能。很容易被各种攻击所击破。不要迷信Linux的安全性,网管员的安全意识要比空喊Linux安全重要得多。iptables-Fiptables-Xiptables-F-tmangleiptables-tmangle-Xiptables-F-tnatiptables-tnat-X首先,把三个表清空,把自建的规则清空。iptables-PINPUTDROPiptables-POUTPUTDROPiptables-PFORWARDACCEPT设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。iptables-AINPUT-ilo-jACCEPTiptables-AOUTPUT-olo-jACCEPT先把“回环”打开,以免有不必要的麻烦。iptables-AINPUT-ieth+-picmp--icmp-type8-jACCEPTiptables-AOUTPUT-oeth+-picmp--icmp-type0-jACCEPT在所有网卡上打开ping功能,便于维护和检测。iptables-AINPUT-ieth0-s192.168.100.250-d192.168.100.1-ptcp--dport22-jACCEPTiptables-AOUTPUT-oeth0-d192.168.100.250-s192.168.100.1-ptcp--sport22-jACCEPT打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入)iptables-AINPUT-ieth0-s192.168.100.0/24-ptcp--dport3128-mstate--stateNEW,ESTABLISHED-jACCEPTiptables-AOUTPUT-oeth0-d192.168.100.0/24-ptcp--sport3128-mstate--stateESTABLISHED-jACCEPTiptables-AINPUT-ieth1-s192.168.168.0/24-ptcp--dport3128-mstate--stateNEW,ESTABLISHED-jACCEPTiptables-AOUTPUT-oeth1-d192.168.168.0/24-ptcp--sport3128-mstate--stateESTABLISHED-jACCEPTiptables-AINPUT-ieth2-ptcp--dport32768:61000-mstate--stateESTABLISHED-jACCEPTiptables-AOUTPUT-oeth2-ptcp--sport32768:61000-mstate--stateNEW,ESTABLISHED-jACCEPTiptables-AOUTPUT-oeth2-pudp--dport53-jACCEPTiptables-AINPUT-ieth2-pudp--sport53-jACCEPT上面这几句是比较头痛的,我做逐一解释。iptables-AINPUT-ieth0-s192.168.100.0/24-ptcp--dport3128-mstate--stateNEW,ESTABLISHED-jACCEPT允许192.168.100.0/24网段的机器发送数据包从eth0网卡进入。如果数据包是tcp协议,而且目的端口是3128(因为REDIRECT已经把80改为3128了。nat表的PREROUTING是在filter表的INPUT前面的。)的,再而且,数据包的状态必须是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,换句话说就是,允许客户端机器向服务器发出链接申请。ESTABLISHED表示通过握手已经建立起链接),通过。iptables-AOUTPUT-oeth2-ptcp--sport32768:61000-mstate--stateNEW,ESTABLISHED-jACCEPT我们先来看这一句。现在你的数据包已经进入到linux服务器防火墙上来了。squid需要代替你去访问,所以这时,服务器就成了客户端的角色,所以它要使用32768到61000的私有端口进行访问。(大家会奇怪应该是1024到65535吧。其实CentOS版的linux所定义的私有端口是32768到61000的,你可以通过cat/proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次声明:这里是squid以客户端的身份去访问其他的服务器,所以这里的源端口是32768:61000,而不是3128!iptables-AINPUT-ieth2-ptcp--dport32768:61000-mstate--stateESTABLISHED-jACCEPT当然了,数据有去就有回。iptables-AOUTPUT-oeth0-d192.168.100.0/24-ptcp--sport3128-mstate--stateESTABLISHED-jACCEPT数据包还得通过服务器,转到内网网卡上。请注意,这里,是squid帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而squid是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是3128,而不是32768:61000。iptables-AOUTPUT-oeth2-pudp--dport53-jACCEPTiptables-AINPUT-ieth2-pudp--sport53-jACCEPT当然,DNS是不可缺少的。iptables-AINPUT-ieth+-ptcp--dport80-jLOG--log-prefixiptables_80_alert--log-levelinfoiptables-AINPUT-ieth+-ptcp--dport21-jLOG--log-prefixiptables_21_alert--log-levelinfoiptables-AINPUT-ieth+-p