用squid+iptable做透明代理出现DNS问题

发表于:2007-06-08来源:作者:点击数: 标签:
配置方法: [quote:2f931843da] 用squid+iptable实现透明代理 squid和iptable的具体安装我在此不做太多说明,一般看看它们的说明即可。我公司用一台机器作为代理上网。eth0连接外部网,eth1连接内部网。下面把我的配置写下来。 iptable的配置,在/etc/rc.d/

配置方法:
[quote:2f931843da]

用squid+iptable实现透明代理

squid和iptable的具体安装我在此不做太多说明,一般看看它们的说明即可。我公司用一台机器作为代理上网。eth0连接外部网,eth1连接内部网。下面把我的配置写下来。

iptable的配置,在/etc/rc.d/目录下用touch命令建立firewall文件,执行chmod u+x firewll以更改文件属性,编辑/etc/rc.d/rc.local文件,在末尾加上/etc/rc.d/firewall以确保开机时能自动执行该脚本。
echo "starting ip forward"
echo 1 >/proc/sys/net/ipv4/ip_forward
echo "starting iptables rules"
modprobe ip_tables
modprobe ip_nat_ftp
/sbin/iptables -F -t nat
iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 #将所有80端口的包转发到3128端口
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE #对eth0端口进行欺骗

squid的配置
http_port 3128
cache_mem 512 M
cache_swap_low 75
cache_swap_high 95
maximum_object_size 1024 KB
cache_dir ufs /usr/local/squid/cache 60000 16 256
cache_aclearcase/" target="_blank" >ccess_log /var/squid/logs/access.log
cache_log /dev/null
cache_store_log none
debug_options ALL,1

icp_access allow all
icp_query_time out 2000

cache_effective_user nobody
cache_effective_group nogroup

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
acl all src 0.0.0.0/0
acl localnet src 10.0.0.0/20
http_access allow localnet
http_access deny all

acl QUERY urlpath_regex -i cgi-bin \? \.exe$ \.zip$ \.mp3$ \.mp2$ \.rm$ \.avi$
no_cache deny QUERY

reference_age 3 days
quick_abort_min 16 KB
quick_abort_max 16 KB
quick_abort_pct 95
connect_timeout 60 seconds
read_timeout 3 minutes
request_timeout 30 seconds
client_lifetime 30 seconds
half_closed_clients off
pconn_timeout 60 seconds
ident_timeout 10 seconds
shutdown_lifetime 10 seconds

memory_pools off
memory_pools_limit 0
 [/quote:2f931843da]

其中reference_age 3 days,ident_timeout 10 seconds两行出错:
[quote:2f931843da]
2005/03/03 15:09:34| parseConfigFile: line 3379 unrecognized: 'reference_age 3 days'
2005/03/03 15:34:57| parseConfigFile: line 1645 unrecognized: 'ident_timeout 10 seconds'[/quote:2f931843da]

透明代理可以实现,但是DNS有问题,在客户端浏览器输入IP可以访问外网,输入域名就不行,在客户端命令行模式下执行nslookup命令,提示

[code:1:2f931843da]DNS request time out[/code:1:2f931843da]

在squid.conf中加入
[code:1:2f931843da]
acl Safe_ports port 53          # dns[/code:1:2f931843da]故障依旧

请大侠帮助看看如何处理,谢谢!

 水中风铃 回复于:2005-03-03 17:21:58
iptables  -A FORWARD -p udp --dport 53 -j ACCEPT

 platinum 回复于:2005-03-03 17:30:13
其实可以在LINUX上起一个bind
然后让client的DNS服务器指向LINUX
这样就不用做转发了

 arbor 回复于:2005-03-03 17:33:47
[quote:5de71f748d="platinum"]其实可以在LINUX上起一个bind
然后让client的DNS服务器指向LINUX
这样就不用做转发了[/quote:5de71f748d]

就是说这个服务器同时做代理和DNS?可以考虑。

我在用DHCP,这样这个同时也做DHCP吧,没有问题吧?呵呵

Opteron×2,1GB内存

 段誉 回复于:2005-03-03 23:33:28
看你的用户数了,倒也没什么大事儿。用上了,观察几天。

 arbor 回复于:2005-03-04 08:21:26
[quote:514c558f89="水中风铃"]iptables  -A FORWARD -p udp --dport 53 -j ACCEPT[/quote:514c558f89]

我这样做故障依旧

后来我运行setup,重新配置防火墙,在自定义端口那里写了53,然后重启iptables,重新运行自己的firewall脚本即可,squid都没有重启,成功!也就是说只是在代理服务器上面增开了53端口。因为没有启动bind服务,用nmap扫描服务器并没有发现53端口开放。

能否加为精华?吼吼

 水中风铃 回复于:2005-03-04 10:19:19
楼上的什么意思,你不是squid没有重启吗?那在那里加53有何意义?

 arbor 回复于:2005-03-04 10:51:24
[quote:bb6f4e1495="水中风铃"]楼上的什么意思,你不是squid没有重启吗?那在那里加53有何意义?[/quote:bb6f4e1495]

我在iptables里面改的啊,然后把iptables重启了。

问题不在squid,在iptables。

 段誉 回复于:2005-03-04 13:29:36
[quote:ed687ccb46="水中风铃"]楼上的什么意思,你不是squid没有重启吗?那在那里加53有何意义?[/quote:ed687ccb46]

FAINT,53本来就不是在squid.conf中添加的,和squid没有过关系的,只和IPTABLES有关系,重起IPTABLES就OK了。

BTW:楼主把整个过程整理一下吧

 happyhunter 回复于:2005-03-04 17:32:55
检查/etc/resolv.conf,l里面应该加上能用的dns地址。

 段誉 回复于:2005-03-04 18:15:21
[quote:be2a79b4ca="happyhunter"]检查/etc/resolv.conf,l里面应该加上能用的dns地址。[/quote:be2a79b4ca]

这样做,也达不到楼主所要的效果,因为楼主需要的是客户端直接和外部的dns通信,而本地没有dns。你做到的只是在代理服务器本身这台机器上能够解析域名。

 whfnp 回复于:2005-04-03 16:49:34
>这是因为你的客户端3没有指定DNS服务器的原因,因为你的服务器并没有提供DNS服务,故只需要将你的客户端的DNS服务器设置成你的ISP的提供的服务器地址就可以了。

 brensen 回复于:2005-04-06 22:11:52
一般的nat设置就可以实现客户端上网,关键在于服务器端能否让客户端不做什么设置就能正常“里通外国“,修改或生成6个配置文件,重启相应服务就可以了:

rc.local中iptables;

sysctl.conf中net.ipv4.ip_forward = 1;

dhcp.conf中domain-name-servers设置成服务器IP,比如192.168.0.1;

squid.conf也要设成透明代理;

named.conf中要加入ICP的DNS地址;

resolv.conf中设成192.168.0.1

我在CentOS4.0或者RedHat AS4.0设置比用windows系统要好,客户端网络很通畅,速度很快,现在的linux真是越来越简单易用了

 serpron 回复于:2005-04-21 08:31:10
参看防火墙所在机器的dns地址,客户端也设成这个就行了,你的所谓自定义端口其实是蒙对的。比如你用asinux1.0等不带预制放火墙的系统就瞪眼了

 pcstart 回复于:2005-04-22 11:58:18
#AUTO DNS
$IPTABLES -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 202.97.230.4 
$IPTABLES -t nat -A PREROUTING -p tcp --dport 53 -j DNAT --to 202.97.230.4

文中的202.97.230.4换成你们当地的外网的DNS服务器.

这条语法的原理是, 把所有的地址的53端口的请求自动转到一个公网的DNS服务器上.因为DNS先用到udp 要是解释不成功, 在用tcp.

实现的效果是:客户端的DNS的IP地址可以设置什么都可以. 比如说:1.1.1.1也一样能解释.

好长时间没有到这个论坛来了, 因有前些天有太多的心情, 还好, 现在算是基本调整过来了. 希望大家多多给我支持.

QQ 11217404

 chinaglwo 回复于:2005-04-24 01:16:23
刚按照你的帖子配置了透明代理,查看access.log有数据,说明正常工作,并没有客户端无法解析DNS的情况

不过我的firewall跟你有点不同,我是在防火墙stop的时候删除所有规则,而启动时的前几行是
iptables -P INPUT DROP
iptables -A INPUT -i ! ${UPLINK} -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        #enable public access to certain services
        for x in ${SERVICES}
        do
                iptables -A INPUT -p tcp --dport ${x} -m state --state NEW -j ACCEPT
        done

但SERVICES里面没有dns或53端口

 skybirds 回复于:2005-04-29 16:07:27
[quote:f8db476603="段誉"]

FAINT,53本来就不是在squid.conf中添加的,和squid没有过关系的,只和IPTABLES有关系,重起IPTABLES就OK了。

BTW:楼主把整个过程整理一下吧[/quote:f8db476603]

Iptables只是个防火墙配置工具而已,在配置防火墙规则时,立即生效,是不需要重启什么服务的!

 Turling 回复于:2005-06-06 17:29:21
:em23: 
小弟今年毕业设计,马上就要答辩了
可squid和iptable的透明代理还没搞定,
那位大侠给我一份配置,王分感激!!!
(只要能上网就可以,其他不用考虑)

原文转自:http://www.ltesting.net