• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

一个月的心血!iptables+NAT+squid 透明代理上网实现方案

发布: 2007-7-04 12:06 | 作者: admin | 来源:  网友评论 | 查看: 125次 | 进入软件测试论坛讨论

领测软件测试网
一个月的心血!iptables+NAT+squid 透明代理上网实现方案
 :?: 
历尽千辛万苦,翻变了所有技术论坛,整整研究了一个多月终于搞定啦!
关于此话题网上很多,但没有一篇是能让你实现目标的,惟有这篇!
本人也是Linux菜鸟,刚开始玩Linux,自学的何其经历艰苦!
今天刊登这份文章,希望给象我一样的新手提供帮助。
更希望高手能够指出不足之处,谢谢。


平台:RedHat8.0 各组件均为Linux 自带,双网卡eth0为出口地址,eth1为连接内网地址,网络连接正常。

实现步骤:

一。做IP地址翻译,让局域网内机器能够连入互联网。

    #加载模块  
    modprobe ip_tables      
    modprobe iptable_nat    
    modprobe iptable_filter    
    modprobe ip_conntrack_ftp  
    modprobe ip_nat_ftp
    #启用IP转发
    echo 1 > /proc/sys/net/ipv4/ip_forward
    #ip翻译(伪装)
    iptables -t nat -A POSTROUTING -s 172.28.0.0/16 -o eth0 -j SNAT --to x.x.x.x

    注:172.28.0.0/16为内网地址,x.x.x.x为这台机器的外部接口地址。

    客户端只需将自己的网关设置为这些命令就实现了让内网机器上网的目的!如果想用代理服务器提供HTTP的缓存功能接 着做:

二。代理服务器

    #修改配置文件----squid.conf    
    cd /etc/squid
    cp squid.conf.defauld squid.conf    
    #切记!这点重要,因为二者文件有所不同!!!

行数          修改
48http_port 80
405cache_mem 80 MB  #大小自己改
1466         http_access allow all
1650         httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on    

   最后一步运行squid:
   cd /etc/init.d
   ./squid start

#以上是最简单的设置,至于怎么优化squid请参考其他资料。

这样,客户端实际上是通过代理方式浏览网页(其他服务则不通过代理服务!)。
这样做的最大神奇之处在于:
1.客户断完全感觉不到代理服务器的存在,IE不用做任何设置!
2.你可以随时启动/关闭squid,客户端完全不受影响!(够神奇吧?!)


三.补充
  
    以下两句最好写进 /etc/rc.d/rc.local,因为这两条记录重起机器后就失效了。
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 172.28.0.0/16 -o eth0 -j SNAT --to x.x.x.x





祝大家愉快! :P 



这家伙很懒,写的不够详细,如有不明之处,请跟贴。   



注:  [color=red:eef1554163][size=18:eef1554163]这部分内容目前实现的功能主要就是一个nat的转换的功能,对于squid方便的功能还没有加上来,如果想实现iptables + squid的结合的话,必须在规则里加上如下一条:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 172.28.0.0/16 --dport 80 -j REDIRECT --to-port 3128


     by wind521[/size:eef1554163][/color:eef1554163]

 wind521 回复于:2003-06-27 09:46:09
不是吧! 

:)这个东东用了一个月!!!

 wh720 回复于:2003-06-27 09:49:39
对于第3条补充, 我是这样做的,
1、修改/etc/sysctl.conf, net.ipv4.ip_forward = 1
2、成功iptable转发后,用iptables-save > iptables,生成一个文件,然后将iptables文件移到/etc/sysconfig下。

 RedmJ 回复于:2003-06-27 09:50:57
做ip翻译的时候,每台局域网的客户端都要那样设置??

 xgpiao 回复于:2003-06-27 10:31:59
:oops: 本人是菜鸟所以时间比较长一点,很辛苦啊!

注:我使用的内网地址是172.28.0.0 255.255.0.0
NAT机器内网IP地址是172.28.0.1
客户机的地址只要是这个网段,并且把网关设成172.28.0.1就可以了。

 :P 没想到还有比我菜的鸟,哈哈,总算我也有发挥的余地啦啦啦~~~

 bjchenxu 回复于:2003-06-27 12:29:12
加个精华,鼓励原创

 netloafer 回复于:2003-06-27 12:47:43
鼓励原创!!但精华没有必要!!

 bird123 回复于:2003-06-27 13:12:21
好象只是实现了NAT,内部用户能上网,squid根本没用上

 tiansgx 回复于:2003-06-27 13:35:25
不错

 hwhuwww 回复于:2003-06-27 15:33:35
他的nat 和 iptables做在一起了啊

不错不错,值得鼓励!

 轩辕砍刀 回复于:2003-06-27 15:35:48


 bb8848 回复于:2003-06-27 15:54:31
[quote:148208b9a2="bird123"]好象只是实现了NAT,内部用户能上网,squid根本没用上[/quote:148208b9a2]     
好像是哦

 flag 回复于:2003-06-27 16:21:28
没用吗?应该不会吧,毕竟squid还是监视80端口的请求来着,而且没有做nat伪装,port端口没有映射。

 yoursmile 回复于:2003-06-27 16:31:00
48 http_port 80 

应该就可以了。

不过squid 的日志长的很快,各位有没有什么好办法让它限制大小,比如超过多少字节就 自动删除某个日期以前的日志。

 tony_list 回复于:2003-06-27 17:37:19
请问楼主,做NAT的透明代理不就可以实现局域网的代理上网了吗?干吗还加SQUID?

 xgpiao 回复于:2003-06-27 17:39:51
我认为SQUID在运行的情况下是起作用的,有两种情况: 

1.我把SQUID的默认的端口3128改成了80,所以在开启SQUID的情况下,只要是从80端口进来的数据请求都做缓冲;在关闭SQUID的情况下,数据未经处理直接就转发出去了。 

2.在SQUID的默认端口是3128的情况下,就要做一个转发处理了,用这条命令:iptables -t nat -A PREROUTING -i eth1 -p tcp -s 172.28.0.0/16 --dport 80 -j REDIRECT --to-port 3128。这样就把所有80端口的请求转发到了3128(因为squid监听此端口)。 

这是我总结的经验,至于正确与否,我还不能保证, :?   还要请各路高手指点呀!  :wink:

 无双 回复于:2003-06-27 17:50:49
继续补充
做的时候会对NAT有不少见解
还有iptables
把他们写出来

以及碰到的问题也写出来

这样以后大家就不会犯同样错误了

 flag 回复于:2003-06-27 18:21:05
不是说得很清楚了吗?做缓存来着,可以加快网络速度,特别是很多台主机的局域网。

 wjlxsl 回复于:2003-06-28 08:52:59
其实楼主的SQUID没有生效。
iptables -t nat -A POSTROUTING -s 172.28.0.0/16 -o eth0 -j SNAT --to x.x.x.x 

注:172.28.0.0/16为内网地址,x.x.x.x为这台机器的外部接口地址。这一句应该只实现了MASQUERADE。

 RedmJ 回复于:2003-06-28 11:31:26
楼主被人打击了,来打击我!
你这种做法不太对吧!!!^_^

 firer2000 回复于:2003-06-28 15:45:35
squid如果和iptables在一起做透明代理,squid的用户认证功能就不好用,

有没有能解决这个问题的?

 ipcfg 回复于:2003-06-28 17:28:06
我认为楼主没错,虽然我做的和他不一样

 etherman 回复于:2003-06-28 22:05:43
[quote:01c8e97bd4="wjlxsl"]其实楼主的SQUID没有生效。
iptables -t nat -A POSTROUTING -s 172.28.0.0/16 -o eth0 -j SNAT --to x.x.x.x 

注:172.28.0.0/16为内网地址,x.x.x.x为这台机器的外部接口地址。这一句应该只实现了MASQUERADE。[/quote:01c8e97bd4]     

有理,要生效要PREROUTING TO INTERNAL GATEWAY, 不过我之用过ipchains, 但总觉得有问题。

 瘦骆驼 回复于:2003-06-28 23:07:19
顶楼这位兄弟的代理没有跑起来,最起码在iptables的语句中应该进行端口映射啊?! :roll:     

你只实现了源地址转换.........     

使用squid代理要做的不是snat,而是端口重定向(对端口80来说)。

假设没有改变squid的默认端口,那么你的netfilter/iptables规则应该这样写:

[color=darkblue:04268c26f7]#以下2句缺一不可
#对web的请求映射到代理服务器的特定端口
iptables -t nat -A PREROUTING -s 172.28.0.0/16 -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

#访问外网其他服务的进行地址伪装
iptables -t nat -A POSTROUTING -s 172.28.0.0/16 -o eth0 -j SNAT --to x.x.x.x     [/color:04268c26f7]     

     所谓透明代理只是客户端不需要额外设置,所有的设置在服务器端完成而已。从搂主原文及后来的帖子看,存在以下错误认识:1.混淆了外网web服务器的80端口与squid代理服务器80端口的关系。实际上,即使将作为网关的squid代理监听端口改为80,仍然需要上面的2条规则,缺一不可,只不过要把第1句最后的--to-port 3128改为--to-prot 80。  2.严重夸大了透明代理的神奇之处,以为停止squid的服务不影响内网用户访问外部web服务器。在搂主的错误设置下确实是这样,因为代理根本就没有起作用  :em10:  看了上面的2条iptables规则,我们应该知道,如果停止了代理服务,必须删除第1条规则(或进行其它调整),否则你还是趁早收拾好铺盖卷儿,然后向老板解释说全世界的web服务器都在今天宕掉了,最后测试一下你的老板有没有资格步入全球500傻之列来碰碰运气……

 瘦骆驼 回复于:2003-06-29 01:32:04
我只是想坐下来讨论一下技术问题,希望搂主不要介意。

建议对netfilter/iptables感兴趣的朋友首先去看 Linux 2.4 NAT HOWTO和Linux 2.4 Packet Filtering HOWTO ,一定会有收获的。

 wjlxsl 回复于:2003-06-29 09:05:14
关于楼主的技术我做了测试的。说真的。我还没有想到过把代理端口设为80。:);后来想的确是可以的。
如果squid 的代理端口设成80后。要使SQUID代理生效必须在SNAT下加上端口转向那一句。
iptables -t nat -A PREROUTING -s 172.28.0.0/16 -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 80
这样客户端对80的请求才会转向SQUID的监听端口。

测试可以看一下/var/log/squid/access.log文件。如走在代理下应客户端在浏览WEB时,此文件动态增加即记录客户端所做的任何请求(ACCEPT或DROP)。

 ipcfg 回复于:2003-06-29 15:47:02
我提议把次添从精华中删掉

 badb0y 回复于:2003-06-29 16:05:17
squid现在有溢出!
做简单的NAT透明代理就行了,

 sunt 回复于:2003-06-29 16:08:46
斑竹可能要做http缓冲服务器用得吧

 zanglx 回复于:2003-06-29 16:22:23
[quote:b3e25fc1cb="xgpiao"]一个月的心血!iptables+NAT+squid 透明代理上网实现方案
 :?: 
历尽千辛万苦,翻变了所有技术论坛,整整研究了一个多月终于搞定啦!
关于此话题网上很多,但没有一篇是能让你实现目标的,惟有这篇!
本人也是Li..........[/quote:b3e25fc1cb]     


谢谢了!!

 xgpiao 回复于:2003-06-30 11:17:04
周末休息没来上网,没想到这么多热心的朋友啊!

     感谢大家热情积极的讨论! :) 

     说实在的,我的议题从功能上或操作上来讲,其实很简单,无非是几条命令。

   但,难的是正如如大家的讨论一样,各有各的想法,无法达成统一,我也是看的很迷惑,到底谁说的对?!有没有标准的规范?

   本来,我发表本次文章的时候也没有完全搞清楚问题之所在,此课题作到这里就不打算继续了,因为毕竟NAT+SQUID功能实现了(自我想法,没有得到证实),没想到大家对我的议题这么感兴趣,所以促使我继续向前,深究到底!我会继续研究它的真正运行机制,只要得出完整的结论,一定会继续跟大家进行讨论的。


探索的道路何其艰苦啊!


再次感谢大家的参与。 :P

 瘦骆驼 回复于:2003-06-30 11:38:33
[quote:79d83133fb="xgpiao"]周末休息没来上网,没想到这么多热心的朋友啊!

     感谢大家热情积极的讨论! :) 

     说实在的,我的议题从功能上或操作上来讲,其实很简单,无非是几条命令。

   但,难的是正如如大家的讨论一样,各?.........[/quote:79d83133fb]     


当然是你错了,这一点不用怀疑。呵呵

最权威的指南是《Linux 2.4 NAT HOWTO》,该去好好读读。

 dylix 回复于:2003-06-30 12:53:27
是错是对,看看squid的访问日志access.log不就知道了?

 wind521 回复于:2003-06-30 13:10:14
这个贴子加的精华,就是为了鼓励一下这样的行动

现在大家写东西越来越少了,这个功能里只是一个NAT的功能,对于squid的代理功能还没有体现出来,如果用的话,要在iptables里对于80的访问reject到3128(默认的)上来,这样才真正结合起来

 hss202 回复于:2003-06-30 20:57:31
要实现iptables nat,这样最简单
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth0 -j MASQUERADE
这样,整个200网段的机器都可以上网,且什么都不用设置

 wildgoose 回复于:2003-06-30 21:16:34
建议斑竹把搂主的内容和后来老兄们添加的端口从定向部分整理一下
这样就不会引起误导了

 瘦骆驼 回复于:2003-07-01 00:48:13
[quote:d8835ca548="wildgoose"]建议斑竹把搂主的内容和后来老兄们添加的端口从定向部分整理一下
这样就不会引起误导了[/quote:d8835ca548]     

深有此感!

版主将此帖列为精华, 如不加批注, 恐怕会害初学者不浅. 呵呵 :x

 tingyu 回复于:2003-07-01 09:51:49
我觉得squid不好用,首先启动它后发现它占用了很大比例的内存(我的128M启动后还剩几M,如果关闭它,就可以剩下一半),这个容易造成squid自动关闭,影响使用,其次,如果启用日志,access.log文件将会疯狂的增长,时间长了以后文件大到一定字节,squid就起不来,这时将这个文件内容清空就OK了,也许这也和Memory有关,所以我用了NAT之后就没用squid了.

 B2Sun 回复于:2003-07-03 20:15:40
对了,安全方面怎么样呢?有没有评测过,和OPENBSD相比如何???
along@B2sun.com

 B2Sun 回复于:2003-07-03 20:18:55
好呀

 thinmonkey 回复于:2003-07-18 16:45:20
可以将access.log做个rotate啊,这样日志就不会太大

 tian_005 回复于:2003-07-18 16:58:33
ding 努力呀,这个网站我相信会成为第一中国UINX学习论坛

 wuzy 回复于:2003-07-21 16:27:55
建议斑竹整理一下,思路有点儿乱(水平有限)

 cavalierjx 回复于:2003-07-21 21:50:59
好啊,多多益善,谢了

 shimu 回复于:2003-07-21 22:15:07
不是打消楼主的积极性,你的精神值得学习,技术到是有点遗漏。瘦骆驼   的是对的。。

 leon_yuen 回复于:2003-07-22 01:46:35
这样做可以,但客户端的dns怎设定, 须指定一个isp dns 吗?

 Trotter 回复于:2003-07-22 09:49:29
虽然很简单,但学习精神可佳,支持一下。

 sanab123 回复于:2003-07-22 10:56:31
为什么我做的NAT不起作用,郁闷。。。。

 jzcjy 回复于:2003-08-26 13:34:07
原作是不是忘了这个!
作主要的一点是要在客户端的网关设为此IPtables PC的IP。

 repairer 回复于:2003-09-06 22:58:15
请问,我在用redhat9.0 squid做internet代理时,如上设置已经可以
用msn了,但是客户机qq还不行,请问原因可能出在哪?

谢谢!

 yagu1234 回复于:2003-11-14 17:44:19
不过squid 的日志长的很快,各位有没有什么好办法让它限制大小,比如超过多少字节就 自动删除某个日期以前的日志

 尘飞扬_cq 回复于:2004-01-13 21:27:41
我这两天也在搞这个,我开始也以为我做成功了。我用的是:
iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth0 -j SNAT --to 192.168.1.12

在这两句里,后来我发现在这两句里,其实只有第二句起作用了,第一句我删掉也没有任何影响。而关掉第二句就不行了。再去检查squid日志文件,也没有启用的记录。我现在还在找原因。我开始怀疑很多有关透明代理的文章了。

 zxdzhj 回复于:2004-05-26 21:50:32
我也在最近尝试着用Squid+iptables做透明代理,但没有看到网页访问速度变快,反而出了不少的问题。总是DNS解析不好,在access.log中狂出以下的错误: 
2004/05/24 21:52:28| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:52:44| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:53:00| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:53:16| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:53:32| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:53:48| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:54:04| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:54:20| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:54:36| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:54:52| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:55:08| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:55:24| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:55:40| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:55:56| WARNING! Your cache is running out of filedescriptors 
2004/05/24 21:56:12| WARNING! Your cache is running out of filedescriptors 
2004/05/24 22:03:14| ipcacheParse: No Address records 
2004/05/24 22:04:10| ipcacheParse: No Address records 
2004/05/24 22:07:51| ipcacheParse: No Address records 
2004/05/24 22:08:08| ipcacheParse: No Address records 
2004/05/24 22:11:46| ipcacheParse: No Address records 
2004/05/24 22:15:51| ipcacheParse: No Address records 
请教高手,有谁做透明代理+squid成功的,给指点一下。

 heguolin 回复于:2004-08-13 09:00:48
iptables做了nat和端口转向后,在将squid按照楼主所说配置一下,可以使用squid透明上网了,我把access.log清空观察一下,确实是通过了squid.而且
当不设置httpd_accel_host时,访问网页将返回squid提示找不到url定位的资源的错误报告页,证明确实真的通过了squid了,不是表面功夫。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网