Trojan + https-dns-proxy 实现OpenWrt科学上网

近期由于某些原因家里路由器上安装的Shadowsocks + ChinaDNS不能正常使用了,正好服务商开始提供Trojan服务,于是就想着把路由器上也安装Trojan。Trojan目前还没有官方OpenWrt安装包,只提供了源码 openwrt-trojan,需要自行编译。

安装过程分为以下三步:

  • 配置Trojan作为透明代理,类似于ss-redir的功能
  • 设置iptables规则,使国内跟国外流量分流
  • 通过https-dns-proxy解决DNS污染

环境

  • Fedora 31 Workstation
  • OpenWrt 19.07.1

编译并安装Trojan

我这里是在Fedora 31下进行编译的,FreeBSD下没有成功。具体方法可以参考官方文档1

  1. 安装依赖

     dnf groupinstall "Development Tools"
     dnf groupinstall "C Development Tools and Libraries"
     dnf install python2
    
  2. 下载源码

     git clone https://git.openwrt.org/openwrt/openwrt.git
     git clone https://github.com/trojan-gfw/openwrt-trojan.git
     cd openwrt
     # 选择路由器固件的分支
     git checkout v19.07.1
     mv ../openwrt-trojan/trojan ../openwrt-trojan/openssl1.1 package/
    

    这里一定选择跟路由器固件版本相同的分支,否则可能会有安装包版本冲突

  3. 编译,参考资料2

     ./scripts/feeds update -a
     ./scripts/feeds install -a
    
     make menuconfig
    

    这里的Target System的选择可以从OpenWrt的设备页面寻找,例如:WNDR4300。选中Package the OpenWrt-based Toolchain,然后在下面的package里找到并选择trojan(M才会编译成.ipk)。

     make -j5 V=s 2>&1 | tee build.log | grep -i '[^_-"a-z]error[^_-.a-z]'
    

    漫长地等待之后在bin目录里可以找到 trojan-1.4.1xxxxx.ipk,上传到路由器的 /tmp 目录供我们安装。

  4. 安装Trojan

    登录路由器安装Trojan

     opkg update
     opkg install /tmp/trojan-1.4.1xxxxx.ipk
    

    因为我们是作为透明代理来使用,所以模式要选择 nat。如果选择client模式此时在路由器上已经可以作为socks5代理使用。

     cat > /etc/trojan.json <<'EOF'
     {
         "run_type": "nat",
         "local_addr": "127.0.0.1",
         "local_port": 1080,
         "remote_addr": "example.com",
         "remote_port": 443,
         "password": [
             "password1"
         ],
         "log_level": 1,
         "ssl": {
             "verify": true,
             "verify_hostname": true,
             "cert": "",
             "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
             "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
             "sni": "",
             "alpn": [
                 "h2",
                 "http/1.1"
             ],
             "reuse_session": true,
             "session_ticket": false,
             "curves": ""
         },
         "tcp": {
             "no_delay": true,
             "keep_alive": true,
             "reuse_port": false,
             "fast_open": false,
             "fast_open_qlen": 20
         }
     }
     EOF
    

配置iptables

因我之前已经装了shadowsocks,iptables已经由/usr/bin/ss-rules设置好了,所以我直接在/etc/init.d/trojan里加上shadowsocks关于防火墙的设置。下面我们不使用ss-rules,而是直接设置iptables。iptables设置方法参考3,Chnroute参考4

首先需要安装 ipset,通过它可以把chnroute的IP地址作为一个组加到iptables

opkg update
opkg install ipset

新建一个文件 /usr/bin/trojan-up.sh,在trojan启动时设置防火墙。内容如下

#!/bin/sh

SOCKS_SERVER=x.x.x.x
# Setup the ipset
ipset -! restore <<-EOF
    create chnroute hash:net hashsize 64
    $(for ip in $(cat /etc/chnroute.txt); do echo "add chnroute $ip"; done)
EOF

# nat SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS
iptables -t mangle -N SHADOWSOCKS

# Allow connection to the server
iptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN

# Allow connection to reserved networks
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 100.64.0.0/10 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.0.0.0/24 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.0.2.0/24  -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.31.196.0/24 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.52.193.0/24 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.88.99.0/2 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.175.48.0/24 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 198.18.0.0/15 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 198.51.100.0/24 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 203.0.113.0/24 -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

# Allow connection to chinese IPs
iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN

# Redirect to Shadowsocks
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1080

iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS

# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
iptables -t mangle -A PREROUTING -j SHADOWSOCKS

Trojan关闭时,清理iptables规则的文件 /usr/bin/trojan-down.sh

#!/bin/sh

iptables -t nat -D PREROUTING -p tcp -j SHADOWSOCKS
iptables -t mangle -D PREROUTING -j SHADOWSOCKS

iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS
iptables -t nat -F SHADOWSOCKS
iptables -t nat -X SHADOWSOCKS
iptables -t mangle -F SHADOWSOCKS
iptables -t mangle -X SHADOWSOCKS
ipset destroy chnroute

然后在Trojan的启动文件/etc/init.d/trojan脚本加上这2个文件,这样iptables规则跟随trojan生灭。

https-dns-proxy 解决DNS污染5

opkg update
opkg install luci-app-https-dns-proxy https-dns-proxy

安装完成默认已经配置好了,在Luci界面查看 dnsmasqDNS forwardings 是否设置成功。

至此又可以科学上网啦。

参考

Tags: OpenWrt trojan
Share: X (Twitter) Facebook LinkedIn