代理服务器软件 mita 需要运行在 Linux 系统中。我们提供了 debian 和 RPM 安装包,便于用户在 Debian / Ubuntu 和 Fedora / CentOS / Red Hat Enterprise Linux 系列发行版中安装 mita。
在安装和配置开始之前,先通过 SSH 连接到服务器,再执行下面的指令。
# Debian / Ubuntu - X86_64
curl -LSO https://github.com/enfein/mieru/releases/download/v3.12.0/mita_3.12.0_amd64.deb
# Debian / Ubuntu - ARM 64
curl -LSO https://github.com/enfein/mieru/releases/download/v3.12.0/mita_3.12.0_arm64.deb
# RedHat / CentOS / Rocky Linux - X86_64
curl -LSO https://github.com/enfein/mieru/releases/download/v3.12.0/mita-3.12.0-1.x86_64.rpm
# RedHat / CentOS / Rocky Linux - ARM 64
curl -LSO https://github.com/enfein/mieru/releases/download/v3.12.0/mita-3.12.0-1.aarch64.rpm
# Debian / Ubuntu - X86_64
sudo dpkg -i mita_3.12.0_amd64.deb
# Debian / Ubuntu - ARM 64
sudo dpkg -i mita_3.12.0_arm64.deb
# RedHat / CentOS / Rocky Linux - X86_64
sudo rpm -Uvh --force mita-3.12.0-1.x86_64.rpm
# RedHat / CentOS / Rocky Linux - ARM 64
sudo rpm -Uvh --force mita-3.12.0-1.aarch64.rpm
上述指令也可以用来升级 mita 软件包的版本。
sudo usermod -a -G mita $USER
# logout
exit
systemctl status mita
如果输出中包含 active (running)
,表示 mita 守护进程已经开始运行。通常情况下,mita 会在服务器启动后自动开始运行。
mita status
如果刚刚完成安装,此时的输出为 mita server status is "IDLE"
,表示 mita 还没有开始监听来自 mieru 客户端的请求。
mieru 代理支持 TCP 和 UDP 两种不同的传输协议。要了解协议之间的差别,请阅读 mieru 代理协议。
用户可以通过
mita apply config <FILE>
指令来修改代理服务器的设置,这里的 <FILE>
是一个 JSON 格式的配置文件。该配置文件不需要指定完整的代理服务器设置。运行指令 mita apply config <FILE>
时,文件内容会合并到任何已有的代理服务器设置。
下面是服务器配置文件的一个例子。
{
"portBindings": [
{
"portRange": "2012-2022",
"protocol": "TCP"
},
{
"port": 2027,
"protocol": "TCP"
}
],
"users": [
{
"name": "ducaiguozei",
"password": "xijinping"
},
{
"name": "meiyougongchandang",
"password": "caiyouxinzhongguo"
}
],
"loggingLevel": "INFO",
"mtu": 1400
}
portBindings
->port
属性是 mita 监听的 TCP 或 UDP 端口号,请指定一个从 1025 到 65535 之间的值。如果想要监听连续的端口号,也可以改为使用portRange
属性。请确保防火墙允许使用这些端口进行通信。portBindings
->protocol
属性可以使用TCP
或者UDP
。- 在
users
->name
属性中填写用户名。 - 在
users
->password
属性中填写该用户的密码。 - 【可选】
mtu
属性是使用 UDP 代理协议时,传输层最大的载荷大小。默认值是 1400,最小值是 1280。
除此之外,mita 可以监听多个不同的端口。我们建议在服务器和客户端配置中使用多个端口。
如果你想把代理线路分享给别人使用,也可以创建多个不同的用户。
假设在服务器上,这个配置文件的文件名是 server_config.json
,在文件修改完成之后,请调用指令 mita apply config server_config.json
写入该配置。
如果配置有误,mita 会打印出现的问题。请根据提示修改配置文件,重新运行 mita apply config <FILE>
指令写入修正后的配置。
写入后,可以用
mita describe config
指令查看当前设置。
使用指令
mita start
启动代理服务。此时 mita 会开始监听设置中指定的端口号。
接下来,调用指令
mita status
查询工作状态,这里如果返回 mita server status is "RUNNING"
,说明代理服务正在运行,可以开始相应客户端的请求了。
如果想要停止代理服务,请使用指令
mita stop
注意,每次使用 mita apply config <FILE>
修改设置后,需要用 mita stop
和 mita start
重启代理服务,才能使新设置生效。一个例外是,如果只修改了 users
或者 loggingLevel
设置,你可以使用 mita reload
加载新的设置,此时不会影响服务器与客户端的活跃连接。
启动代理服务后,请继续进行客户端安装与配置。
BBR 是一种不依赖于丢包的拥塞控制算法。在恶劣的网络情况下,使用 BBR 的网络传输速度比传统算法更快。
mieru 的 UDP 传输协议已经使用了 BBR 算法。
在项目根目录下,我们提供了脚本 tools/enable_tcp_bbr.py
,允许用户在 Linux 系统中让 TCP 传输协议使用 BBR 算法。
sudo ./tools/enable_tcp_bbr.py
上述脚本可以在服务器和客户端中使用。
出站代理功能允许 mieru 与其他代理工具结合构成链式代理。链式代理的网络拓扑结构的一个例子如下图所示:
mieru 客户端 -> GFW -> mita 服务器 -> cloudflare 代理客户端 -> cloudflare CDN -> 目标网站
通过链式代理,目标网站看到的 IP 地址是 cloudflare CDN 的地址,而不是 mita 服务器的地址。
下面是配置链式代理的一个例子。
{
"egress": {
"proxies": [
{
"name": "cloudflare",
"protocol": "SOCKS5_PROXY_PROTOCOL",
"host": "127.0.0.1",
"port": 4000,
"socks5Authentication": {
"user": "shilishanlu",
"password": "buhuanjian"
}
}
],
"rules": [
{
"ipRanges": ["*"],
"domainNames": ["*"],
"action": "PROXY",
"proxyName": "cloudflare"
}
]
}
}
- 在
egress
->proxies
属性中列举出站代理服务器的信息。当前版本只支持 socks5 出站,因此protocol
的值必须设定为SOCKS5_PROXY_PROTOCOL
。如果出站代理服务器需要 socks5 用户名和密码验证,请填写socks5Authentication
属性。否则,请删除socks5Authentication
属性。 - 在
egress
->rules
属性中列举出站规则。当前版本最多允许用户添加一条规则,且ipRanges
,domainNames
和action
的值必须与上面的例子相同。proxyName
需要指向一个egress
->proxies
属性中存在的代理。
如果想要关闭出站代理功能,将 egress
属性设置为空 {}
即可。
注意,链式代理和嵌套代理不同。嵌套代理的网络拓扑结构的一个例子如下图所示:
Tor 浏览器 -> mieru 客户端 -> GFW -> mita 服务器 -> Tor 网络 -> 目标网站
关于如何在 Tor 浏览器上配置嵌套代理,请参见翻墙安全指南。
当代理客户端请求的目标网站是域名,而不是 IP 地址时,代理服务器需要发起 DNS 请求。如果代理服务器处于 IPv4 / IPv6 双栈网络中,可以使用下面的配置调整 DNS 策略:
{
"dns": {
"dualStack": "USE_FIRST_IP"
}
}
dns
-> dualStack
属性支持的值包括:
USE_FIRST_IP
:永远使用 DNS 服务器返回的第一个 IP 地址。这是默认策略。PREFER_IPv4
:优先使用 DNS 服务器返回的第一个 IPv4 地址。如果没有 IPv4 地址,则使用第一个 IPv6 地址。PREFER_IPv6
:优先使用 DNS 服务器返回的第一个 IPv6 地址。如果没有 IPv6 地址,则使用第一个 IPv4 地址。ONLY_IPv4
:强制使用 DNS 服务器返回的第一个 IPv4 地址。如果没有 IPv4 地址则连接失败。ONLY_IPv6
:强制使用 DNS 服务器返回的第一个 IPv6 地址。如果没有 IPv6 地址则连接失败。
我们可以使用 users
-> quotas
属性限制用户可以使用的流量大小。例如,如果想让用户 "ducaiguozei" 在 1 天时间内最多使用 1 GB 流量,并且在 30 天时间内最多使用 10 GB 流量,可以应用下面的设置。
{
"portBindings": [
{
"portRange": "2012-2022",
"protocol": "TCP"
},
{
"port": 2027,
"protocol": "TCP"
}
],
"users": [
{
"name": "ducaiguozei",
"password": "xijinping",
"quotas": [
{
"days": 1,
"megabytes": 1024
},
{
"days": 30,
"megabytes": 10240
}
]
},
{
"name": "meiyougongchandang",
"password": "caiyouxinzhongguo"
}
],
"loggingLevel": "INFO",
"mtu": 1400
}
客户端和代理服务器软件会根据用户名、密码和系统时间,分别计算密钥。只有当客户端和服务器的密钥相同时,服务器才能解密和响应客户端的请求。这要求客户端和服务器的系统时间不能有很大的差别。
为了保证服务器系统时间是精确的,我们建议用户安装 NTP 网络时间服务。在许多 Linux 发行版中,安装 NTP 只需要一行指令
# Debian / Ubuntu
sudo apt-get install ntp
# RedHat / CentOS / Rocky Linux
sudo dnf install ntp