LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1103|回复: 11

请教“透明代理中的squid和iptables的关系”

[复制链接]
发表于 2005-5-31 14:23:59 | 显示全部楼层 |阅读模式
我在网上看的教材都说,建好squid后,再设置iptables,脚本里要加上
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE(或snat)

可是,即使不启动squid,在iptables里,加上这句也能共享上网啊

那么,为什么还要装squid呢?仅仅是为了缓存和认证吗?

ps:我买了本书“red hat linux 9 网络服务”,里面介绍的“配置基于squid的透明代理”,跟网上的基本一样,唯一的区别在于没有加
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE(或snat)
但,按这种方法设置,透明代理失败,还得设置ie的代理才能共享上网。
发表于 2005-5-31 14:29:48 | 显示全部楼层
对~~透明代理就是为了提高访问速度和认证~
NAT是靠iptables来实现的~本来就不需要代理
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-31 14:37:09 | 显示全部楼层
唉,真是不可尽信书啊

谢谢cxfcxf
回复 支持 反对

使用道具 举报

发表于 2005-5-31 16:20:15 | 显示全部楼层
我觉得这个配置是很灵活的,如果 squid 就在网关上,那么不使用 iptables 的 NAT 也应该是可以的(当然,iptables 还是需要一个 INPUT“洞”,使局域网的主机可以访问 squid 吧──OUTPUT 一般都是 ACCEPT 的)。

如果不在同一台主机,则可以在 iptables 上 FORWAR 中增加规则,仅仅使 squid 的主机可以出入,而其他主机都屏蔽。这样局域网的主机都只能通过 squid 代理了。
回复 支持 反对

使用道具 举报

发表于 2005-5-31 20:01:35 | 显示全部楼层
我想转发 platinum  的一些体会
--------------------相信对大家有点帮助吧-----------------------------------------
----------以下信息来源于互联网,并不是个人所发----------------------------
利用iptables做squid的透明代理时候,发现一些问题
我把自己的理解写出来,大家看一下对不对

一般做透明代理的时候,squid和网关是同一台机器,一般这样做
iptables -t nat -A PREROUTING -s 内网网段 -p tcp --dport 80 -j DNAT --to localhost:3128
或者
iptables -t nat -A PREROUTING -s 内网网段 -p tcp --dport 80 -j REDIRECT --to 3128

但是,如果对内网网段没有在filter表里打开对本机TCP/3128的端口,那么透明代理无法实现

我分析原因如下
DNAT和REDIRECT只相当于网关拦截到数据包,然后转交给新的IP或者端口
而转交之后,实际内网的电脑是直接与DNAT或者REDIRECT之后的地址、端口进行通讯的,因此如果做透明代理,必须打开squid那台机器对内网网段的TCP/3128
因为squid和网关是在同一个机器,所以该机器必须打开对内网网段的TCP/3128

另外,如果只做NAT,而不需要设置squid的透明代理,我们可以忽略filter表的INPUT和OUTPUT链,因为这两个链是针对使用iptables的机器自己而言的,是“出入”自己的数据包,而不是“经过”的数据包,因此即使禁止了INPUT和OUTPUT链,也不影响NAT

但是,如果做了squid,就必须打开INPUT的TCP/3128和OUTPUT链,因为squid是一个代理机制,他首先要收到客户机的HTTP请求,这个过程要用到INPUT到自己内部,然后squid再向外访问客户要访问的目的地址,这个过程又要OUTPUT

因此,结论就是
1、只做squid的机器,FILTER表的INPUT、OUTPUT链必须要合理设置,不能是DROP
2、只做NAT的机器,只需设置表的POSTROUTING链,而FILTER表的FORWARD链不能是DROP
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-1 10:10:29 | 显示全部楼层
我觉得还有问题
下面是我的squid配置:
cache_dir ufs /var/spool/squid 1000 24 256
cache_mem 80 MB
cache_swap_low 90
cache_swap_high 95
httpd_accel_host as3
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
acl myclients src 192.168.35.0/24
acl all src 0.0.0.0/0.0.0.0
http_access allow myclients
http_access deny all

下面是iptables脚本:
#!/bin/bash
echo "Starting Iptables Rules..."
echo "1" > /proc/sys/net/ipv4/ip_forward
inet_iface="eth1"
inet_ip="218.107.130.52"
lan_iface="eth0"
lan_ip="192.168.35.1"
lan_ip_range="192.18.35.0/24"
ipt="/sbin/iptables"

/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG


$ipt -P INPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -P OUTPUT ACCEPT
$ipt -t nat -P PREROUTING ACCEPT
$ipt -t nat -P POSTROUTING ACCEPT
$ipt -t nat -P OUTPUT ACCEPT

for TABLE in filter nat mangle ; do
$ipt -t $TABLE -F
$ipt -t $TABLE -X
done

$ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
for DNS in $(grep ^n /etc/resolv.conf|awk '{print $2}') ; do
$ipt -A INPUT -p udp -s $DNS --sport domain -j ACCEPT
done

$ipt -t nat -A POSTROUTING -o $inet_iface -j SNAT --to $inet_ip

$ipt -t nat -A PREROUTING -i $lan_iface -p tcp --dport 80 -j REDIRECT --to-ports 3128

echo "done"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-1 10:14:40 | 显示全部楼层
说明:
squid的配置文件没有问题,在不启用squid时,修改客户端的ie代理设置,可以正常上网

关键在iptables脚本:$ipt -t nat -A POSTROUTING -o $inet_iface -j SNAT --to $inet_ip本身就是做共享上网的,有这句,不需要squid,不需要设置ie代理,就能正常上网。
那么教材上说要加的这句:$ipt -t nat -A PREROUTING -i $lan_iface -p tcp --dport 80 -j REDIRECT --to-ports 3128是做什么用的呢?不需要转3128,已经能透明代理了啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-1 10:17:57 | 显示全部楼层
Post by gary9912
我想转发 platinum  的一些体会
--------------------相信对大家有点帮助吧-----------------------------------------
----------以下信息来源于互联网,并不是个人所发----------------------------
因此,结论就是
1、只做squid的机器,FILTER表的INPUT、OUTPUT链必须要合理设置,不能是DROP
2、只做NAT的机器,只需设置表的POSTROUTING链,而FILTER表的FORWARD链不能是DROP


我的iptables规则默认都是全部ACCEPT啊,这样的规则,只用
$ipt -t nat -A PREROUTING -i $lan_iface -p tcp --dport 80 -j REDIRECT --to-ports 3128
还是不能透明代理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-1 11:33:32 | 显示全部楼层
发布内网的服务也要用iptables吧?squid有这个功能吗?
回复 支持 反对

使用道具 举报

发表于 2005-6-1 22:47:06 | 显示全部楼层
Post by ttyrone
说明:
squid的配置文件没有问题,在不启用squid时,修改客户端的ie代理设置,可以正常上网

关键在iptables脚本:$ipt -t nat -A POSTROUTING -o $inet_iface -j SNAT --to $inet_ip本身就是做共享上网的,有这句,不需要squid,不需要设置ie代理,就能正常上网。
那么教材上说要加的这句:$ipt -t nat -A PREROUTING -i $lan_iface -p tcp --dport 80 -j REDIRECT --to-ports 3128是做什么用的呢?不需要转3128,已经能透明代理了啊。


你好,ttyrone 兄,又来和你讨论问题了。 我觉得呢上面说的,理解上可能有点问题。如果用 squid 代理,当然就可以在防火墙上将其他主机的外出请求都阻止。也就是说,可以这样讲:我们的目标是,如果不打开 squid 代理,那么内部主机将无法访问 Internet(被 iptables 阻止了);于是打开 squid,而 squid 又可以对用户、访问的网址、下载的文件类型等多种条件进行非常灵活的设置,而这些是 iptables 所达不到的。

比如说,你的网关是 192.168.35.1(iptables),你的 squid 是 192.168.35.2。于是可以设置 iptables 的 FORWARD 链:
iptables -A FORWARD -s 192.168.35.2 -p tcp --dport 80 -j ACCEPT
# [1] (iptables -A FORWARD -d 192.168.35.2 -p tcp --sport 80 -j ACCEPT)
iptables -A FORWARD -j DROP

[1], 我怀疑如果不使用 -m state 一句,就必须加这一条,因为我以前在 INPUT 和 OUTPUT 链中设置默认规则为 DROP 时发现必须这么做。

这样,只有 squid 可以通过防火墙连接到 Internet,而其他主机又只能通过 squid 上网,于是你就可以在 squid 中设置更为灵活的访问控制规则。

不过这时,其他主机只能通过 3128 这个接口连出去,也就是要在浏览器中设置 port,为了避免这种麻烦,就在 iptables 中使用下面的语句:
$ipt -t nat -A PREROUTING -i $lan_iface -p tcp --dport 80 -j REDIRECT --to-ports 3128
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表