前言
众所周知,e-hentai 是全球最大的本子网站,而 H@H 则是其内容分发网络(PCDN),旨在减轻服务器压力,并让用户更轻松地下载所喜爱的本子。此外,搭建 H@H 还能够获得可观的报酬。
然而,搭建 H@H 需要使用公网 IP,而在国内获取公网 IP 通常较为困难。幸运的是,通过 NAT1 打洞技术,我们可以实现公网访问,这也使得运行 H@H 客户端成为了可能。
在此对贡献了开源项目的大佬们表示感谢!经过不懈的努力,笔者也最终成功地在没有公网 IP 的情况下通过打洞技术运行了 H@H!
什么是H@H
H@H全名为Hentai@Home,也名为变态在家。
Hentai@Home (H@H)是一个开源的P2P图库分发系统,用于减轻E变态画廊的负担。
这是在ehwiki上的介绍,详细信息请参阅wiki这里不再赘述。https://ehwiki.org/wiki/Hentai@Home/Chinese
简而言之,通过H@H可以获取丰厚的奖励,包括更多的归档额度(下载额度),更多的GP(E站代币),更多的愿力(Power+7)。
最低要求
虽然ehwiki上明确写明想要运行H@H,至少需要80+ Mbit/s的测量速度,但实际上中国大陆的运营商会限制家宽的上行,最高也不会超过60Mbps。
就拿我的家庭宽带来说,运营商是电信,上行最高也是60Mbps,不过这也足够跑了,菠萝(站长)对大陆地区会有一定的赦免,只要不是太离谱都会给你过。
值得注意的是假设你的家庭网络最高上行为60Mbps,那么请不要设置超过10MB/S的速度,最好开启打开客户端侧速度限制。
虽然设置超越上限的速度可以拿到更多的静态范围,但对应的你的网络会因为上行被占满而变得无比卡顿,严重影响网络质量。
网络环境要求
- 一个独立的IPv4 IP地址
- 全锥型NAT1
想要运行H@H,必须满足两个条件中的其中之一。
当然,笔者也没有公网ipv4,好在有一个全锥型NAT1,通过nat1打洞的方式可以实现类似公网的效果。
其他要求
- 运行时长
这点比较容易做到,因为运行PCDN,7×24小时运行是最基本的,因此建议在NAS上运行。 - 硬盘空间
虽然最低可以设置为10GB,但理想上专门使用一块4T的机械硬盘用于跑H@H最佳,因为设置的硬盘空间越大,分配的静态空间越多,奖励也就越丰厚。
NAT打洞
这是决定你的网络能否运行H@H的关键性技术。
V2ex讨论帖:https://www.v2ex.com/t/879549
由mikewang大佬提供的思路,并使用python实现。
-
作用:将本地的 TCP 端口暴露至公网上,运行 HTTP 服务。
-
缺点:端口随机,无法固定。
具体实现原理较为复杂,感兴趣的小伙伴请自行去查阅参考资料。
前期工作
我们首先了解一下Natter是什么:
这是一个将 fullcone NAT (NAT 1) 后的端口,打洞暴露至互联网,使用Python实现的打洞工具。
举一个最简单的使用方法:
首先需要检查你的网络是不是NAT1全锥型,Natter提供了一个检测的python程序。
网络检测
在Github下载natter-check.py
运行python3 natter-check.py
如果得出NAT类型都为1,则说明你是全锥型,恭喜你可以进行NAT1打洞了。
但如果你运行后发现NAT类似不都为1,也不要着急,这说明你没有正确设置DMZ主机。
如果你使用的也是OpenWrt做路由器,你可以这样设置:
找到网络→防火墙→端口转发:
此处只需要选择你想要运行nat1打洞的设备地址即可
比如我希望运行在OpenWrt上,那么就选择
然后添加,就能够把设备设置为DMZ主机了。
但注意只能够让一台设备打洞,由于DMZ的特性,同时转发多个设备只有一个设备生效。
Natter打洞测试
在Github下载natter.py
运行natter:python3 natter.py
浏览器访问
Please check
中的url,出现“it work!”字样,即表明打洞成功。
Natter也可以将正在运行中的服务暴露到互联网中:
比方说,我希望将本机的8081端口暴露在互联网上,只需要执行
python3 natter.py -m iptables -p 8081
其中最下方的IP:10477 就是暴露在互联网上的地址,只要使用ipv4任何人都可以访问。
看到这里,可以简单概括一下,实现原理:
由于H@H只需要一个公开的tcp端口,而且这个端口是可以自行的指定的,所以只需要使用自动化脚本将NAT1打洞获取到的端口返回给H@H即可。
(此步骤仅作为环境测试,实际上只需要运行hath-with-natter以及hath-rust这两个项目即可。)
准备工作
我们这里使用taskmgr818大佬提供的整合项目:hath-with-natter
james58899大佬提供的非官方构建的客户端:hath-rust
以及mikewang大佬提供的Natter打洞工具:Natter
hath-with-natter使用方法
两种使用方法,一种是Docker运行,另一种是Linux中直接运行。
我选择了在linux中直接运行,按理来说使用Docker版更稳定一些, 但由于我已经用上了linux版,docker就不作介绍了。
Docker,YYDS!
首先克隆仓库:
git clone https://github.com/taskmgr818/hath-with-natter
填写配置文件:
下载该项目到本地,并将hath-with-natter.yaml.example重命名为hath-with-natter.yaml
并编辑配置文件:
#e-hentai的Cookie及客户端ID/Key,用于通知服务器端口变动
access_info:
ipb_member_id:
ipb_pass_hash:
client_id:
client_key:
proxy:
#是否使用代理与e-hentai.org通信
enable: True
#是否使用代理下载缓存
cache_download: False
url: http://127.0.0.1:8080
hath-rust:
#是否开启缓存校验
force_background_scan: False
其中ipb_member_id,ipb_pass_hash是你的e站的cookie,不知道如何获取请自行谷歌。
client_id和client_key是e站分配给你的客户端id和key,可以点此查看,填进去即可。(如果不知道如何申请H@H客户端,请仔细查阅ehwiki)
设置代理
需要注意的是,中国大陆是需要使用代理与e-hentai.org通信的。
只是简单提一下,我使用的是clash-meta,用docker-compose搭建:
# version: '3'
services:
clash:
container_name: clash-meta
image: metacubex/mihomo # 最新版用 metacubex/mihomo:Alpha
restart: always
pid: host
ipc: host
network_mode: host
cap_add:
- ALL
security_opt:
- apparmor=unconfined
volumes:
- ./clash_meta/clash:/root/.config/mihomo
- ./dev/net/tun:/dev/net/tun
# 共享host的时间环境
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
metacubexd:
container_name: metacubexd
image: mrxianyu/metacubexd-ui
restart: always
network_mode: bridge
ports:
- '1234:80'
volumes:
- ~/clash_meta/caddy:/config/caddy
# 共享host的时间环境
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
使用方式很简单,把配置文件config.yaml丢到挂载的目录即可,如:
当前文件夹/clash_meta/clash/config.yaml
测试代理:curl -x http://127.0.0.1:7890 -I https://www.google.com
rust-hath客户端
项目地址:https://github.com/james58899/hath-rust
在Github上下载对应版本的客户端,比如我使用的linux,架构是X86-64,因此选择
hath-rust-x86_64-unknown-linux-gnu
(不知道设备是什么架构,输入uname -a
查看。)
可以使用命令行下载
wget https://github.com/james58899/hath-rust/releases/latest/download/hath-rust-x86_64-unknown-linux-gnu
下载完成后重命名为hath-rust
mv hath-rust-x86_64-unknown-linux-gnu hath-rust
并赋予可执行权限
chmod +x hath-rust
至此准备工作已经完成。
运行hath-with-natter
在Linux上直接运行
我这里推荐使用tmux,单独创建一个窗口,保持后台运行。
直接tmux new -s hath-with-natter
创建一个新的会话。
输入命令运行hath-with-natter
python3 main.py
如果一切顺利,那么就可以直接跑起来了。
可以输入
tmux attach
很方便的进入窗口。退出也很简单,按键盘上的Ctrl+b,再单独点击键盘上的D,即可保持后台运行,并退出窗口。
使用Docker环境运行
Docker环境要比linux直接启动更为稳定,
services:
hath-with-natter:
image: taskmgr818/hath-with-natter
container_name: hath-with-natter
network_mode: host
volumes:
- ./config.yaml:/hath/config.yaml
- ./hath/:/hath/hath
restart: unless-stopped
需要注意配置好两个配置文件./config.yaml
,./hath/
注意查看项目README.md。
使用命令docker compose up -d
拉取镜像并在后台启动。
成功启动后使用命令docker ps
查看容器id。
使用docker logs -f 容器id
可查看容器的日志。
最后查看H@H,如果一切顺利,你就会发现客户端已经上线。
常见问题
- Q:从其他地区转移到大陆的H@H客户端运行一段时间后信任值还是很低,甚至有时候会降到0
- A:这是因为每个地区的H@H缓存的内容有很大的区别,只需要耐心等待几天即可
- Q:发生报错
ERROR - [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1007)
- A:可能是于E站进行通信的代理出现问题,重启或者更换代理。
- Q:日志显示
INFO - HTTP Request: GET https://223.5.5.5 "HTTP/1.1 404 Not Found"
- A:属于正常现象,重新打洞前会进行的网络检测,包括hath-rust启动失败、打洞失效,进行缓存校验都会显示该日志。
- Q:运行一段时间后客户端离线,并且无法重启解决。
- A:检查是设备是否固定了ip,如果是设置DHCP则有可能因内部ip改变,而使DMZ失效。固定ip并重新设置DMZ主机即可。
参考
- https://www.v2ex.com/t/879549
- https://ehwiki.org/wiki/Hentai@Home/Chinese
- https://github.com/taskmgr818/hath-with-natter
- https://github.com/james58899/hath-rust
- https://github.com/MikeWang000000/Natter