骞没蕴 发表于 2018-12-28 07:57:08

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

  在网上翻了很多资料。都是squid2.6的,真正用squid3.0的很少或根本就是错误的。
  所以想写一个以备忘及抛砖引玉。其中可能有手误之处。
  环境:CentOS 5.2
  iptables为系统自带(版本是:iptables v1.3.5)。
  三张网卡
  其中eth0(192.168.0.2),eth1(192.16810.11为内网。eth2为外网.
  squid:squid-3.0.STABLE10.tar.gz
  下载地址:http://www.squid-cache.org/
  wget -c http://www.squid-cache.org/Versi ... 3.0.STABLE10.tar.gz
  下载的文件放在/usr/local/src目录中
  #cd /usr/local/src
  #wget -c http://www.squid-cache.org/Versi ... 3.0.STABLE10.tar.gz
  #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
  #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 normalsrc 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 edward@hi-bit.net
  visible_hostname No1.proxy
  上面要注意的是:
  1.http_port 3128 transparent vhost vport(这一行写的才是支持透明代理的,写2.6的五行写法不一样)
  在squid.conf的875行.我的写法如下,增加accel(加速),具体参数说明见squid.conf中的875行以上的几行,有说明。
  http_port 3128   transparent accelvhost 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>  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>  那么就说明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
  129iptables -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 tcp -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的透明代理做成了。如果你不相信,有两个方法可以测试:一是登录:http://ipid.shat.net ,这是一个国外网站,可以显示你的外网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

页: [1]
查看完整版本: squid3.0+iptables配置全过程详解