此页面的内容适用于:

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

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

  • Fedora Workstation
  • openSUSE Leap / Tumbleweed
  • CentOS Stream

1. 安装 Podman

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

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

2. 配置

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

2.1. Rootful 模式

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

2.1.1. 下载容器镜像

直接下载镜像:

1
2
sudo podman pull \
docker.io/mzz2017/v2raya

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

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

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

2.1.2. 配置 iptables 自动加载

1
2
3
4
5
6
7
8
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

2.1.3. 创建 SELinux 规则

如果你的发行版不使用 SELinux,可以跳过这一节。

跳转:创建容器

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

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

创建规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

加载这个规则:

1
sudo semodule -i my_v2raya_container.cil

2.1.4. 创建容器

1
2
3
4
5
6
7
8
9
10
11
12
13
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 中。

2.1.5. 创建服务

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

2.1.6. 开启容器自动更新

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

2.1.7. 开启 v2rayA 服务

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

查看服务状态:

1
systemctl status container-v2raya.service

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

1
sudo systemctl enable --now container-v2raya.service

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

2.1.8. 移除容器

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

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

1
sudo rm -r /etc/v2raya

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

1
sudo podman image rm docker.io/mzz2017/v2raya

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

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

2.2. Rootless 模式

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

2.2.1. 下载容器镜像

直接下载镜像:

1
2
podman pull \
docker.io/mzz2017/v2raya

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

1
2
3
4
5
env \
HTTP_PROXY=http://<Address>:<Port> \
HTTPS_PROXY=http://<Address>:<Port> \
podman pull \
docker.io/mzz2017/v2raya

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

2.2.2. 创建容器

1
2
3
4
5
6
7
8
9
10
11
12
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 中。

2.2.3. 创建服务

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

2.2.4. 开启容器自动更新

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

2.2.5. 开启 v2rayA 服务

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

查看服务状态:

1
systemctl --user status container-v2raya.service

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

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

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

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

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

1
loginctl enable-linger

2.2.6. 移除容器

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

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

1
rm -r ~/.config/v2raya

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

1
podman image rm docker.io/mzz2017/v2raya

关闭linger:

1
loginctl disable-linger

3. v2rayA 使用方法

安装并成功启动v2rayA服务后,可以使用浏览器直接访问 http://127.0.0.1:2017 v2rayA管理页面, 具体使用方法可以访问 v2rayA 基本使用方法