用OpenWRT打造自动翻墙路由器(详解篇)

最初先调整一下bash,让它符合自己的工作习惯:

到vim /etc/profile,可以在里面设置自己想要的alias

比如我加了一行:

alias ll='ls -al'

然后就装图形显示界面再说

首先update一下

opkg update

安装luci

opkg install luci

设置luci自动启动

/etc/init.d/uhttpd enable
结果告诉我
/etc/rc.common: line 1: procd_add_reload_trigger: not found

坑爹,搜索了一下发现是因为我的固件版本与软件仓库的版本不符,导致软件与系统组件不搭配所致,后来发现是新版的OpenWrt更新了而已,于是我升级了一下系统就好了,如果你无法升级系统,那么可以按照下述方式解决:

先把安装的那些个用不了的一个个卸载掉

opkg remove luci
opkg remove uhttpd-mod-ubus
opkg remove uhttpd

修改opkg的配置,修改到以前的仓库

vim /etc/opkg.conf

注释掉原有的仓库地址,改用旧的
#src/gz barrier_breaker http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages
src/gz barrier_breaker http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages

然后在opkg update一下,继续
opkg install luci
opkg install luci-i18n-chinese

这次在/etc/init.d/uhttpd start 的时候就不会报错了

然后稳妥的进入luci的Web界面,修改一下时区、界面语言之类的

接下来的工作是修改防火墙的设置,让远端的HTTP和SSH能够通过

vim /etc/config/firewall

config rule                                
        option target 'ACCEPT'                
        option src 'wan'            
        option proto 'tcp'          
        option dest_port '22'        
        option name 'Allow_remote_SSH'
                                     
config rule                            
        option target 'ACCEPT'      
        option src 'wan'            
        option proto 'tcp'          
        option dest_port '80'        
        option name 'Allow_Remote_HTTP'

我的翻墙措施主要是采用这个开源的项目,特点是小众、快速,省去了流行的ShadowSocks的一大堆看着头疼的加密措施,仅仅只是以翻过去为目的,所以我需要一套erlang的运行环境

安装erlang

opkg install erlang

安装erlang的编译器

opkg install erlang-compiler

编译器只需要运行一遍就可以了,如果需要节约空间,可以编译完源程序之后删除它

安装代理脚本的客户端

上传脚本,不想占内存和空间来安装git,直接把脚本download 下来,然后scp传过去就行了

scp proxy.erl root@192.168.0.253:/root

只传这么一个文件就可以了,其他的都没有必要

然后在目录下运行

erlc proxy.erl

会在同级目录下编译出一个proxy.beam文件,然后就可以轻松的删除erlang-compiler了

opkg remove erlang-compiler

启动一下代理服务器试试看

erl +K true -noshell -detached -s proxy front_start 【远端IP】 【远端端口】 0.0.0.0 【本地端口】

可以先用socket5模式来检查一下代理是否运行正常

开始配置自动翻墙

安装iptables的插件

opkg install iptables-mod-u32
opkg install iptables-mod-geoip

安装redsocks
opkg install redsocks

配置redsocks

vim /etc/redsocks.conf

改变以下选项:
daemon = on
log_debug = off
log_info = off
local_ip = 127.0.0.1
local_port = 12345
ip = 127.0.0.1
port =【本地端口】
type = socks5

删掉不用的udp转发和DNS转发选项,然后启动redsocks

/etc/init.d/redsocks start
/etc/init.d/redsocks enable

这里下载geoip的国家文件(已经编译好了的版本,因为IPv4已经分配完毕了,所以没必要去追求新的,直接下老的用毫无压力),解压后对应分别放入/usr/share/xt_geoip/BE和/usr/share/xt_geoip/LE目录

在iptables中添加自定义的跳转
(以下这几条命令需要加到/etc/rc.local和/etc/firewall.user两个文件中,因为当路由器重启的时候,系统不会主动加载firewall.user文件,只有重启防火墙的时候才会主动加载,为了让转发重启后立即有效,都加上是必要的)

iptables -F fwmark -t mangle
iptables -A fwmark -t mangle -m geoip -p tcp --destination-country CN -j MARK --set-mark 2
iptables -A fwmark -t mangle -p tcp -d 【你的VPS的IP】-j MARK --set-mark 2
iptables -A fwmark -t mangle -p tcp -d 192.168.0.0/16 -j MARK --set-mark 2
iptables -A fwmark -t mangle -p tcp -d 127.0.0/8 -j MARK --set-mark 2
iptables -A fwmark -t mangle -p tcp -d 10.0.0/8 -j MARK --set-mark 2
iptables -A fwmark -t mangle -m mark -p tcp ! --mark 2 -j MARK --set-mark 1
iptables -F prerouting_rule -t nat
iptables -A prerouting_rule -t nat -m mark -p tcp --mark 1 -j REDIRECT --to-port 12345


如果顺利的话,现在已经是可以能够访问facebook等网站了,但是我们还是需要解决DNS污染问题

安装本地的dns服务器pdnsd

opkg install pdnsd

配置它:

global {
# debug = on;          # 调试模式, 日志会写入 /var/pdnsd/pdnsd.debug
perm_cache=1024;
cache_dir="/var/pdnsd";
run_as="nobody";
server_port = 1053;    # 使用 1053 作为 dns 端口, 默认是 53
server_ip = any;
status_ctl = on;
query_method=tcp_only; # 最重要的配置, 只使用 tcp 查询上级 dns
min_ttl=15m;
max_ttl=1w;
timeout=10;
}

server {
label= "wido";           # 这个随便写
ip = 8.8.8.8; # 这里为上级 dns 的 ip 地址
root_server = on;        # 设置为 on 后, 就代替系统默认的 dns 了.
uptest = none;           # 不去检测 dns 是否无效.
}

编辑DNSMSQ的配置文件,让部分域名重新解析

vim /etc/config/dhcp

前面部分改为:
config dnsmasq                                            
        option domainneeded '1'                          
        option boguspriv '1'                              
        option localise_queries '1'                      
        option rebind_protection '1'                      
        option rebind_localhost '1'                      
        option local '/lan/'                              
        option domain 'lan'                              
        option expandhosts '1'                            
        option authoritative '1'                          
        option readethers '1'                            
        option leasefile '/tmp/dhcp.leases'              
        option resolvfile '/tmp/resolv.conf.auto'        
        list server '/.facebook.com/127.0.0.1#1053'      
        list server '/.twitter.com/127.0.0.1#1053'        
        list server '/.google.com/127.0.0.1#1053'        
        list server '/.gstatic.com/127.0.0.1#1053'        
        list server '/.googleusercontent.com/127.0.0.1#1053'
        list server '/.appspot.com/127.0.0.1#1053'      
        list server '/.googlecode.com/127.0.0.1#1053'    
        list server '/.googleapis.com/127.0.0.1#1053'    
        list server '/.gmail.com/127.0.0.1#1053'        
        list server '/.google-analytics.com/127.0.0.1#1053'
        list server '/.youtube.com/127.0.0.1#1053'  
        list server '/.blogspot.com/127.0.0.1#1053'  
        list server '/.blogger.com/127.0.0.1#1053'  
        list server '/.ggpht.com/127.0.0.1#1053'    
        list server '/.googleapis.com/127.0.0.1#1053'
        list server '/.facebook.com/127.0.0.1#1053'  
        list server '/.fbcdn.net/127.0.0.1#1053'
        list server '/.yimg.com/127.0.0.1#1053'          
        list server '/.staticflickr.com/127.0.0.1#1053'  
        list server '/.twitter.com/127.0.0.1#1053'        
        list server '/.tinypic.com/127.0.0.1#1053'        
        list server '/.yfrog.com/127.0.0.1#1053'          
        list server '/.twitpic.com/127.0.0.1#1053'

接下来重启它

/etc/init.d/dnsmasq restart

然后检查一下就应该可以了

评论

此博客中的热门博文

远程记录OpenWRT日志

Python中为什么要用is None来代替== None?