Podman

确认你的发行版使用 systemd,如果使用其它 init 系统则需要你手动配置开机自动启动。

此页面的内容适用于:

  • Fedora Silverblue / Kinoite
  • SLE Micro / openSUSE Leap Micro
  • openSUSE MicroOS

但同时也适用于普通发行版,如:

  • Fedora Workstation
  • openSUSE Leap / Tumbleweed
  • CentOS Stream

安装 Podman

Podman 已经在一部分发行版中预装了。若你的发行版没有预装Podman,请参考具体安装步骤:

https://podman.io/getting-started/installation.html#installing-on-linux

配置

你可以使用rootful模式 或者rootless模式

Rootful 模式

如果你想使用透明代理、路由转发等功能,则需要使用 rootful 模式。

下载容器镜像

直接下载镜像:

sudo podman pull \
    docker.io/mzz2017/v2raya

如果你的设备无法直接访问到 Docker Hub,可以使用现有的 HTTP 代理下载镜像:

sudo env \
HTTP_PROXY=http://<Address>:<Port> \
HTTPS_PROXY=http://<Address>:<Port> \
  podman pull \
    docker.io/mzz2017/v2raya

你也可以使用 sudo podman image import 导入其它来源提供的v2rayA容器镜像。

配置 iptables 自动加载

sudo mkdir /etc/modules-load.d
cat << 'EOF' | sudo tee /etc/modules-load.d/ip_tables.conf >> /dev/null 2>&1
ip_tables
ip6_tables
iptable_mangle
ip6table_mangle
EOF
sudo modprobe ip_tables ip6_tables iptable_mangle ip6table_mangle

创建 SELinux 规则

如果你的发行版不使用 SELinux,可以跳过这一节。
跳转:创建容器

SELinux 会拦截一部分 v2rayA 的行为,导致透明代理不能正常使用。

安全警告:请确保当前工作目录不会被任何其它低权限用户程序写入。

创建规则:

cat << 'EOF' | tee my_v2raya_container.cil >> /dev/null 2>&1
(block v2raya_container
  (type process)
  (type socket)
  (roletype system_r process)
  (typeattributeset domain ( process ))
  (typeattributeset container_domain ( process ))
  (typeattributeset svirt_sandbox_domain ( process ))
  (typeattributeset mcs_constrained_type ( process ))
  (typeattributeset file_type ( socket ))
  (allow process socket ( sock_file ( create open getattr setattr read write rename link unlink ioctl lock append )))
  (allow process proc_type ( file ( getattr open read )))
  (allow process cpu_online_t ( file ( getattr open read )))
  (allow container_runtime_t process ( key ( create link read search setattr view write )))
  (allow process kernel_t ( system ( module_request )))
  (allow process dns_port_t ( udp_socket ( name_bind )))
  (allow process ephemeral_port_t ( tcp_socket ( name_connect )))
  (allow process http_port_t ( tcp_socket ( name_connect )))
  (allow process node_t ( tcp_socket ( node_bind )))
  (allow process node_t ( udp_socket ( node_bind )))
  (allow process ntp_port_t ( udp_socket ( name_bind )))
  (allow process reserved_port_t ( udp_socket (name_bind )))
  (allow process self ( netlink_route_socket ( nlmsg_write )))
  (allow process self ( tcp_socket ( listen )))
  (allow process unreserved_port_t ( tcp_socket ( name_bind name_connect )))
  (allow process unreserved_port_t ( udp_socket ( name_bind )))
)
EOF

加载这个规则:

sudo semodule -i my_v2raya_container.cil

创建容器

sudo mkdir -p /etc/v2raya
sudo podman create -it \
  --name v2raya \
  --restart=always \
  --label io.containers.autoupdate=registry \
  --cgroup-parent=machine-v2raya.slice \
  --security-opt no-new-privileges \
  --security-opt label=type:v2raya_container.process \
  --cap-drop all --cap-add cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw \
  --network=host \
  --memory=500M \
  --volume /etc/v2raya:/etc/v2raya:z \
  docker.io/mzz2017/v2raya

配置文件保存在 /etc/v2raya 中。

创建服务

bash -c \
  "sudo mkdir -p /etc/systemd/system \
  && cd /etc/systemd/system \
  && sudo podman generate systemd --new --files --name v2raya \
  && sudo systemctl daemon-reload"

开启容器自动更新

sudo systemctl enable --now podman-auto-update.timer

开启 v2rayA 服务

现在你可以用systemd控制v2rayA服务了。

查看服务状态:

systemctl status container-v2raya.service

设置开机自启动,并且现在开始运行:

sudo systemctl enable --now container-v2raya.service

打开浏览器,访问http://localhost:2017

移除容器

sudo systemctl disable --now container-v2raya.service
sudo rm /etc/systemd/system/container-v2raya.service
sudo systemctl daemon-reload

你也可以选择删除v2rayA的配置文件:

sudo rm -r /etc/v2raya

如果您不再想使用v2rayA,移除v2rayA镜像:

sudo podman image rm docker.io/mzz2017/v2raya

以及移除SELinux规则 / iptables自动加载:

sudo semodule -r my_v2raya_container
sudo rm /etc/modules-load.d/ip_tables.conf

Rootless 模式

如果你只需要一个 SOCKS5/HTTP 代理端口,则可以让容器运行于普通用户权限,进一步降低风险。

下载容器镜像

直接下载镜像:

podman pull \
    docker.io/mzz2017/v2raya

如果你的设备无法直接访问到 Docker Hub,可以使用现有的HTTP代理下载镜像:

env \
HTTP_PROXY=http://<Address>:<Port> \
HTTPS_PROXY=http://<Address>:<Port> \
  podman pull \
    docker.io/mzz2017/v2raya

你也可以使用 podman image import 导入其它来源提供的v2rayA容器镜像。

创建容器

mkdir -p ~/.config/v2raya
podman create -it \
  --name v2raya \
  --restart=always \
  --label io.containers.autoupdate=registry \
  --cgroup-parent=v2raya.slice \
  --security-opt no-new-privileges \
  --cap-drop all \
  --network host \
  --memory=500M \
  --volume ~/.config/v2raya:/etc/v2raya:z \
  docker.io/mzz2017/v2raya

--cgroup-parent 使用 systemd slice 依赖内核启动参数 systemd.unified_cgroup_hierarchy=1。 若出现 systemd slice received as cgroup parent when using cgroupfs 错误,请手动添加对应的启动参数。

配置文件保存在 ~/.config/v2raya 中。

创建服务

bash -c \
  "mkdir -p ~/.config/systemd/user \
  && cd ~/.config/systemd/user \
  && podman generate systemd --new --files --name v2raya \
  && systemctl --user daemon-reload"

开启容器自动更新

systemctl --user enable --now podman-auto-update.timer

开启 v2rayA 服务

现在你可以用systemd控制v2rayA服务了。

查看服务状态:

systemctl --user status container-v2raya.service

设置开机自启动,并且现在开始运行:

systemctl --user enable --now container-v2raya.service

打开浏览器,访问http://localhost:2017

然后你可以在系统设置中使用代理: http://localhost:20171

v2rayA服务会跟随用户会话一起启动/停止。如果你想让v2rayA随系统启动,并且在用户会话结束后保持运行,使用以下命令:

loginctl enable-linger

移除容器

systemctl --user disable --now container-v2raya.service
rm ~/.config/systemd/user/container-v2raya.service
systemctl --user daemon-reload

你也可以选择删除v2rayA的配置文件:

rm -r ~/.config/v2raya

如果您不再想使用v2rayA,移除v2rayA镜像:

podman image rm docker.io/mzz2017/v2raya

关闭linger:

loginctl disable-linger

在 Github 上编辑此页

最后更新于: 2023年04月16日 09:27:52 UTC

贡献者: tzfljuv