openwrt 透明代理上网

最近搞了个openwrt的router,以往都用代理来上网,但是代理每次都要设置端口啊,代理IP这些,觉得很心烦。现在好了,用openwrt搭建一个透明代理,让所有接上这个router的人都通过代理上网,还可以对他们监控和进行一些规则设定: )

我的Local proxy是这样的,如图:

 

我的squid版本为2.7

非常多的电脑接入我的openwrt,我用的是淘宝买的DB120。感觉还不错,然后我ssh进入openwrt。

1 ssh 192.168.8.1 –l root

 

 

随后输入密码,进入登陆界面,先安装squid。

1 opkg update
2 opkg install squid

 

 

安装完后,和对PC机Linux的squid操作一样,编辑squid.conf

1 vim /etc/squid/squid.conf

 

 

按照另一篇我的另一篇《Linux network proxy and route》里边对squid.conf的配置后,要多添加点东东。首先说一些相关的语法:

cache_peer [上层proxy主机名] [proxy角色] [proxy port] [icp port] [额外参数]

  •   上层proxy主机名:其实就是上层proxy的IP,我的就是172.16.54.159
  •  Proxy角色:这部proxy是我们的上层(parent),还是邻居sibling的协作proxy?在这里,我们要向parent proxy拿数据,所以肯定是parent啦: )
  • Proxy port:当然就是端口号啦,一般都是3128. 因为我比较懒,所以不改设置…
  • Icp port:通常是3130
  • 额外参数:针对parent proxy,想要对它操作的行为设定。主要有:
  1. Proxy-only:向parent proxy要数据不会存储到本地proxy的服务器,降低本地proxy的负担。
  2. Weight=n:权重,因为可以指定多部上层的proxy服务器,所以可以设定哪个比较重要。N越大表示这部proxy越重要!
  3. no-query:向上层proxy需要拿数据,可以不发送icp封包,以降低主机的负担。
  4. no-digest:表示不向附近主机要求建立digest记录表格
  5. no-netdb-exchange:表示不向附近的proxy主机送出imcp封包要求。

 

cache_peer_access [上层proxy主机名] [allow|deny] [acl名称]

主要是用acl设计一个名称后,再以cache_peer_access去放行或者拒绝读取。

 

好了,我的上层proxy是172.16.54.159,所以在squid.conf里边添加:

1 cache_peer 172.16.54.159 parent 3128 3130 proxy-only no-query no-digest

 

这样就成功设置了上层proxy,下面如何强制所有在192.168.8.x网段的人都一定要用我的proxy上网呢?也就是说每台机不用设置proxy也可以直接使用openwrt的proxy上网。其实很简单,继续在squid.conf里边的http_port中添加:

1 http_port 3128 transparent

 

保存后退出,启动squid就可以了,很简单吧?当然这里只是简单的配置了,如果还想要更多的功能,需要自己去了解下squid.conf就可以了,我比较懒,就做到这么多了: >

还有一些问题需要注意,怎么知道自己的squid.conf启动了呢?

  1. ps –aux 看看是否有squid的进程
  2. netstat –an 看是否有用户连接到squid所监听的ip及端口

 

但是只是做了squid.conf的配置还不行呢,必须把端口80重定向到3128才可以哦,不然用了透明代理也上不了网呀:<

网上有些人是这么做的,所以在终端输入:

1 opkg install iptables-utils iptables-mod-nat-extra
2 iptables-save > iptables.org
3 iptables –t nat –A PREROUTING –i br-lan –p tcp --dport 80 –j REDIRECT --to-ports 3128

 

第1行是openwrt安装iptables的一些工具,第2行是保存现在的iptalbes设置,如果以后不想用透明代理,就可以直接在终端输入:

1 iptables-restore iptables.org

 

这样就恢复原状了嘛J

第三行是用iptables重定向80到3128,网上好多人好像都可以,但是我遇到一个问题,就是我输入这个命令以后,出现:

iptables: No chain/target/match by that name

我到现在还没弄清楚怎么回事呢,在网上也找了好久,好像是某些模块没编译进内核,但是根据openwrt官网上说的,我应该编译进去了。我后来用了另一个命令来redirect,现在也运行得不错,凑合着用吧。

我这么做的,在终端输入了:

1 iptables –t nat –A PREROUTING –i br-lan –p tcp --src 192.168.8.0/24 --dport 80 –j DNAT --to 192.168.8.1:3128

 

结果成功运行了,可以访问网站,我对iptables也不是很熟悉,等熟悉了再分析吧:>

 

 

posted @ 2013-06-18 01:13 Rabbit Nick 阅读(...) 评论(...) 编辑 收藏