上篇讲了讲原理,这个文章记录一下细节。

一、远程服务器

腾讯Cloud现在有活动,99一年,500G月流量。装shadowsocks-libev和dnsmasq. shadowsocks是代理服务器,dnsmasq提供中国境内的DNS解析。

# dnsmasq.conf
port=7753
bind-interfaces

Config.json for shadowsocks

{
  "server": "0.0.0.0",
  "server_port": 7788,
  "password": "ABCDefghijklmnopq",
  "method": "chacha20-ietf-poly1305",
  "timeout": 600,
  "no_delay": true,
  "mode": "tcp_only"
}

二、本地Linux

首先Enable routing:然后sysctl -p使之生效

# /etc/sysctl.conf
net.ipv4.ip_forward=1

创建一个所有中国IP的ipset:

curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt
sudo ipset create chnroute hash:net
cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip

设置所有的中国IP都转发到本机的7892端口,clash的redir端口。

# 在 nat 表中创建新链
iptables -t nat -N SHADOWSOCKS
# X.X.X.X 是远程shadowsocks的地址,不用转发它,否则该死循环了
iptables -t nat -A SHADOWSOCKS -d X.X.X.X -j RETURN
# 局域网地址
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
# 所有的中国IP去本机7892端口
iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j REDIRECT --to-ports 7892
# 把这个Chain放在PREROUTING里
iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKS

设置clash代理

port: 7890
socks-port: 7891
# 这是上面redirect的端口
redir-port: 7892
# 这个似乎是必须的,iptables redirect不是到127.0.0.1,而是本机的外部IP
allow-lan: true
bind-address: '192.168.1.2'
mode: rule
log-level: debug
dns:
  enable: true
  listen: 0.0.0.0:53
  ipv6: true # when the false, response to AAAA questions will be empty
  default-nameserver:
    - 8.8.8.8 # 这个域名服务器是用来解析下面的nameserver的服务器的...
  enhanced-mode: redir-host # or fake-ip
  fake-ip-range: 198.18.0.1/16 # Fake IP addresses pool CIDR
  nameserver:
    - 8.8.8.8 # default value
  fallback:
    - dnsmasq.shawnma.com:7753 # 远程DNSMASQ的地址
  fallback-filter:
    geoip: false # 这很重要,否则它会采用fallback DNS来解析所有非中国域名,错
    domain: # 这里所有的域名都会被fallback DNS解析
       - '+.bilibili.com'
       - '+.biliapi.com'
       - '+.iqiyi.com'
proxies:
  - name: "ss1"
    type: ss
    server: dnsmasq.shawnma.com # 远程shadowsocks server
    port: 7788
    cipher: chacha20-ietf-poly1305
    password: "ABCDefghijklmnopq" # 跟远程ss密码一致
proxy-groups: # 这个好像没有什么用
  - name: "relay"
    type: relay
    proxies:
      - ss1
rules:
  - DOMAIN-SUFFIX,qq.com,ss1 # 对于所有qq.com的域名,走ss1 proxy
  - DOMAIN-SUFFIX,youku.com,ss1
  - DOMAIN-SUFFIX,bilibili.com,ss1
  - DOMAIN-SUFFIX,biliapi.com,ss1
  - DOMAIN-SUFFIX,iqiyi.com,ss1
  - IP-CIDR,203.205.0.0/16,ss1
  - MATCH,DIRECT # 其他所有的直连

systemd for clash

[Unit]
Description=Clash Daemon
After=network.target

[Service]
ExecStart=/bin/clash-linux-amd64 -d /home/sma/clash

[Install]
WantedBy=multi-user.target

ipset和iptables的规则也需要persist。iptables规则装apt install iptables-persistent就行。ipset需要自己写一个systemd service

# cat ipset.service
[Unit]
Description=ipset persistent configuration
Before=network.target

# ipset sets should be loaded before iptables
# Because creating iptables rules with names of non-existent sets is not possible
Before=netfilter-persistent.service
ConditionFileNotEmpty=/etc/ipset.conf

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ipset restore -file /etc/ipset.conf
# Uncomment to save changed sets on reboot
# ExecStop=/sbin/ipset save -file /etc/iptables/ipset
ExecStop=/sbin/ipset flush
ExecStopPost=/sbin/ipset destroy

[Install]
WantedBy=multi-user.target

RequiredBy=netfilter-persistent.service

好像就这些,以上。应该可以再配置一个DHCP服务器,可是我还没有做。。手动配置中。。