将公共 IPv6 地址路由到你的 lxc/lxd 容器
大多数商业托管的 VPS / root 服务器具有公共 IPv6 前缀的大量可用 IPv6 地址,允许你将公共 IPv6 地址路由到服务器上运行的每个容器。本教程向你展示如何做到这一点,即使你之前没有路由经验,
步骤 0:创建你的 LXC 容器
我们假设你已经完成了此操作 - 仅供参考,以下是你如何创建容器:
lxc launch ubuntu:18.04 my-container步骤 1:你想为容器分配哪个 IP 地址?
首先你需要找出路由到你的主机的前缀。通常你可以通过在提供商的控制面板中检查来做到这一点。你要查找类似 2a01:4f9:c010:278::1/64 的内容。另一个选择是运行 sudo ifconfig
并在你的主网络接口部分查找 inet6 行(这仅在你在服务器上配置了 IPv6 地址时有效)。注意以 fe80:: 开头的地址和以 fd 开头的地址等不是公共 IPv6 地址。
然后你可以为容器定义新的 IPv6 地址。你选择哪个 - 只要它在前缀内 - 完全由你决定。
通常,<prefix>::1 用于主机本身,因此你可以例如选择 <prefix>::2。注意某些提供商将某些 IP 地址用于其他目的。详情请查看你的提供商文档。
如果你不想让别人容易找到容器的公共 IPv6,不要选择 <prefix>::1、<prefix>::2、<prefix>::3 等,而是选择更随机的内容如 <prefix>:af15:99b1:0b05:1,例如 2a01:4f9:c010:278:af15:99b1:0b05:0001。确保你的 IPv6 地址有 8 组每组 4 个十六进制数字!
在此示例中,我们选择 IPv6 地址 2a01:4f9:c010:278::8。
步骤 2:找出容器的 ULA
我们需要找到容器的 ULA(唯一本地地址 - 类似于不在互联网上路由的私有 IPv4 地址)。使用 lxc,这非常简单:
uli@myserver:~$ lxc list
+--------------+---------+-----------------------+-----------------------------------------------+
| NAME | STATE | IPV4 | IPV6 |
+--------------+---------+-----------------------+-----------------------------------------------+
| my-container | RUNNING | 10.144.118.232 (eth0) | fd42:830b:36dc:3691:216:3eff:fed1:9058 (eth0) |
+--------------+---------+-----------------------+-----------------------------------------------+你需要查看 IPv6 列并复制那里列出的地址。在此示例中,地址为 fd42:830b:36dc:3691:216:3eff:fed1:9058。
步骤 3:设置 IPv6 路由
现在我们可以告诉主机 Linux 将你选择的公共 IPv6 路由到容器的私有 IPv6。这非常简单:
sudo ip6tables -t nat -A PREROUTING -d <public IPv6> -j DNAT --to-destination <container private IPv6>在我们的示例中,这将是
sudo ip6tables -t nat -A PREROUTING -d 2a01:4f9:c010:278::8 -j DNAT --to-destination fd42:830b:36dc:3691:216:3eff:fed1:9058首先,通过在 shell 中运行来测试命令。如果它工作(即如果不打印任何错误消息),你可以永久存储它,例如通过将其添加到 /etc/rc.local(在 #!/bin/bash 之后,exit 0 之前)。高级用户应该优先将其添加到 /etc/network/interfaces。
步骤 4:使用 SSH 通过公共 IPv6 连接到容器(可选)
注意: 此步骤要求你的本地计算机有可用的 IPv6 连接。如果不确定,请在 ipv6-test.com 检查
首先,在你的容器上打开 shell:
lxc exec my-container bash运行此命令后,你应该在容器内看到 root shell 提示符:
root@my-container:~#以下命令应该在容器 shell 中输入,而不是主机!
现在我们可以创建要登录的用户(在此示例中,我们创建 uli 用户):
root@my-container:~# adduser uli
Adding user `uli' ...
Adding new group `uli' (1001) ...
Adding new user `uli' (1001) with group `uli' ...
Creating home directory `/home/uli' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for uli
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]你只需输入两次密码(输入时屏幕上不会显示任何内容),对于所有其他行你只需按回车。
此示例中使用的 ubuntu:18.04 lxc 镜像在其默认配置中不允许 SSH 密码认证。要修复此问题,在 /etc/ssh/sshd_config 中将 PasswordAuthentication no 更改为 PasswordAuthentication yes 并通过运行 service sshd restart 重启 SSH 服务器。在你这样做之前确保你了解安全影响!
现在,按 Ctrl+D 退出容器 shell。以下命令可以在你的桌面或任何其他具有 IPv6 连接的服务器上输入。
现在登录到你的服务器:
ssh <username>@<public IPv6 address>在此示例中:
ssh uli@2a01:4f9:c010:278::8如果你正确配置了一切,你将看到容器的 shell 提示符:
uli@my-container:~$注意: 不要忘记为容器配置防火墙,例如 ufw!你的容器的 IPv6 暴露在互联网上,仅假设没有人会猜到它不是好的安全实践。