跳转至

Clash on LAN/linux/Dockers

导言

在国内的linux服务器上,往往需要clash来代理访问github等外网资源。

有几种解决方案:

  1. 透明代理
  2. ssh 转发实现代理,类似ssh -fNgR 7333:127.0.0.1:7890 [email protected]
  3. Clash 的 Allow LAN功能
  4. Clash in Docker
  5. Clash in Linux

Clash的模式

  • 系统代理模式:只代理127.0.0.1:7890上的数据
  • TUN代理模式:虚拟网卡,并接管所有的网络层的数据
    • 无法封装网络层数据包,无法代理ping, fake-ip还会返回假ip
    • TUN与TAP是操作系统内核中的虚拟网络设备:
      • TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。
      • TUN模拟了网络层设备,操作第三层数据包比如IP数据包。
  • 舍弃的redir-host模式由于必须返回一个真实ip,因此必需发起dns请求,存在dns泄露
  • 默认的fake-ip会对域名的DNS请求返回fake-ip,从而避免DNS泄露。然后根据域名分流将信包发送到对应的上游代理机器,把域名DNS解析工作留给上游机器。
    • fake-ip模式,将fake-ip-filter设置为+.*便等价于redir-host模式

Clash的配置文件

# RESTful web API listening address
external-controller: 127.0.0.1:9090


# DNS server settings
# This section is optional. When not present, the DNS server will be disabled.
dns:
  enable: false
  listen: 0.0.0.0:53
  ipv6: false # when the false, response to AAAA questions will be empty

  # These nameservers are used to resolve the DNS nameserver hostnames below.
  # 默认只支持ip
  default-nameserver:
    - 8.8.8.8

  # 对于下面的域名,fake-ip模式会返回真实ip
  fake-ip-filter:
    - '*.lan'
    - localhost.ptlogin2.qq.com

  # 支持 UDP, TCP, DoT, DoH. 和指定端口
  # 所有DNS请求都会不经过代理被转发到这些服务器,Clash会选择一个最快的返回结果
  nameserver:
    - https://223.5.5.5/dns-query # 阿里云
    - https://doh.pub/dns-query #腾讯云
    - tls://dns.rubyfish.cn:853 # DNS over TLS
    - https://1.1.1.1/dns-query # DNS over HTTPS
    - dhcp://en0 # dns from dhcp

  # 对于所有DNS请求,fallback和nameserver内的服务器都会同时查找
  # 如果DNS结果为非国内IP(GEOIP country is not `CN`),会使用fallback内的服务器的结果
  # 因为nameserver内为国内服务器,对国外域名可能有DNS污染。fallback内是国外服务器,能防止国外域名被DNS污染
  fallback:
    - https://162.159.36.1/dns-query 
    - https://dns.google/dns-query
    - tls://8.8.8.8:853

  # DNS污染攻击的对策
  fallback-filter:
    geoip: false # If geoip is true, when geoip matches geoip-code, clash will use nameserver results. Otherwise, Clash will only use fallback results.
    # geoip-code: CN    
    ipcidr: # IPs in these subnets will be considered polluted, when nameserver results match these ip, clash will use fallback results.
      - 0.0.0.0/8
      - 10.0.0.0/8
      - 100.64.0.0/10
      - 127.0.0.0/8
      - 169.254.0.0/16
      - 172.16.0.0/12
      - 192.0.0.0/24
      - 192.0.2.0/24
      - 192.88.99.0/24
      - 192.168.0.0/16
      - 198.18.0.0/15
      - 198.51.100.0/24
      - 203.0.113.0/24
      - 224.0.0.0/4
      - 240.0.0.0/4
      - 255.255.255.255/32
    domain: #Domains in these list will be considered polluted, when lookup these domains, clash will use fallback results.
      - +.google.com
      - +.facebook.com
      - +.youtube.com
      - +.githubusercontent.com

Clash use Allow LAN

假如服务器和笔记本在LAN下,笔记本的clash软件只需要打开LAN就可以给服务器代理了,是最简单方便的方式。

Clash in Docker

由于UGREEN NAS一直开机,作为代理节点很适合。

首先注意修改代理机场的文件config.yaml0.0.0.0:9090,以便haishanh/yacd使用。

mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: '0.0.0.0:9090'
  • 使用dreamacro/clash1
  • UI使用haishanh/yacd

Clash in Linux

下载

下载可执行文件

wget https://github.com/Dreamacro/clash/releases/download/v1.11.8/clash-linux-amd64-v1.11.8.gz
scp
gunzip clash-linux-amd64-v1.11.8.gz
chmod u+x clash-linux-amd64-v1.11.8
  • Clash 运行时需要 Country.mmdb 文件,Country.mmdb 文件利用 GeoIP2 服务能识别互联网用户的地点位置,以供规则分流时使用。
  • 当第一次启动 Clash 时(使用 ./clash 命令) 会自动下载(会下载至 /home/XXX/.config/clash 文件夹下)。自动下载可能会因网络原因较慢,可以访问该链接手动下载。

配置

根据订阅链接配置文件

cd ~/.config/clash
curl -o config.yaml 'longURL'

验证

成功结果

# shaojiemike @ node6 in ~/Download [10:22:54] C:130       
$set_proxy                                            

# shaojiemike @ node6 in ~/Download [10:22:57]       
$ curl -v www.google.com 

# shaojiemike @ node6 in ~/Download [10:21:46]
$ ./clash-linux-amd64-v1.11.8
INFO[0000] Start initial compatible provider 🍃 Proxies
INFO[0000] Start initial compatible provider ☁️ Others
INFO[0000] Start initial compatible provider 🍂 Domestic
INFO[0000] Start initial compatible provider ⭐️ Auto
INFO[0000] Mixed(http+socks) proxy listening at: [::]:7890
INFO[0000] RESTful API listening at: [::]:9090
INFO[0000] DNS server listening at: [::]:5323
INFO[0070] [TCP] 127.0.0.1:52664 --> www.google.com:80 match DomainKeyword(google) using 🍃 Proxies[专线 日本 03]

图形化界面管理

http://clash.razord.top/#/proxies

输入

Host: node6.swangeese.fun
Port: 9090
Secret: 配置文件配置的 secret

查看config.yaml,发现是空

mixed-port: 7890                                      
allow-lan: true                                           
mode: rule                                                    
log-level: info                                                     
external-controller: '0.0.0.0:9090'                               
secret: ''

常见问题

address already in use
# shaojiemike @ node6 in ~/Download [10:14:25]
$ ./clash-linux-amd64-v1.11.8
INFO[0000] Start initial compatible provider ⭐️ Auto
INFO[0000] Start initial compatible provider 🍃 Proxies
INFO[0000] Start initial compatible provider ☁️ Others
INFO[0000] Start initial compatible provider 🍂 Domestic
INFO[0000] RESTful API listening at: [::]:9090
INFO[0000] Mixed(http+socks) proxy listening at: [::]:7890
ERRO[0000] Start DNS server error: listen udp 0.0.0.0:5353: bind: address already in use

修改配置文件里的端口即可

参考文献

https://blog.iswiftai.com/posts/clash-linux/

https://einverne.github.io/post/2021/03/linux-use-clash.html