IPFS(InterPlanetary File System)是一个点对点的分布式文件系统。它的设计目标是创建一个更加开放、自由且高效的互联网。IPFS的核心思想是取代传统的基于位置的文件寻址(如HTTP)为基于内容的寻址。简而言之,IPFS允许你根据文件的内容而不是位置来定位它。
虽然IPFS在初始设置中通常直接连接到公共网络,但其灵活性允许用户根据特定需求进行个性化配置,以便支持私有网络的部署。这意味着用户可以通过调整设置,将IPFS节点集成到内部网络环境中,确保数据的私密性和访问受限于特定的受信任网络。这种配置的灵活性使得IPFS能够适应各种使用场景,从而更好地满足用户对于数据安全和隐私控制的需求。
生成swarm key文件
swarm key 在 IPFS Swarm 中扮演着重要的角色。Swarm 是 IPFS 网络中节点之间进行通信的组件,负责数据的传输和节点之间的协调。swarm.key 文件包含了用于加密和验证 Swarm 中通信的密钥,起到保障通信安全性的作用。
具体来说,swarm.key 的作用有以下几个方面:
-
身份验证: swarm.key 中的密钥用于验证节点之间的通信,确保通信是安全可信的。只有具有正确密钥的节点才能在 Swarm 中交换信息,防止未经授权的访问和潜在的安全风险。
-
加密通信: swarm.key 中包含的密钥用于加密在 Swarm 中传输的数据。这有助于防止中间人攻击和数据窃听,提高通信的机密性。
-
网络隔离: 使用 swarm.key 有助于隔离不同的 IPFS 网络。每个网络都可以拥有独特的 swarm.key,确保在不同网络之间的节点通信受到正确的密钥控制,从而实现网络隔离。
-
防止连接到不受信任的节点: swarm.key 可以确保节点只连接到具有相同密钥的其他受信任节点,防止节点误连接到不受信任或恶意节点,提高网络的安全性。
在私有化部署或需要网络隔离的情况下,可以定制生成 swarm.key,确保网络的安全性和合规性。
安装ipfs-swarm-key-gen,在任何有golang环境的机器上执行:
go install github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
生成swarm.key文件,在当前目录下执行
ipfs-swarm-key-gen > ./ipfs-init/swarm.key
swarm.key的内容大致如下:
/key/swarm/psk/1.0.0/
/base16/
2ef3be03d616aba1b6bccb4177c6c03168fcbcd17ab6e547d3dcbedf616fda54
基于docker配置
使用docker配置ipfs,本示例中需要配置几个文件:
- 环境变量.env: docker-compose环境变量文件
- docker-compose.yml: docker compose 配置文件
- 初始化脚本./ipfs-init/init.sh: ipfs容器初始化脚本
- 可视化界面webui.car: ipfs界面文件
环境变量
LIBP2P_FORCE_PNET=1
IPFS_SWARM_KEY="/key/swarm/psk/1.0.0/\n/base16/\n2ef3be03d616aba1b6bccb4177c6c03168fcbcd17ab6e547d3dcbedf616fda54"
IPFS_BOOTSTRAP=/ip4/192.168.1.152/tcp/4001/p2p/12D3KooWLGcT1EreBaB2UBDiwZRhhVAgrcR1YFtfDjzWKrx4RmYw
API_ALLOW_ORIGIN='["http://localhost:3000","http://127.0.0.1:5001","https://webui.ipfs.io"]'
API_ALLOW_METHOD='["PUT","POST"]'
KUBO_VERSION=latest
KUBO_SWARM_PORT=4002
KUBO_RPC_PORT=127.0.0.1:5002
KUBO_GATEWAY_PORT=9181
KUBO_INIT_SHELL=./ipfs-init/init.sh
CLUSTER_VERSION=latest
CLUSTER_SECRET=''
CLUSTER_PORT=9094
将swarm.key的内容复制并粘贴至.env文件中的IPFS_SWARM_KEY变量中。回车换行符用"\n"替换。
使用 LIBP2P_FORCE_PNET=1 的环境变量设置 ipfs 运行在私有网络模式中。
init.sh
初始化脚本init.sh中填充以下内容,初始化脚本删除了预设的bootstrap节点,并添加了本地的bootstrap节点。本地的bootstrap节点也没有特殊要求,就是一个正常的ipfs节点,当然也是开了私有网络模式。
如果不需要webui可以去掉ipfs dag import /data/ipfs-init/webui.car
这一行。
#!/bin/sh
set -ex
# ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin ${API_ALLOW_ORIGIN}
# ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods ${API_ALLOW_METHOD}
ipfs bootstrap rm all
ipfs bootstrap add ${IPFS_BOOTSTRAP}
ipfs dag import /data/ipfs-init/webui.car
docker-compose.yml
docker-compose配置文件,docker-compose.yml文件中填充以下内容:
version: '3.4'
services:
ipfs0:
container_name: ipfs0
image: ipfs/kubo:${KUBO_VERSION}
restart: always
ports:
- "${KUBO_SWARM_PORT}:4001"
- "${KUBO_RPC_PORT}:5001"
- "${KUBO_GATEWAY_PORT}:8080"
volumes:
- ./compose/ipfs0:/data/ipfs
- ${KUBO_INIT_SHELL}:/container-init.d/init.sh
- ./ipfs-init:/data/ipfs-init
environment:
# - IPFS_SWARM_KEY_FILE=/root/.ipfs/swarm.key
- "IPFS_SWARM_KEY=${IPFS_SWARM_KEY}"
- "LIBP2P_FORCE_PNET=${LIBP2P_FORCE_PNET}"
- "IPFS_BOOTSTRAP=${IPFS_BOOTSTRAP}"
- "API_ALLOW_ORIGIN=${API_ALLOW_ORIGIN}"
- "API_ALLOW_METHOD=${API_ALLOW_METHOD}"
cluster0:
container_name: cluster0
image: ipfs/ipfs-cluster:${CLUSTER_VERSION}
restart: always
depends_on:
- ipfs0
environment:
CLUSTER_PEERNAME: cluster0
CLUSTER_SECRET: ${CLUSTER_SECRET}
CLUSTER_IPFSHTTP_NODEMULTIADDRESS: /dns4/ipfs0/tcp/5001
CLUSTER_CRDT_TRUSTEDPEERS: '*'
CLUSTER_RESTAPI_HTTPLISTENMULTIADDRESS: /ip4/0.0.0.0/tcp/9094
CLUSTER_MONITORPINGINTERVAL: 2s
ports:
- "${CLUSTER_PORT}:9094"
volumes:
- ./compose/cluster0:/data/ipfs-cluster
获取webui.car并导入私有网络。
在公共网络中,ipfs节点的webui可以自动下载并打开。但是搭建私有节点时,直接访问http://127.0.0.1:5001/webui
将无法正常打开。需要手动将前端文件导出使用。
【注意】 在这个示例里,把webui.car
文件放置在ipfs-init目录中即可。
首先,开启一个临时的公网节点。在公网节点上下载webui的数据:
ipfs dag export bafybeiamycmd52xvg6k3nzr6z3n33de6a2teyhquhj4kspdtnvetnkrfim > webui.car
然后,将上面上面保存下来的文件导入私有网络节点中:
ipfs dag import webui.car
基于ipfs分布式的特性,这个webui.car文件只需要在一个节点中导入,其他所有连接到网络的节点都可以打开使用。
前面命令中的bafybeiamycmd52xvg6k3nzr6z3n33de6a2teyhquhj4kspdtnvetnkrfim
是webui对应的id。
可以在kubo的源码中查看webui.go
或者用curl访问:
curl http://127.0.0.1:5001/webui/
会看到:
<a href="/ipfs/bafybeiamycmd52xvg6k3nzr6z3n33de6a2teyhquhj4kspdtnvetnkrfim">Found</a>.
通过上述配置的完成,我们成功地实施了 IPFS 的私有化部署,现在已经可以开始充分利用该系统。这意味着我们的 IPFS 节点已经按照特定需求进行了定制,适应了我们内部网络的安全性和隐私要求。现在,可以放心地开始使用 IPFS,享受其分布式文件系统和去中心化数据存储的优势,同时保持对数据的控制和安全性。