Camo is a VPN using HTTP/2 over TLS.
我理想的 proxy, 是所有流量都走 HTTPS, 一切看起来就像访问一个正常的网站一样.
- 使用 HTTP/2 over TLS 建立隧道, 将流量伪装成正常网站访问的流量
- 内置 Let's Encrypt ACME
- 支持 TLS 1.3 PSK 模式 (此模式下不再需要有效域名和证书)
- 身份认证, 对无法通过身份认证的请求均返回 404
- 支持 IPv4 和 IPv6
- 连接到同一服务器的 client 可以通过私有 IP 相互访问
你可以在 release 页面直接下载 camo
.
或者使用 camo
的 docker 镜像:
docker pull linfn/camo
或者使用 go (1.13 or newer) 编译安装最新版本:
go get -u github.com/linfn/camo
camo
有两种工作模式:
- 标准模式:
camo
使用 HTTPS 建立连接, 这意味着服务端需要配置有效的域名和证书 (一切都是为了让它看上去像在访问某个网站). 幸运的是camo
内置了autocert
(via Let's Encrypt), 你不再需要手动申请和配置证书了. - PSK 模式: 借助于 TLS 1.3 的 PSK 模式, 服务端可以不再需要域名和证书, 只通过配置的密钥便可建立安全的连接, 更加方便使用.
camo
建议你使用 docker 来运行 camo server.
将你的域名指向你的 IP 后, 启动 camo server
docker run -d --cap-add=NET_ADMIN --device /dev/net/tun \
-p 443:443 \
-v $HOME/.cache/camo/certs:/camo/certs \
--name camo \
-e CAMO_PASSWORD=<password> \
linfn/camo server --autocert-host <hostname>
这里 <hostname>
是你使用的域名 (它应该正确的指向了你的 IP, 否则无法通过 ACME Challenge), 挂载的 $HOME/.cache/camo/certs
目录用于存储之后自动生成的证书.
删除标准模式中的 --autocert-host <hostname>
参数, camo server
就会使用 PSK 模式工作:
docker run -d --cap-add=NET_ADMIN --device /dev/net/tun \
-p 443:443 \
--name camo \
-e CAMO_PASSWORD=<password> \
linfn/camo server
有 3 种方式可以让 docker 容器在 IPv6 下工作:
- 给容器分配一个 Public IPv6 地址 (from your public pool)
- 使用 IPv6 NAT 模式
- 使用 host network
这里主要介绍前面两种方式.
Step 1: 首先需要在 docker 中创建一个 IPv6 network
docker network create --ipv6 --subnet 2001:db8:1::/64 ipv6
这里 2001:db8:1::/64
是一个示例网段, 如果你使用 Public IP 模式 (方式一), 你需要把它替换到 vps 服务商提供给你的 Public IPv6 网段下;
如果你使用 NAT 模式 (方式二), 你可以自己配置一个私有网段, 例如 fd00:1::/64.
Step 2: 运行 camo server
这里以 camo
的标准模式举例 (如果使用 PSK 模式, 只需删除 --autocert-host <hostname>
参数即可)
docker run -d --cap-add NET_ADMIN --cap-add SYS_MODULE \
--device /dev/net/tun \
--sysctl net.ipv6.conf.all.disable_ipv6=0 \
--sysctl net.ipv6.conf.default.forwarding=1 \
--sysctl net.ipv6.conf.all.forwarding=1 \
--network ipv6 \
-p 443:443 \
-v /lib/modules:/lib/modules:ro \
-v $HOME/.cache/camo/certs:/camo/certs \
--name camo \
-e CAMO_PASSWORD=<password> \
linfn/camo server --autocert-host <hostname>
这里 --cap-add SYS_MODULE
和 -v /lib/modules:/lib/modules:ro
是为了让 ip6tables
有能力自动载入需要的内核模块.
Step 3:
如果你使用 Public IP 模式 (方式一), 为了让 Router 能够找到容器, 你需要启用 NDP Proxy
sysctl net.ipv6.conf.eth0.proxy_ndp=1
ip -6 neigh add proxy <IPv6 address of container> dev eth0
另外 (可选的), 你还可以使用 ndppd 服务, 它能够为一个或多个网段提供 NDP Proxy.
如果你使用 NAT 模式 (方式二):
ip6tables -t nat -A POSTROUTING -s 2001:db8:1::/64 -j MASQUERADE
将这里的 2001:db8:1::/64
替换为 Step 1 中创建的 network 网段即可.
更多 IPv6 with Docker 的相关信息参考这里.
NOTE:
camo client
目前仅支持 macOS 和 linux 平台, windows 平台的支持正在进行中
使用标准模式启动 (需要 root 权限):
sudo camo client -password <password> <hostname>
使用 PSK 模式启动 (需要 root 权限):
sudo camo client -psk -password <password> -resolve <ip[:port]> <fake_hostname>
这里 fake_hostname
可以填写任意的域名 (例如 github.com), 然后在 -resolve
后填写真实的服务器 ip 地址 (端口默认 443).
camo client
会创建一个 tun
设备, 并同时接管 IPv4 和 IPv6 流量 (如果服务器启用了 IPv6 的话), 可以通过 -4
或 -6
flag 进行设置, 例如:
# IPv4 only
sudo camo client -4 -password <password> <hostname>
# IPv6 only
sudo camo client -6 -password <password> <hostname>
golang (1.13 or newer) required.
make
This project is licensed under the MIT License - see the LICENSE file for details