OpenWRT之科学上网

好好学习,天天向上!

配置本地socks5

免密码登陆远程服务器

1
2
3
4
$ opkg update 
$ opkg --force-overwrite install openssh-client openssh-keygen
$ ssh-keygen
$ cat ~/.ssh/id_rsa.pub | ssh user@server.com "cat - >> ~/.ssh/authorized_keys"

开机自启动 socks5 @ *:7070

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

logfile=/var/log/socks5.log
server=<server.com>
port=<port>
user=<user>

exec 2>&1
exec 1>$logfile

while true; do
    netstat -tlnp | grep ":7070" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] @@ reconnecting server ... @@"
        ssh -fCN -D '*:7070' $user@$server -p $port -v exit 2>&1 |
            while read line; do
                printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"
            done
    fi
    sleep 15
done
1
2
3
# edit /etc/rc.local by insert line before 'exit 0'

/root/socks5.sh > /dev/null 2>&1 &

配置防火墙规则 – 如果LAN口为ACCEPT状态,则该规则可以免掉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# add lines to /etc/config/firewall

config rule
	option name 'Allow-socks5'
	option src '*'
	option dest_port '7070'
	option family 'ipv4'
	option target 'ACCEPT'
	
$ /etc/init.d/firewall restart

测试与验证

1
2
3
4
5
6
7
$ /boot/socks5.sh > /dev/null 2>&1 &

$ curl google.com 
# >> it should hang up with nothing

$ curl --socks5 localhost:7070 google.com 
# >> it should output some HTML stuff

安装与配置PassWall

安装PassWall

  • 添加第三方源

TBD

  • 安装PassWall和测试工具
1
2
$ opkg update
$ opkg install luci-app-PassWall bind-dig
  • 安装nftables版本dnsmasq
1
2
3
$ wget https://downloads.immortalwrt.org/snapshots/packages/x86_64/base/dnsmasq-full_2.89-99_x86_64.ipk
$ opkg install dnsmasq-full_2.89-99_x86_64.ipk
$ /etc/init.d/dnsmasq restart

解决DNS污染的问题

DNS解析拓扑:

dnsmasq @ *:53/UDP => chinadns @ 127.0.0.1:15354/UDP => dns2socks @ 127.0.0.1:15353/TCP => socks5 @ 127.0.0.1:7070/TCP => 8.8.8.8:53

构建DNS解析通道:

配置 socks5 @ *:7070

@see 配置socks5

PassWall => 节点列表 => 添加

CleanShot 2023-04-11 at 23.22.10@2x

  • dns2socks @ 127.0.0.1:15353

    基本设置 => DNS

    CleanShot 2023-04-11 at 23.24.14@2x

  • chinadns @ 127.0.0.1:15354

    上一步勾选ChinaDNS-NG!!!

  • dnsmasq @ *:53

    网络 => DHCP/DNS => 高级设置 => DNS服务器端口 => 53

    上游DNS被passwall自动设置成了 127.0.0.1#15354

    1
    2
    3
    4
    5
    6
    
    $ cat /tmp/dnsmasq.d/dnsmasq-passwall.conf
    conf-dir=/tmp/dnsmasq.d/passwall
    server=127.0.0.1#15354
    all-servers
    no-poll
    no-resolv
    

流量自动重定向

流量重定向拓扑:

LAN network traffic @ *:1070 => xray @ *:1070 => @gfwlist => ipt2socks_TCP_UDP @ *:1041 => socks5 @ *:7070 @chnlist => forward to WAN network

设置ipt2socks & xray

CleanShot 2023-04-12 at 23.34.12@2x

高级设置

CleanShot 2023-04-12 at 23.44.23@2x

a. 由于高版本kernel已经改为nftables,而OpenWRT自带dnsmasq并没有nftables支持,所以我们需要在安装第三方的dnsmasq的同时,变更PassWall的设置为NFTables。

b.

更新gfwlist & chnlist

CleanShot 2023-04-12 at 10.49.59@2x

添加例外:将外网服务器添加到直连列表(这就是PassWall延时1s启动的原因?)

CleanShot 2023-04-12 at 10.51.35@2x

测试与验证

打开PassWall主开关:PassWall => 基本设置 => 主要 => 主开关 => 勾选 => 保存并应用

CleanShot 2023-04-12 at 23.46.34@2x

确认图中几点是否成功设置。

确认dnsmasq的DNS加载正确

重启路由器,查看syslog,会发现以下字段,这说明dnsmasq的DNS已经配置完成

CleanShot 2023-04-12 at 00.12.04@2x

查看所有组件

1
$ ps aux | grep "dns\|socks\|ray\|ss-"

CleanShot 2023-04-12 at 23.52.12@2x

查看网络端口

1
2
# check listening ports
$ netstat -tlnp 

CleanShot 2023-04-12 at 23.56.40@2x

测试DNS解析

开启log:DHCP/DNS => 常规设置 => 记录查询日志 => 勾选 禁用缓存:DHCP/DNS => 高级设置 => DNS查询缓存大小 => 0

终端1:

1
2
# tail OpenWRT syslog
$ tail -f /var/log/system.log

终端2:

1
2
# check DNS with dig
$ dig <domain.com> @127.0.0.1 -p <port>

需要测试端口包括:

  • 127.0.0.1#15353 - Google
  • 127.0.0.1#15354 - Google & Baidu
  • 127.0.0.1#53 - Google & Baidu

逐级对DNS端口进行测试,直到所有端口都Ok为止,同时可用在线ip查询工具进行确认。以53端口测试Google为例: CleanShot 2023-04-12 at 13.11.17@2x

测试网络连接

1
2
# test with curl:
$ curl --socks5 <host:port> <domain.com/host>

需要测试的端口包括:

  • 10.10.10.1:7070 - Google
  • 10.10.10.1:1070 - Google & Baidu
  • 直连测试 - Google & Baidu & localhost

注意:此处测试最好在OpenWRT管理的子网计算机上进行

配置出错,无法访问本地网络: CleanShot 2023-04-12 at 13.20.00@2x

安装与配置AdGuardHome

一定不要安装luci-app-adguardhome,好像版本不匹配,两者用的配置文件不太一样。

CleanShot 2023-04-14 at 21.07.12@2x

CleanShot 2023-04-14 at 21.04.45@2x

CleanShot 2023-04-14 at 21.15.07@2x CleanShot 2023-04-14 at 21.24.57@2x 暂修改端口为8080和1053,稍后我们再将DNS端口改成53,取代dnsmasq成为默认DNS服务器

CleanShot 2023-04-14 at 21.16.02@2x

CleanShot 2023-04-14 at 21.26.07@2x CleanShot 2023-04-14 at 21.26.28@2x

配置默认DNS服务器

  • 将dnsmasq的默认端口改成54

  • 修改AdGuardHome默认端口为53,上游DNS服务器为127.0.0.1:15354

这里最好在命令行下配置,不知为什么webui中上游DNS服务器测试无法通过,一直无法配置成功。在命令行下修改之后,再测试上游服务器就Ok了。

CleanShot 2023-04-14 at 21.51.43@2x

查看仪表盘,有DNS查询和拦截数据就说明配置成功了。

创建AdGuard入口

1
$ vim /usr/lib/lua/luci/controller/adguard.lua
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
module("luci.controller.adguard", package.seeall)

function index()
    entry({"admin", "services", "adguard"}, call("do_open_adguardhome"), _("广告拦截"))
end

function do_open_adguardhome()
    luci.http.redirect('http://10.10.10.1:8080/')
    --luci.http.redirect('http://'..luci.sys.hostname()..':8080/')
end

性能测试

queryperf

  • 主路由
  • 2xlan

CleanShot 2023-04-17 at 22.09.49@2x

  • bridge
  • 旁路由(科学上网)

CleanShot 2023-04-17 at 22.03.09@2x

进阶:定制自己的科学上网路由

开启全局socks端口

可以说,这是整个科学上网最重要也是最难的一步。我们不但要能够实现科学上网,而且还要保证这条路能够稳定长期的运行下去。当然,这里并不是说一定要socks,其他协议端口应该也是可以的,比如vpn类型的网络或其他可以稳定连接的协议。

我试过PassWall和Hello World,这第一步都设计得比较简单或模糊不清。比如PassWall,到处都是socks,搞得都不知道什么是什么了,让初学者很难摸清;而Hello World则是定死在ssr之上,我一直没有调通ssh和ss socks的使用方法。我为了能够直接接入ssh socks5接口,不知道经历了多少磨难。当然这也许和我的水平有关系。

==> 扩展:n2n网络

1
2
3
4
5
6
# OpenWRT
$ opkg install luci-app-n2n

# 添加edge/n2n0,IP随便!
# 删除supernode和路由表相关内容(此处路由不能配置具体IP)
# 将n2n0添加到网桥br0
1
2
3
4
5
6
7
# Ubuntu: build from source, 仓库版本太老了
$ 


$ supernode -l <port> -v 

$ 

配置服务器

一台具有公网IP且可连接外网的虚拟主机

ssh daemon
shadowsocks server

本地ssh socks

ssh-socks5.sh

为什么还要建立ssh socks:

简单!!!重要的事情说三遍。不需要额外的客户端,有ssh的地方就可以实现,配合系统全局代理或浏览器,就可以实现代理,为后续步骤提供方便,同时也可以做交叉验证。

本地ss socks

shadowsocks-libev-ss-local

关于ss-local、ss-redir和ss-tunnel

ss-socks5.sh

cat /tmp/etc/passwall/SOCKS_TCP.json { “method”: “chacha20-ietf-poly1305”, “local_port”: 1070, “reuse_port”: true, “server_port”: 7070, “local_address”: “0.0.0.0”, “password”: “chen1234@sss”, “fast_open”: true, “mode”: “tcp_and_udp”, “timeout”: 300, “server”: “mtdcy.com” }

问题

  • xray/v2ray在做什么?

关闭xray/v2ray的网络嗅探,一切正常!!!

  • 路由器重启之后,第一次无法科学上网,需要本地切换到代理(*:1070),使用一次之后直连方可科学上网。

    WHY? ==> dnsmasq的问题,重启服务后ok ==> 待解决


最后更新于 2023-11-28
小酌怡情
Built with Hugo
主题 StackJimmy 设计
访问量 -    访客数 - 人次