Clash for Docker 在ESXi上的最佳实践 v1.1

Terrance Siu
11 min readDec 10, 2018

--

v1.2 *增加了fake-ip 配置

Clash是目前来说我觉得最好的客户端,由于其兼容Surge的配置规则写法,基于域名分流就可以简单的做到相同网络下不同区域的视频流媒体需求。

上周Clash发布了v0.10.0版本,增加了自定义DNS功能的支持。这下完全可以抛弃IPSet和Dnsmasq了。对于想买新版MacMini来跑Surge作为网关的朋友们,口袋可以省下不少银子。

一、安装Fedora Atomic

1.1 运行Docker我推荐使用Fedora Atomic 。需要从这个地址:https://getfedora.org/zh_CN/atomic/ 下载ISO文件。

1.2 创建虚拟机过程中需要配置两个网口,网口1(eth0)连接你的主路由或者光猫(路由模式),网口2(eth1)连接你的交换机或者直接连接你目前的无线路由器(需要改成AP模式)大概的连接拓扑图如下:

拓扑图

基于这种模式需要一级路由支持静态路由配置,否则一级路由无法于二级与路由下的子网通信,自然二级路由的子网也无法上网。当然确实不支持也不是没办法,后面的防火墙配置有具体操作。

1.3 根据下面的要求创建一个虚拟机

名称:自定义。

兼容性:默认。

客户机操作系统系列:“Linux”。

客户机操作系统版本:“RedHat Fedora(64位)”。

硬盘1:“32GB”。

类型:“厚置备,置零”。

网络适配器1(PCI设备):选择与上级路由通信的vSwitch或者直通接口。

网络适配器2(PCI设备):选择与下级交换机、AP通信的vSwitch或者直通接口。

CD/DVD驱动器1:选择“数据存储ISO文件”,并勾选“连接”。

1.4 创建虚拟机后,加入之前下载的ISO文件。并启动虚拟机。

在引导界面中,通过“方向键”选择“Install Fedora 29”,同时按下“Tab”键,输入:

biosdevname=0 net.ifnames=0 selinux=0
引导界面
安装配置界面

二、安装后的配置

2.1 配置接口属性为开机自动启用

nmcli connection modify eth0 autoconnect on
nmcli connection modify eth1 autoconnect on

2.2 IPv4获取策略为手动设置

nmcli connection modify eth0 ipv4.method manual
nmcli connection modify eth1 ipv4.method manual

2.3 配置接口的IPv4地址和DNS服务器

nmcli connection modify eth0 ip4 172.31.3.1/24 gw4 172.31.3.254 ipv4.dns 114.114.114.114 +ipv4.dns 127.0.0.1
nmcli connection modify eth1 ip4 172.31.4.254/24

2.4 禁用Audit审计日志

sed -i ‘s/^\(log_format.*\)\=.*[A-Z]*$/\1=\ NOLOG/g’ /etc/audit/auditd.conf

2.5.1 防火墙配置(一级路由支持添加静态路由)

systemctl disable iptables.service
systemctl enable firewalld.service
firewall-cmd --permanent --set-default-zone=trusted
firewall-cmd --permanent --zone=trusted --add-interface=eth0
firewall-cmd --permanent --zone=trusted --add-interface=eth1
firewall-cmd --reload
firewall-cmd --get-active-zones
reboot

2.5.2 防火墙配置(一级路由不支持添加静态路由,例如Amplifi)

systemctl disable iptables.service
systemctl enable firewalld.service
firewall-cmd --permanent --set-default-zone=external
firewall-cmd --permanent --zone=external --add-interface=eth0
firewall-cmd --permanent --zone=trusted --add-interface=eth1
firewall-cmd --reload
firewall-cmd --get-active-zones
reboot

三、配置Dnsmasq和Clash

3.1 创建Dnsmasq的Dockerfile

mkdir -p /root/dnsmasq 
vim /root/dnsmasq/Dockerfile
#
# Dockerfile for dnsmasq
#
FROM alpine:edge
MAINTAINER Terrance Siu <terrance.siu@gmail.com>
RUN apk --no-cache add dnsmasq
USER rootEXPOSE 67/udpENTRYPOINT ["/usr/sbin/dnsmasq", "-k","--port=0","--user=root","--group=root","--dhcp-range=172.31.4.1,172.31.4.253,86400","--dhcp-option=42,59.124.29.241","--dhcp-option=6,172.31.4.254","--dhcp-option=1,255.255.255.0","--dhcp-option=3,172.31.4.254","--dhcp-broadcast","--log-dhcp","--log-facility=-"]

3.2 构建镜像

cd /root/dnsmasq
docker build -t dnsmasq .

3.3 运行Dnsmasq

docker run -d --name dnsmasq --net host --restart always -v /etc/localtime:/etc/localtime dnsmasq

3.4 检查

docker ps -a
netstat -unlp | grep dns
udp 0 0 0.0.0.0:67 0.0.0.0:* 80457/dnsmasq

3.5 Clash订阅配置

目前我使用的是rixCloud,最近他们家机场提供了Clash的支持,如果你也想使用rixCloud的服务,欢迎通过我的aff链接注册:https://datarelay.io/aff.php?aff=507

mkdir -p /root/.config/clash
curl -o /root/.config/clash/config.yml https://api.rixcloud.io/v2/....

3.6 编辑订阅配置文件

将Proxy:之前的内容替换下面列出的,保存。

port: 8080
socks-port: 1080
redir-port: 3128
allow-lan: true
mode: Rule
log-level: info
external-controller: '0.0.0.0:6170'
secret: ''
dns:
enable: true
ipv6: false
listen: 0.0.0.0:53
enhanced-mode: redir-host
nameserver:
- 114.114.114.114
- 119.29.29.29
- tls://dns.rubyfish.cn:853
fallback:
- 1.1.1.1
- tls://1.1.1.1:853
- 1.0.0.1
- tls://1.0.0.1:853

3.7 运行Clash

docker pull dreamacro/clash
docker run -d --name clash --net host --restart always -v /etc/localtime:/etc/localtime -v /root/.config/clash/:/root/.config/clash/ dreamacro/clash

3.8 检查

netstat -tunlp | grep clash
tcp6 0 0 :::8080 :::* LISTEN 18561/clash
tcp6 0 0 :::3128 :::* LISTEN 18561/clash
tcp6 0 0 :::1080 :::* LISTEN 18561/clash
tcp6 0 0 :::6170 :::* LISTEN 18561/clash
udp6 0 0 :::53 :::* 18561/clash

3.9 查看运行日志

docker logs clash -f
time="2018-12-10T13:04:19+08:00" level=info msg="SOCKS proxy listening at: :1080"
time="2018-12-10T13:04:19+08:00" level=info msg="HTTP proxy listening at: :8080"
time="2018-12-10T13:04:19+08:00" level=info msg="Redir proxy listening at: :3128"
time="2018-12-10T13:04:19+08:00" level=info msg="RESTful API listening at: 0.0.0.0:6170"

四、透明代理配置

firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -i eth1 -p tcp ! --dport 22 -j REDIRECT --to-ports 3128

五、劫持DNS请求(chromecast)

firewall-cmd --permanent --zone=trusted --add-forward-port=port=53:proto=udp:toport=53:toaddr=172.31.4.254
firewall-cmd --reload

六、测试

我直接在另外一台Linux虚拟机中使用curl测试,其他测试方式,当手机或者PC连接到172.31.4.0/24 这个网络后,直接通过浏览器访问http://www.ip111.cn/也可以达到同样的效果!

curl ipinfo.io #如果成功,返回的是你的远程代理主机IP
curl myip.ipip.net #如果成功,返回的是你接入ISP的IP地址

七、启用BBR

cat >>/etc/sysctl.d/99-docker.conf <<"EOF"
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl --system
sysctl -a | grep bbr

八、切换服务器

8.1 Clash暂时只支持API来切换,不过也非常简单,如果你是iOS用户可以尝试编写一个“捷径”程序来处理切换。下面是一个演示的截图。

Server变量就是你订阅中节点名称。

Group变量就是 策略组 名称

Host变量就是运行Clash的虚拟机IP地址。

捷径

8.2 直接通过curl来操作

curl  http://172.31.4.254:6170/proxies/rixCloud  -XPUT -d '{ "name": "澳门 BGP 中继 2" }' -i

最后,如果你觉得Clash对你帮助很大,不妨通过下面地址,请作者喝一杯咖啡吧。

https://www.buymeacoffee.com/Dreamacro

--

--