VPN 服务器进入 systemd-nspawn 机器

VPN 服务器进入 systemd-nspawn 机器

我正在尝试将 VPN 服务器(我选择 Openswan 风格)部署到运行 Arch Linux 的树莓派上的 systemd-nspawn 容器中。现在我可以登录容器,ping,从容器内部出去(我设法在容器中引入互联网)。

这是我的容器的 systemd 配置文件。 (覆盖.conf)

[Service]
ExecStart=
ExecStart=/usr/bin/systemd-nspawn \
    --quiet --keep-unit --boot --link-journal=try-guest \
   -D /usr/lib/machines/%I \
    --machine=%I

编辑:我创建一个 openswan.nspawn 配置并在覆盖文件中重构该配置。

所以这个文件是这样的:

[alarm@alarmpi ~]$ sudo cat /etc/systemd/nspawn/openswan.nspawn 
[Exec]
Capability=CAP_NET_ADMIN CAP_NET_BIND_SERVICE

[Network]
Private=yes
VirtualEthernet=yes
Port=udp:500:500
Port=udp:4500:4500
Port=udp:1701:1701
Port=tcp:500:500
Port=tcp:4500:4500
Port=tcp:80:80

我的容器正确启动,并且与 openswan 相关的不同服务在容器内正确 spwan:

$ systemctl status [email protected][email protected] - Container openswan
   Loaded: loaded (/usr/lib/systemd/system/[email protected]; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/[email protected]
           └─override.conf
   Active: active (running) since lun 2016-07-04 11:36:55 CEST; 1 day 1h ago
     Docs: man:systemd-nspawn(1)
 Main PID: 15805 (systemd-nspawn)
   Status: "Container running."
   CGroup: /machine.slice/[email protected]
           ├─15805 /usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --private-network --network-veth --capability=CAP_NET_ADMIN --mach
           ├─init.scope
           │ └─15810 /usr/lib/systemd/...
           └─system.slice
             ├─console-getty.service
             │ └─15853 /sbin/agetty --no...
             ├─dbus.service
             │ └─15838 /usr/bin/dbus-dae...
             ├─openswan.service
             │ ├─18417 /bin/sh /usr/lib/...
             │ ├─18418 logger -s -p daem...
             │ ├─18419 /bin/sh /usr/lib/...
             │ ├─18420 /bin/sh /usr/lib/...
             │ ├─18423 /usr/lib/openswan...
             │ ├─18425 _pluto_adns -- <i...
             │ └─18426 /usr/lib/openswan...
             ├─systemd-journald.service
             │ └─15824 /usr/lib/systemd/...
             ├─systemd-logind.service
             │ └─15837 /usr/lib/systemd/...
             ├─systemd-networkd.service
             │ └─15839 /usr/lib/systemd/...
             ├─systemd-resolved.service
             │ └─15848 /usr/lib/systemd/...
             └─xl2tpd.service
               └─15844 /usr/bin/xl2tpd -D

我使用 --network-veth 设置容器。

我现在的问题是,如何真正在 docker 中“发布”这些端口(udp 500/4500/1701)并让它们从容器外部可用?

喜欢:

公路战士 --> 云 --> Arch pi --> systemd-nspawn 容器 -->

我知道使用 iptables 转发流量是微不足道的,但这不是我想要的。

我可能需要桥接设置?

编辑:使用“Port”指令,我现在可以在容器内转发流量,太棒了! :D

我现在面临的唯一问题是 pluto 在处理安全关联(ISAKMP)时崩溃并显示以下消息:

“L2TP-PSK-NAT”[1] 178.50.79.197 #1:在 /build/openswan/src/openswan-2.6.47/programs/pluto/keys.c:488“L2TP-PSK-NAT”[1] 处中止178.50.79.197 #1:在 /build/openswan/src/openswan-2.6.47/programs/pluto/keys.c:488 处中止

如果它给某人敲响了警钟,请告诉我。有时间我会看一下代码。

待续..

答案1

您可以将容器的端口映射到主机接口。如果您使用 .nspawn 文件来定义容器属性,则可以使用网络部分。

[Network]
## use a networkd bridge for your containers, this name hints the ip range
Bridge=10.50.0.x
## this will map your tcp port 1701
Port=tcp:1701:1701

这确实映射,例如“发布”您的端口。确保防火墙不会阻止这些端口与外部流量的连接,应该没问题。

相关内容