Chinaunix首页 | 论坛 | 博客
  • 博客访问: 253641
  • 博文数量: 72
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 541
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-13 09:42
文章分类
文章存档

2015年(2)

2012年(1)

2011年(1)

2010年(3)

2009年(65)

我的朋友

分类:

2009-03-31 11:15:12

squid3.0+iptables配置全过程详解

在网上翻了很多资料。都是squid2.6的,真正用squid3.0的很少或根本就是错误的。
所以想写一个以备忘及抛砖引玉。其中可能有手误之处。
环境:CentOS 5.2
为自带(版本是:iptables v1.3.5)。
三张网卡
其中eth0(192.168.0.2),eth1(192.16810.11为内网。eth2为外网.
squid:squid-3.0.STABLE10.tar.gz
下载地址:
wget -c
下载的放在/usr/local/src目录中

#cd /usr/local/src
#wget -c
#tar -zxvf squid-3.0.STABLE10.tar.gz
#cd squid-3.0.STABLE10
我是把configure写成一个批处理
这里的configure注意要增加–enable-linux-tproxy  –enable-linux-netfilter支持透明正向代理,要不会在安装后启动时中的cache,提示不支持transparent

#vi config.sh
复制以下内容到config.sh
#!/bin/bash
./configure --prefix=/usr/local/squid \
--enable-gnuregex --enable-carp --enable-async-io=80 \
--enable-storeio=aufs,diskd,ufs,null --enable-removal-policies=heap,lru \
--enable-icmp --enable-delay-pools --enable-useragent-log --enable-snmp \
--enable-arp-acl --enable-htcp --enable-underscores --enable-auth \
--enable-external-acl-helpers=ip_user,ldap_group --enable-x-accelerator-vary \
--enable-ssl --enable-cache-digests --enable-poll \
--enable-linux-tproxy --enable-linux-netfilter --with-pthreads  \
--with-aio --with-filedescriptors=65536 \
--enable-err-languages="Simplify_Chinese English" \
--enable-default-err-language="Simplify_Chinese" \

#chmod 775 config.sh
#./config.sh

在此执行过程中如果出现如下错误: 
  checking if TPROXY header files are installed... no
> WARNING: Cannot find TPROXY headers, you need to install the
> tproxy package from:
>  - lynx
> Searching in the above url I can't find the headers (my kernel is compiled
> with tproxy suport already).
这是缺少一个头文件,名字叫:ip_tproxy.h  我的附件里也提供了这个头文件

文件: ip_tproxy.rar
大小: 0KB
下载: 下载

到网上下载此头文件,将其复制到这个目录: /usr/include/linux/netfilter_ipv4 
重新执行:#./config.sh 完成之后再,
#make
#make install
squid3.0安装完毕。
现在设置squid.conf
#cd /usr/local/squid
建立squid的及组
#groupadd squid
#useradd squid -g squid -m -s /sbin/nologin

#vi etc/squid.conf
squid.conf 配置文件如下:
#http_port 3128 transparent vhost vport(这一个在上面的配置里面有,只是要改成这样)
cache_mem 1000 MB
cache_swap_low 90
cache_swap_high 95
#cache_dir ufs /opt/cache/squid 8000 16 256
cache_dir ufs /usr/local/squid/var/cache 1000 16 256
cache_access_log /var/log/squid/access.log
#cache_store_log /var/log/squid/store.log
cache_store_log /usr/local/squid/var/logs/store.log

dns_nameservers 218.104.128.106
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
#coredump_dir /usr/local/squid/var/cache

#acl all src 0.0.0.0/0
acl normal  src 192.168.0.0/24
acl wluser src 192.168.10.0/24
acl my src 192.168.0.9

http_access allow my
http_access allow normal
http_access allow wluser
http_access deny all

cache_effective_user squid
cache_effective_group squid
cache_mgr
visible_hostname No1.proxy

上面要注意的是:
1.http_port 3128 transparent vhost vport(这一行写的才是支持透明代理的,写2.6的五行写法不一样)
在squid.conf的875行.我的写法如下,增加accel(加速),具体参数说明见squid.conf中的875行以上的几行,有说明。
http_port 3128   transparent accel  vhost vport

(以下是squid 2.6的写法
httpd_accel_port 80
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_single_host off
httpd_accel_uses_host_header on
原来的squid.conf默认有 http_port 3128这一行。在后面加上transparent这一个参数)
2.有注释掉的几行是在squid.conf本来有的。可以查找到之后更改后面的参数就可以了。

3.#acl all src 0.0.0.0/0把这行注释掉。要不好像会监听0.0.0.0,没有测试过,只不过我是把他给注释掉了。

具本的每一行的意思。可以见网上的文章,很多就不啰嗦了,或见squid.conf.

建立squid的cache的目录及更改权限。要不会运行不了。
#mkdir /var/log/squid
#chown -R squid:squid /var/log/squid
#chown -R squid:squid /usr/local/squid/var/
#mkdir /usr/local/squid/var/cache
#chmod -R 777 var/cache
#chmod -R 777 /usr/local/squid/var/

第一次启动时要创建缓存目录
#/usr/local/squid/sbin/squid -z
成功会提示:
Creating Swap Directories
然后出现每个文件及目录的位置

测试Squid运行状况
#/usr/local/squid/sbin/squid -NCd1
成功后将出现”Ready to serve requests”,否则请检查配置文件.
如下:
2008/11/24 22:59:27| Starting Squid Cache version 3.0.STABLE10 for i686-pc-linux-gnu…
2008/11/24 22:59:27| Process ID 13445
2008/11/24 22:59:27| With 1024 file descriptors available
2008/11/24 22:59:27| Performing DNS Tests…
2008/11/24 22:59:27| Successful DNS name lookup tests…
或提示:
2008/11/25 19:39:05| Squid is already running!  Process ID 2356

那么就说明squid已经安装成功了

#ps -aux| grep squid
看下squid进程在不。

iptables中的注意打开3128端口和加入以下几句

iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0
#以下$INET_IP为外网的IP地址,进行内网地址到外网地址的转换
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth2 -j SNAT –to $INET_IP
129  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth2 -j SNAT –to $INET_IP

#把从eth0.eth1 目的80端口的包重定向到3128端口,其中第一行为我内网的网关地址。可有可无。
#iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0 -p -m tcp –dport 80 -j REDIRECT –to-ports 3128
iptables -t nat -A PREROUTING -s 192.168.0.0/24 -i eth0 -p tcp –dport 80 -j REDIRECT –to-ports 3128
iptables -t nat -A PREROUTING -s 192.168.10.0/24 -i eth1 -p tcp –dport 80 -j REDIRECT –to-ports 3128

上面这四句比较重要,是进行透明代理的关键。前两句的作用是进行“源地址转换”,也就是说要进行内网地址到外网地址的转换。执行了这两句,即使没有squid,内网机器也可以上网了。
后面两句是对从两个内网网卡进入的、tcp协议的、目的端口号是80的,做“端口重定向”。重定向到3128端口。这样,squid就可以接到这个数据包了。
OK!如果你的squid没有问题,而且你也执行了上面的语句,并且没有报错。那就恭喜你,一个iptables+squid的透明代理做成了。如果你不相信,有两个方法可以测试:一是登录:,这是一个国外网站,可以显示你的外网ip地址,还有是否被代理过。
#外网eth2 IP伪装
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
另外要注意载入的模块:

modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

echo 1 > /proc/sys/net/ipv4/ip_forward

具体详细的iptables的配置如下(其中加入我自已的一些过滤及端口,可根据需要选择。比如22,21,80等端口,及蠕虫过滤等)
#cat agent
#!/bin/bash
INET_IFACE=”eth2″
INET_IP=”x.x.x.x”
LAN_IFACE=”eth0″
LAN_IP=”192.168.0.2″
LAN_IP_RANGE=”192.168.0.0/24″
IPT=”/sbin/iptables”

modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
iptables -t nat -F

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -i ! eth1 -j ACCEPT
iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT     -p udp -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT     -p tcp -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p icmp -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT     -p icmp -m state –state ESTABLISHED,RELATED  -j ACCEPT

iptables -A INPUT     -p tcp –sport 21 -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT     -p tcp –sport 20 -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp –dport 20 -m state –state ESTABLISHED -j ACCEPT

iptables -A INPUT     -p tcp –sport 1024: –dport 1024:  -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp –sport 1024: –dport 1024:  -m state –state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT  -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT   -p tcp –sport 22 -j ACCEPT

iptables -A INPUT -i eth1 -p udp –sport 53 -j ACCEPT
iptables -A INPUT  -p tcp –dport 53 -j ACCEPT
iptables -A OUTPUT  -p udp –sport 53 -j ACCEPT
iptables -A OUTPUT  -p udp –dport 53 -j ACCEPT

iptables -A INPUT -i eth1 -p tcp –dport 80 -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp –dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 80 -j ACCEPT

iptables -A FORWARD -p tcp –dport 4444 -j DROP

iptables -A FORWARD -p udp –dport 4444 -j DROP

iptables -A FORWARD -p tcp –dport 445 -j DROP

iptables -A FORWARD -p udp –dport 445 -j DROP

iptables -A FORWARD -p tcp –dport 69 -j DROP

iptables -A FORWARD -p udp –dport 69 -j DROP

iptables -A FORWARD -p tcp –dport 135 -j DROP

iptables -A FORWARD -p udp –dport 135 -j DROP

iptables -A FORWARD -p tcp –dport 139 -j DROP

iptables -A FORWARD -p udp –dport 139 -j DROP

iptables -A OUTPUT -p tcp –sport 31337 -j DROP
iptables -A OUTPUT -p tcp –dport 31337 -j DROP

iptables -A FORWARD -p TCP ! –syn -m state –state NEW -j DROP
iptables -A FORWARD -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT
iptables -A FORWARD -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT
iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT

iptables -A OUTPUT   -p icmp -j ACCEPT
iptables -A INPUT   -p icmp -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

iptables -A INPUT -i eth0 -s 192.168.0.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.0.0/24 -p tcp –sport 3128 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.10.0/24 -p tcp –dport 3128 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.10.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 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

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth2 -j SNAT –to $INET_IP
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth2 -j SNAT –to $INET_IP

iptables -A INPUT  -p tcp –dport 3128 -j ACCEPT
iptables -A OUTPUT   -p tcp –sport 3128 -j ACCEPT

iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0
iptables -t nat -A PREROUTING -s 192.168.0.2 -i eth0 -p tcp -m tcp –dport 80 -j REDIRECT –to-ports 3128

iptables -t nat -A PREROUTING -s 192.168.0.9 -i eth0 -p tcp –dport 80 -j REDIRECT –to-ports 3128

iptables -t nat -A PREROUTING -s 192.168.0.0/24 -i eth0 -p tcp –dport 80 -j REDIRECT –to-ports 3128
iptables -t nat -A PREROUTING -s 192.168.10.0/24 -i eth1 -p tcp –dport 80 -j REDIRECT –to-ports 3128

iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
#iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

保存及更改agent的权限及运行。
#chmod 775 agent
#./agent
#/etc/init.d/iptables save
#/etc/init.d/iptables restart

 

 

 附:

 

把squid加入服务自动启动
在vi /etc/init.d/squid
#cat /etc/init.d/squid
以下是内容
#!/bin/sh
# this script starts and stops Squid
#chkconfig:345 62 62
#description:squid

case “$1″ in
start)
/usr/local/squid/sbin/squid -s
echo -n ‘ Squid’
;;
stop)
/usr/local/squid/sbin/squid -k shutdown
;;
esac

#chmod 775 squid
#chkconfig add squid
#chkconfig –levels squid 345 on

阅读(2578) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-01-13 12:56:16

不是真正的透明代理 TPROXY并没有起作用。web服务器接收到的访问时代理服务器的IP而不是client的IP。

chinaunix网友2010-08-12 14:06:52

多谢! 内网机器的网关和DNS怎么设置?

chinaunix网友2010-03-30 12:58:39

太感谢了,正是我所需要的啊。 透明代理为什么不成功,就是因为 “在此执行过程中如果出现如下错误: checking if TPROXY header files are installed... no > WARNING: Cannot find TPROXY headers, you need to install the > tproxy package from: > - lynx http://www.balabit.com/downloads/tproxy/ > Searching in the above url I can't find the headers (my kernel is compiled > with tproxy suport already). 这是缺少一个头文件,名字叫:ip_tproxy.h 我的附件里也提供了这个头文件 ” thanks