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,想要对它操作的行为设定。主要有:
- Proxy-only:向parent proxy要数据不会存储到本地proxy的服务器,降低本地proxy的负担。
- Weight=n:权重,因为可以指定多部上层的proxy服务器,所以可以设定哪个比较重要。N越大表示这部proxy越重要!
- no-query:向上层proxy需要拿数据,可以不发送icp封包,以降低主机的负担。
- no-digest:表示不向附近主机要求建立digest记录表格
- 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启动了呢?
- ps –aux 看看是否有squid的进程
- 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也不是很熟悉,等熟悉了再分析吧:>