返回介绍

配置 OpenWrt 路由器智能自动翻墙

发布于 2025-03-08 15:05:08 字数 11953 浏览 0 评论 0 收藏 0

OpenWrt 路由器用 dnsmasq 转发国内重要域名查询

OpenWrt 默认自带 dnsmasq,我们只要配置一下就好了。ssh 登录 OpenWrt 路由器后:

  • 建立 dnsmasq.d 目录:
      root@OpenWrt:~# mkdir /etc/dnsmasq.d
      root@OpenWrt:~# echo "conf-dir=/etc/dnsmasq.d" >> /etc/dnsmasq.conf
    
  • OpenWrt 安装 GNU wget 以支持 https 下载,下载国内重要网站名单,用国内域名服务器查询 iP 地址
      root@OpenWrt:~# cd /etc/dnsmasq.d
      root@OpenWrt:/etc/dnsmasq.d# opkg install wget
      root@OpenWrt:/etc/dnsmasq.d# wget -4 --no-check-certificate -O /etc/dnsmasq.d/accelerated-domains.china.conf https://github.com/felixonmars/dnsmasq-china-list/raw/master/accelerated-domains.china.conf
      root@OpenWrt:/etc/dnsmasq.d# wget -4 --no-check-certificate -O /etc/dnsmasq.d/bogus-nxdomain.china.conf https://github.com/felixonmars/dnsmasq-china-list/raw/master/bogus-nxdomain.china.conf
    

    注: accelerated-domains.china.conf 文件中的条目举例:

      server=/10010.com/114.114.114.114
      server=/115.com/114.114.114.114
    

    意思是,访问 10010.com 这个结尾的域名时,dnsmasq 会转发到国内的域名服务器 114.114.114.114 进行 dns 查询。

gfwlist.conf : 其他域名,转发到 shdowsocks-libev ss-tunnel 指定的端口 dns 查询

root@OpenWrt:/etc/dnsmasq.d# echo "server=/#/127.0.0.1#3210" > gfwlist.conf

上面#是通配符,代表泛匹配所有域名。dnsmasq 匹配域名的特点是详细特征优先匹配,因此会先匹配 accelerated-domains.china.conf 上的域名,如果不匹配,再匹配这条规则:转发到本地端口 3210 进行域名查询。

后面我们会配置 shdowsocks-libev 的本地客户端 ss-tunnel 转发本地端口 3210 的查询到远程自建服务器。

配置 shdowsocks 本地客户端 ss-redir 启动和停止函数

root@OpenWrt:/etc/dnsmasq.d# vi /etc/init.d/shadowsocks

/etc/init.d/shadowsocks :

#!/bin/sh /etc/rc.common

# Author: https://github.com/softwaredownload/openwrt-fanqiang
# Date: 2015-12 

START=95

SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1

start() {
    sed -i 's/114.114.114.114/127.0.0.1#3210/' /etc/dnsmasq.d/gfwlist.conf
    /etc/init.d/dnsmasq restart

    service_start /usr/bin/ss-redir -b 0.0.0.0 -c /etc/shadowsocks.json -f /var/run/shadowsocks.pid
    service_start /usr/bin/ss-tunnel -b 0.0.0.0 -c /etc/shadowsocks.json -l 3210 -L 8.8.8.8:53 -u 
    /usr/bin/shadowsocks-firewall
}

stop() {
    sed -i 's/127.0.0.1#3210/114.114.114.114/' /etc/dnsmasq.d/gfwlist.conf
    /etc/init.d/dnsmasq restart

    service_stop /usr/bin/ss-redir
    service_stop /usr/bin/ss-tunnel
    killall ss-redir
    killall ss-tunnel
    /etc/init.d/firewall restart
}

shadowsocks 本地客户端配置文件 start stop 函数说明:

  • sed -i 's/127.0.0.1#3210/114.114.114.114/' /etc/dnsmasq.d/gfwlist.conf
    停止 shadowsocks 翻墙服务时,要把泛匹配域名的解析转发到国内的 dns 服务器,这里是 114
  • sed -i 's/114.114.114.114/127.0.0.1#3210/' /etc/dnsmasq.d/gfwlist.conf
    开启翻墙服务时,如果以前停止过 shadowsocks 翻墙服务,要把泛匹配域名的解析改成通过 ss-tunnel 3210 端口转发
  • service_start /usr/bin/ss-tunnel -b 0.0.0.0 -c /etc/shadowsocks.json -l 3210 -L 8.8.8.8:53 -u
    监听本地 3210 端口,转发到自己的服务器的 53 端口向 8.8.8.8 查询 DNS
  • /usr/bin/shadowsocks-firewall
    dnsmasq 只是负责域名查询分配转发,查询到 IP 地址后,是否需要通过 shdowsocks 加密请求内容,要在 shdowsocks-firewall 里进行设置
  • 运行 /etc/init.d/shadowsocks stop 有时并没有结束 ss-redir 或 ss-tunnel 进程,这会导致修改 shadowsocks.conf 后需要重启路由器才能生效。加上 killall 强制杀掉进程避免重启。(2016-01-19)
    (注:即使加了 killall,有时还是不能杀掉进程,这种情况就只能重启路由器了。也就是说,修改了翻墙配置,有时必须重启路由器才能生效)

配置 iptables 防火墙转发 IP 和端口

root@OpenWrt:~# cd /usr/bin
root@OpenWrt:~# touch shadowsocks-firewall
root@OpenWrt:~# chmod +x shadowsocks-firewall
root@OpenWrt:~# vi shadowsocks-firewall

/usr/bin/shdowsocks-firewall :

#!/bin/sh

# Author:    https://github.com/softwaredownload/openwrt-fanqiang
# Date:        2015-12-23

#create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS_WHITELIST

# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.

iptables -t nat -A SHADOWSOCKS -d 1.0.9.8 -j RETURN

#for hulu.com
iptables -t nat -A SHADOWSOCKS -p tcp --dport 1935 -j REDIRECT --to-ports 7654
iptables -t nat -A SHADOWSOCKS -p udp --dport 1935 -j REDIRECT --to-ports 7654

# Ignore LANs IP address
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN

# Check whitelist
iptables -t nat -A SHADOWSOCKS -j SHADOWSOCKS_WHITELIST
iptables -t nat -A SHADOWSOCKS -m mark --mark 1 -j RETURN

# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 7654
# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

# Ignore China IP address
for white_ip in `cat /etc/chinadns_chnroute.txt`;
do
    iptables -t nat -A SHADOWSOCKS_WHITELIST -d "${white_ip}" -j MARK --set-mark 1
done

# Ignore Asia IP address
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 1.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 14.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 27.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 36.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 39.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 42.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 49.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 58.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 59.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 60.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 61.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 101.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 103.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 106.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 110.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 111.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 112.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 113.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 114.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 115.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 116.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 117.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 118.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 119.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 120.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 121.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 122.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 123.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 124.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 125.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 126.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 169.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 175.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 180.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 182.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 183.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 202.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 203.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 210.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 211.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 218.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 219.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 220.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 221.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 222.0.0.0/8 -j MARK --set-mark 1
#iptables -t nat -A SHADOWSOCKS_WHITELIST -d 223.0.0.0/8 -j MARK --set-mark 1

OpenWrt 路由器 iptables 防火墙设置含义

  • 如果本地发出请求到 shadowsocks 服务端所在的服务器,就返回,不作任何特殊处理。
  • 如果本地发出请求到局域网,也立即返回
  • 如果发出请求到中国的 IP 地址,也立即返回
    chinadns_chnroute.txt 是中国 IP 地址,见 https://github.com/softwaredownload/openwrt-fanqiang/blob/master/openwrt/default/etc/chinadns_chnroute.txt
    预编译翻墙固件都带了这个文件。这个文件很长,因此配置不高的路由器 DIR-505,预编译固件里改成了“发出请求到亚洲的 IP 地址就立即返回”,见文件 https://github.com/softwaredownload/openwrt-fanqiang/blob/master/openwrt/dir505/usr/bin/shadowsocks-firewall
  • 剩下的 IP 内容请求,全部转发到 shdowsocks-libev 本地客户端 ss-redir 监听的端口,由 ss-redir 负责和服务端进行加密通讯。(手下报告访问 youtube 的屁民为个位数,领导心里那个高兴啊。可惜经过加密,内容传输速度会有下降)
  • 首先运行全代理模式,然后再执行白名单。在白名单比较长时冷启动的速度会比较快。(Thanks Phoeagon)
  • 中国的 IP 列表比较长,如果你的路由器硬件配置不是太好,可以把 Ignore China IP address 段注释掉,启用 Ignore Asia IP address 段

OpenWrt 路由器防火墙设置重要说明:

  • 你必须把上面的 1.0.9.8 换成你服务器真实的 IP 地址
  • iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 7654 这里的 7654 必须和 OpenWrt 路由器 /etc/shadowsocks.json 里的 local_port一样,也就是说,如果 /etc/shadowsocks.json 里 "local_port":1090, 那这里的 7654 也要改成 1090
  • 其他可以保持默认

控制 shadowsocks 本地客户端的方法

root@OpenWrt:~# /etc/init.d/shadowsocks stop
root@OpenWrt:~# /etc/init.d/shadowsocks start
root@OpenWrt:~# /etc/init.d/shadowsocks enable
root@OpenWrt:~# /etc/init.d/shadowsocks disable

说明:

  • stop: 停止 shdowsocks
  • start: 运行 shadowsocks
  • enable: 设置 shadowsocks 在 OpenWrt 路由器启动时自动启动
  • disable: 取消 shadowsocks 随机启动

启动并测试 shadowsocks-libev 本地客户端

确保所有设置无误后,可以启动测试一下:

root@OpenWrt:~# /etc/init.d/dnsmasq restart
root@OpenWrt:~# /etc/init.d/shadowsocks stop
root@OpenWrt:~# /etc/init.d/shadowsocks start
root@OpenWrt:~# /etc/init.d/shadowsocks enable

然后在 Ubuntu 电脑,手机等设备上打开 youtube.comtwitter.com

下载配置文件的最新版

git clone https://github.com/softwaredownload/openwrt-fanqiang

git clone 项目到本地后,可以进入 openwrt 目录查看文件。

如果所有设置都正确,应该可以较快速度打开被墙网站。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文