这两天调试了一下squid 2.6的wccp透明代理,颇走了些弯路,先把调试的几个关键点纪录下来,至于详细的笔记,希望最近我不会再那么懒了,争取这两个礼拜能写出来吧。
推荐的软硬件环境:
  • cisco 6509交换机的IOS版本高于12.2(18)SXD4
  • 采用2.6.10以上的linux kernel+squid 2.6的最新STABLE发行
以下是对这个推荐软硬环境的详细解释:
  • 首先,cisco 6509交换机上的super 720引擎是支持wccp的
    Release 12.2(17d)SXB1 and later releases support WCCP on Supervisor Engine 2.
    Release 12.2(18)SXD1 and later releases support WCCP on Supervisor Engine 720.
    不过还需要注意的是这段文字:

    Configuring WCCPv2 on a Supervisor Engine 720 causes high CPU utilization. This problem is resolved in Release 12.2(18)SXD4.
    所以,只要确认你的6509上的 super 720引擎用的IOS版本高于12.2(18)SXD4,你就可以放心大胆的使用6509上的wccp的功能。
    之所以在IOS支持的这个问题上唠唠叨叨了这么多,是因为之前给我们公司作系统集成的SI拿了本《Catalyst 6500 Series Switch Cisco IOS Software Configuration Guide:Release 12.2(17d)SXB1》跟我信誓旦旦的说没法在super 720上开启wccp.........
  • linux 2.6.9-rc3 之后的kernel的ip_gre模块就已经加入对wccp的支持了,而且squid 2.6在kernel 2.6上开启epoll不需再对kernel打patch了。
    所以,如果要使用linux作为squid运作的系统平台的话,建议采用2.6.10以上的kernel+squid 2.6的最新STABLE发行(当前是STABLE 14)----这样,比较不麻烦。
调试过程中的注意点:
  • squid 2.6的透明代理配置与squid 2.5有很大的简化,请大家注意一下。以下这么一句就搞定了透明代理:
    1. http_port 3128 transparent
  • 其实单就squid而言,与wccp的配合除了透明代理的设置之外,就是wccp开头几个相关选项了。就如今的硬件环境,大部分用的都是wccp v2了,所以有可能用到的就是wccp2开头的这几个选项了:
    1. wccp2_router
    2. wccp2_rebuild_wait
    3. wccp2_forwarding_method
    4. wccp2_return_method
    5. wccp2_assignment_method
    6. wccp2_service
    7. wccp2_service_info
    8. wccp2_weight
    9. wccp2_address
    简单的说,真正需要配置的就这么两个:
    1. wccp2_router
    2. wccp2_service
    而最棘手的配置就是wccp2_router需要配置的是三层交换上的哪个router地址了:很不幸的,大部分的三层交换机上都配置N多的网关地址......
    在这个问题上我耗了不少的时间,有很多参考资料都是告诉我们在交换机上用 show ip wccp看到的Router Identifier:显示的那个地址,就我的实践来看,是不一定的。
    最方便的方法还是使用tcpdump在cache服务器上监听2048端口的通讯状况,在启动了配置了wccp2的squid之后,使用tcpdump监听:
    1. tcpdump -i eth0 port 2048
    看到的往cache服务器的udp 2048端口发送信息的网关地址就是我们要配置的wccp2_router地址了
  • 在IOS上监视wccp2的 Cache Engines注册状态不要太心急,需要小等个半分钟左右,当然了,如果你实在是心急的话,开wccp的events debug直接看log输出信息吧:
    在IOS的特权模式输入
    1. debug ip wccp events
    2. term mon
    看到如下的信息就说明squid在交换机上注册成功了:
    1. Aug  9 04:39:54: WCCP-EVNT:wccp_update_assignment_status: enter
    2. Aug  9 04:39:54: WCCP-EVNT:wccp_update_assignment_status: exit
    3. Aug  9 04:39:54: WCCP-EVNT:wccp_validate_wc_assignments: enter
    4. Aug  9 04:39:54: WCCP-EVNT:wccp_validate_wc_assignments: not mask assignment, exit
    5. Aug  9 04:39:54: WCCP-EVNT: GRE adjacency added for 你的squid服务器地址
    6. Aug  9 04:39:54: %WCCP-5-SERVICEFOUND: Service web-cache acquired on Web Cache 10.18.150.104
    7. Aug  9 04:39:54: WCCP-EVNT:wccp_change_router_view: S00
    8. Aug  9 04:39:54: WCCP-EVNT:wccp_change_router_view: deallocate rtr_view (24 bytes)
    9. Aug  9 04:39:54: WCCP-EVNT:wccp_change_router_view: allocate hash rtr_view (1560 bytes)
    10. Aug  9 04:39:54: WCCP-EVNT:wccp_change_router_view: rtr_view_size set to 72 bytes
    11. Aug  9 04:39:54: WCCP-EVNT:S00: Built new router view: 1 routers, 1 usable web caches, change # 00000008
  • 记得在cache服务器上关闭rp_filter
  • 记得在cache服务器上把到你建立的到wccp2_router的gre通道上的80端口的数据用iptables转发到squid端口上。
    1. iptables -t nat -A PREROUTING -i 到wccp2_router的gre通道 -p tcp --dport 80 -j REDIRECT --to-port 3128
如此而已,我之前把这东西看得太神秘了。