squid透明代理+iptables防火墙详细配置

看到很多人都在不停地问iptables+squid做透明代理的问题,鄙人不才,斗胆在此做统一解答。如有任何纰漏还望各位批评指教。 ===================================

看到很多人都在不停地问iptables+squid做透明代理的问题,鄙人不才,斗胆在此做统一解答。如有任何纰漏还望各位批评指教。 
===================================================================== 
相关资源: 
man.chinaunix.net,左下角有iptables的man,仔细看看。 
系统: 
CentOS4.2,三块网卡,两个内网,一个外网。双至强,2GHz,2GB内存。服务器主要开了squid,sshd,其他的一律闭掉了。 
eth0:192.168.100.1 
eth1:192.168.168.12 
eth2:A.B.C.D ―― 外网地址 
===================================================================== 
squid设定可以根据自己的情况来,我们假设其端口为3128,在三块网卡上都有监听(不要绑定某一个IP或网卡)。 
/etc/squid/squid.conf 
http_port 3128 
cache_mem 1000 MB 
cache_swap_low 90 
cache_swap_high 95 
cache_dir ufs /opt/cache/squid 8000 16 256 
cache_access_log /var/log/squid/access.log 
cache_store_log /var/log/squid/store.log 
dns_nameservers 210.77.192.88 
maximum_object_size 409600 KB 
maximum_object_size_in_memory 64000 KB 
emulate_httpd_log on 
ipcache_size 1024 
ipcache_low 90 
ipcache_high 95 
fqdncache_size 1024 
forwarded_for off 
coredump_dir /opt/cache/squid/coredump httpd_accel_port 80 
httpd_accel_host virtual 
httpd_accel_with_proxy on 
httpd_accel_single_host off 
httpd_accel_uses_host_header on 
acl all src 0.0.0.0/0 
acl lixiaedu100 src 192.168.100.0/24 
acl lixiaedu168 src 192.168.168.0/24 
http_access allow lixiaedu100 
http_access allow lixiaedu168 
http_access deny all 
cache_effective_user squid 
cache_effective_group squid 
cache_mgr zhaobing8181@163.com 
visible_hostname lixiaedu 
====================================================================== 
iptables设定。iptables的设定分为两部分,一是如何进行SNAT,二是在开设了squid的情况下如何进行安全防护的问题。

一、SNAT 
modprobe ip_tables 
modprobe iptable_nat 
modprobe iptable_filter 
modprobe ip_conntrack_ftp 
modprobe ip_nat_ftp 
加挂一些iptables的必要的模块,以便调用。 
echo 1 > /proc/sys/net/ipv4/ip_forward 
打开“转发”功能。让数据包可以在不同的网卡间“流动”。 
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth2 -j SNAT --to A.B.C.D 
iptables -t nat -A POSTROUTING -s 192.168.168.0/24 -o eth2 -j SNAT --to A.B.C.D 
iptables -t nat -A PREROUTING -s 192.168.100.0/24 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 
iptables -t nat -A PREROUTING -s 192.168.168.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128 
上面这四句比较重要,是进行透明代理的关键。前两句的作用是进行“源地址转换”,也就是说要进行内网地址到外网地址的转换。执行了这两句,即使没有squid,内网机器也可以上网了。 
后面两句是对从两个内网网卡进入的、tcp协议的、目的端口号是80的,做“端口重定向”。重定向到3128端口。这样,squid就可以接到这个数据包了。 
OK!如果你的squid没有问题,而且你也执行了上面的语句,并且没有报错。那就恭喜你,一个iptables+squid的透明代理做成了。如果你不 相信,有两个方法可以测试:一是登录: ,这是一个国外网站,可以显示你的外网ip地址,还有是否被代理过。二是在一台内网机器上下载一个文件,或者看一页图片很多而且较慢的网页,然后转到另一 台内网机器上下载同样的文件或看刚才的图片网页。比 
较一下速度,就能感觉出来了。

二、firewall 
如果你把这样一台服务器放到internet上,无异于是想“自杀”。防火墙没有任何的保护机制和过滤功能。很容易被各种攻击所击破。不要迷 
信Linux的安全性,网管员的安全意识要比空喊Linux安全重要得多。 
iptables -F 
iptables -X 
iptables -F -t mangle 
iptables -t mangle -X 
iptables -F -t nat 
iptables -t nat -X 
首先,把三个表清空,把自建的规则清空。 
iptables -P INPUT DROP 
iptables -P OUTPUT DROP 
iptables -P FORWARD ACCEPT 
设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A OUTPUT -o lo -j ACCEPT 
先把“回环”打开,以免有不必要的麻烦。 
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT 
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT 
在所有网卡上打开ping功能,便于维护和检测。 
iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT 
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT 
打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入) 
iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT 
iptables -A INPUT -i eth1 -s 192.168.168.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -o eth1 -d 192.168.168.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT 
iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT 
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT 
上面这几句是比较头痛的,我做逐一解释。 
iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT 
允许192.168.100.0/24网段的机器发送数据包从eth0网卡进入。如果数据包是tcp协议,而且目的端口是3128(因为REDIRECT 已经把80改为3128了。nat表的PREROUTING是在filter表的INPUT前面的。)的,再而且,数据包的状态必须是NEW或者 ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,换句话说就是,允许客户端机器向服务器发出链接申请。ESTABLISHED表示通 过握手已经建立起链接),通过。 
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT 
我们先来看这一句。现在你的数据包已经进入到linux服务器防火墙上来了。squid需要代替你去访问,所以这时,服务器就成了客户端的角色,所以它要 使用32768到61000的私有端口进行访问。(大家会奇怪应该是1024到65535吧。其实CentOS版的linux所定义的私有端口是 32768到61000的,你可以通过cat  /proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次声 明:这里是squid以客户端的身份去访问其他的服务器,所以这里的源端口是32768:61000,而不是3128!

iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT 
当然了,数据有去就有回。

iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT 
数据包还得通过服务器,转到内网网卡上。请注意,这里,是squid帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而squid是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是3128,而不是32768:61000。

iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT 
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT 
当然,DNS是不可缺少的。

iptables -A INPUT -i eth+ -p tcp --dport 80 -j LOG --log-prefix "iptables_80_alert" --log-level info 
iptables -A INPUT -i eth+ -p tcp --dport 21 -j LOG --log-prefix "iptables_21_alert" --log-level info 
iptables -A INPUT -i eth+ -p tcp --dport 22 -j LOG --log-prefix "iptables_22_alert" --log-level info 
iptables -A INPUT -i eth+ -p tcp --dport 25 -j LOG --log-prefix "iptables_25_alert" --log-level info 
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j LOG --log-prefix "iptables_icmp8_alert" --log-level info 
当然了,来点日志记录会对网管员有所帮助。

至此,一个完整的访问过程就被我们分析过了。本篇中最主要的就是要说明squid在对内网机器和外网服务器中扮演了两种截然相反的角色。

这对大家来说不太好理解。我也是摸索了一段时间才成功的。愿我的文章抛砖引玉,能引起大家的共鸣和思索。 
本篇文章欢迎大家转载,请保留作者信息。

一点说明:最近见到过一种情况,就是squid无法启动,或者说起动起来几秒钟就自动停掉。messages中说有squid遇到了signal 25,所以停止。遇到这种问题,要查看squid的日志是不是太大了。我看了一下,access.log有1.6GB,store.log有2GB大小。 看来是日至文件偏大。把两个文件转移或者改名后就可以了

squid透明代理+iptables防火墙,多网卡详细配置的更多相关文章

  1. squid 透明代理配置

    阿铭在教程中已经介绍过squid的安装和配置,http://study.lishiming.net/chapter22.html 教程中只介绍了初级的正向代理和反向代理,这篇文档将要介绍透明代理如何配 ...

  2. CentOS切换为iptables防火墙并进行相关配置

    CentOS切换为iptables防火墙 切换到iptables首先应该关掉默认的firewalld,然后安装iptables服务. 1.关闭firewall: service firewalld s ...

  3. iptables防火墙操作-查看、配置、重启、关闭

    查看iptables端口配置 iptables -L -n --line-number iptables端口配置(不开通3389无法远程连接,不开通icmp无法ping) iptables -A IN ...

  4. 使用Squid做代理服务器,Squid单网卡透明代理配置详解(转)

    使用Squid做代理服务器 说到代理服务器,我们最先想到的可能是一些专门的代理服务器网站,某些情况下,通过它们能加快访问互联网的速度.其实,在需要访问外部的局域网中,我们自己就能设置代理,把访问次数较 ...

  5. 使用squid配置透明代理并对上网行为进行控制

    使用Squid配置透明代理 环境:CentOS 6.4 + squid-3.1.10-20.el6_5.3.x86_64 1.检查squid是否默认安装,没有安装先安装 rpm -qa squid 假 ...

  6. 《Linux就该这么学》培训笔记_ch16_使用Squid部署代理缓存服务

    <Linux就该这么学>培训笔记_ch16_使用Squid部署代理缓存服务 文章最后会post上书本的笔记照片. 文章主要内容: 代理缓存服务 配置Squid服务程序 正向代理 标准正向代 ...

  7. Linux(13):期中架构(5)--- 前端部分:keepalived高可用 & HTTPS & iptables防火墙

    keepalived 高可用集群 1. keepalived服务概念说明 # 1.1 keepalived软件的作用? Keepalived软件起初是专为LVS负载均衡软件设计的, 用来管理并监控LV ...

  8. CentOS 7 Squid代理服务器正向代理-透明代理

    Squid是Linux系统中最常用的一款开源代理服务软件,主要提供缓存加速和应用层过滤控制的功能,可以很好的实现HTTP.FTP.DNS查询以及SSL等应用的缓存代理 透明代理:提供与传统代理相同的功 ...

  9. 使用Squid部署代理缓存服务(标准正向、透明正反向代理)

    正向代理让用户可以通过Squid服务程序获取网站页面等数据,具体工作形式又分为标准代理模式与透明代理模式.标准正向代理模式: 将网站的数据缓存在服务器本地,提高数据资源被再次访问时的效率,但用户必需在 ...

随机推荐

  1. webapi 接口规则

    [HttpPost] [AuthorizeFilter] public HttpResponseMessage DeleteStudentInfo([FromBody] object value) { ...

  2. 如何创建一个自己的【Composer/Packagist】包

    首先让我们踏着欢快的脚步去Github创建一个新库,这里取名 composer-car,又欢快的将它克隆到本地: $ git clone git@github.com:victorruan/compo ...

  3. 安卓Intent(隐式)

    相对于显式Intent(明确指出了目标组件名称的Intent),隐式Intent,没有明确指出目标组件名称.显式Intent直接用组件的名称定义目标组件,这种方式很直接.但是由于开发人员往往并不清楚别 ...

  4. KinSlideshow参数设置说明

    [引用来自:http://blog.sina.com.cn/s/blog_4f4f4a5901014zn1.html] Jquery.KinSlideshow参数设置说明: 附:所有参数列表   in ...

  5. [IO] C# FileOperateHelper文件操作类与源码下载

    主要功能如下所示 源码预览 /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[url]ht ...

  6. jQuery 如何设置input checkbox 更有效 prop()

    问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性 ...

  7. Object-C添加方法

    给实例变量添加getter方法: #import <Cocoa/Cocoa.h> @interface Photo:NSObject { NSString *caption; NSStri ...

  8. eclipse和cygwin搭建C++环境的修正版本

    最近嫌弃切换系统麻烦.用了cygwin作为netbeans下C++的环境继续学习.我学的很渣,就不卖弄了. 网络上有很多这样的文章.经过对比和实验发现一个深坑.教程部分还是跟其他的一样,重点部分红字做 ...

  9. ACM YTU 十进制与八进制的转换 (栈和队列) STL栈调用

    十进制与八进制的转换(栈和队列) Description 对于输入的任意一个非负十进制整数,利用栈打印输出与其等值的八进制数. Input 111 Output 157 Sample Input 14 ...

  10. Mindjet MindManager 2012 从模板创建出现“Runtime Error pure virtual function call” 解决方法

    我的Mindjet MindManager 2012 Pro也就是MindManager10 在应用模板之后总会显示 Microsoft Visual C++ Runtime Library Runt ...