SSH 连接到家庭网络,无需端口转发

SSH 连接到家庭网络,无需端口转发

我希望将几个 Raspberry Pi 放入一些家庭网络中,同时能够从远程客户端通过 SSH 访问它们,而无需任何端口转发。

客户端不固定,因此任何客户端都应该能够连接到任何 Raspberry Pi。

我目前的想法是,让每个 RPI 打开一个到具有已知 IP 的中央服务器的反向 SSH 连接,允许客户端连接到 C&C 服务器,然后该服务器将以某种方式将连接转发到其中一个 RPI(可能由哪个 RPI 选择)客户端连接到 C&C 服务器的端口)

到目前为止,我知道我必须将 RPI 的端口 22 提供给 C&C 服务器,如下所示:

按 RPI 运行: ssh -R 127.0.0.1:2222:127.0.0.1:22 user@[c&c ip]

现在,C&C 理论上可以连接到其本地 2222 端口以到达 Raspi 之一,但到目前为止,我还缺少从外部通过 C&C 连接到 RPI 之一的能力。

编辑:找到解决方案: 在 C&C 服务器上,编辑 /etc/ssh/sshd_config 并设置gatewayportsyes.

您现在可以连接到 C&C 服务器的端口 2222 以达到 RPI。

草图

答案1

没有任何端口转发。

但你正在做的是端口转发(通过 SSH 隧道)!

因此,如果您想实现这一目标,看起来很直观,不要在服务器上为每个 RPi 分配自己的端口(这很快就会令人困惑),而是拥有一个内部网络,其中每个客户端和每个 RPi 都有一个静态 IP 地址,并且通过公共 IP 网络建立此专用网络的隧道。一个VPN!

那么您的客户端和树莓派之间就没有真正的区别:它们都只是 VPN 中的机器,没有静态公共地址。

如今设置起来非常简单:只需在所有涉及的机器上安装wireguard工具,在每台机器上创建公钥/私钥对(wg genkey | tee private_key | wg public_key)。
给每个客户端和RP一个配置文件,内容如下

[Interface]
PrivateKey = {Private key as generated on this machine}

# Pick an different individual address for each machine from the
# networks described below as allowed:
Address = 10.0.123.101, fd42:42:42:0:0101::
#                  ^^^               ^^^^^^
# Parts of the addresses to modify; I just randomly chose to 
# give 10.0.123.101 – 10.0.123.199 to your RPis, and 
# give 10.0.123.201 – 10.0.123.254 to your clients

DNS = {IP address of the DNS resolver to use}


[Peer]
PublicKey = {The public key from the server}
Endpoint = {The public IP address of the server}:{Port on the server}

# Allow addresses from the private networks:
#  IPv4: 10.0.123.0
#through 10.0.123.255
#
#  IPv6: fd00:1111:2222:1:0000:0000:0000:0000 
#through fd00:1111:2222:1:ffff:ffff:ffff:ffff
AllowedIPs = 10.0.123.0/24,fd00:1111:2222:1::1/64

并且,在服务器上几乎相同,但将所有客户端计算机列为Peers:

[Interface]
PrivateKey = {Private key as generated on this machine (the server)}
Address = 10.0.123.0, fd42:42:42:0::
DNS = {IP address of the DNS resolver to use}

[Peer]
PublicKey = {The public key from the 1. RPi}
AllowedIPs = 10.0.123.101/32, fd42:42:42:0:0101::/128


[Peer]
PublicKey = {The public key from the 2. RPi}
AllowedIPs = 10.0.123.102/32, fd42:42:42:0:0102::/128
# all the other RPis…

# … and all of the "clients":
[Peer]
PublicKey = {The public key from the 1. client}
AllowedIPs = 10.0.123.201/32, fd42:42:42:0:0201::/128
[Peer]
PublicKey = {The public key from the 2. client}
AllowedIPs = 10.0.123.202/32, fd42:42:42:0:0202::/128
# …

确实如此(将这些配置文件保存在 中/etc/wireguard/,例如 as wgvpn0.conf;使用 启用它们systemctl enable --now wg-quick@wgvpn0);您现在可以使用 . 从客户端连接到第一个 RPi(110.0.123.101 或 fd42:42:42:0:0101::,具体取决于您是要使用 IPv4 还是 v6)ssh 110.0.123.101

相关内容