你好。我使用 ubuntu 18,想通过 ssh 连接到我的容器。这是我的容器
cont | RUNNING | 10.78.195.190 (eth0) | fd42:4be2:f986:212a:216:3eff:fee4:582 (eth0) | PERSISTENT | 0 |
这是主 ip 123.123.123.123
这是规则
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -j DNAT --to-destination 10.78.195.190:22
/# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:23 to:10.78.195.190:22
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.78.195.0/24 !10.78.195.0/24 /* generated for LXD network lxdbr0 */
/# ifconfig
enp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.49 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::b62e:99ff:fec2:6c20 prefixlen 64 scopeid 0x20<link>
ether b4:2e:99:c2:6c:20 txqueuelen 1000 (Ethernet)
RX packets 7110 bytes 963405 (963.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3102 bytes 585809 (585.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 138 bytes 11996 (11.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 138 bytes 11996 (11.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lxdbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.78.195.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fd42:4be2:f986:212a::1 prefixlen 64 scopeid 0x0<global>
inet6 fe80::781c:22ff:fecf:a246 prefixlen 64 scopeid 0x20<link>
ether fe:1d:37:ad:03:47 txqueuelen 1000 (Ethernet)
RX packets 93 bytes 9937 (9.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 138 bytes 16179 (16.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethQLQTSD: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc26:27ff:fea1:806a prefixlen 64 scopeid 0x20<link>
ether fe:26:27:a1:80:6a txqueuelen 1000 (Ethernet)
RX packets 30 bytes 2946 (2.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 60 bytes 6593 (6.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethTE803A: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc1d:37ff:fead:347 prefixlen 64 scopeid 0x20<link>
ether fe:1d:37:ad:03:47 txqueuelen 1000 (Ethernet)
RX packets 63 bytes 8293 (8.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 81 bytes 9622 (9.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果我从主系统使用 ssh ,我可以进入容器。但从另一个系统无法进入,连接超时。我的问题是什么?谢谢!ssh [email protected]
ssh [email protected] -p 23
答案1
iptables
我建议不要使用LXD 代理设备. 这样的代理设备会将指向指定 IP 地址的主机的传入连接转发到容器的正确 IP 地址。
对于您的情况,创建代理设备的命令如下。
lxc config device add mycontainer myport2222 proxy listen=tcp:0.0.0.0:2222 connect=tcp:127.0.0.1:22
我们创造了
- 容器的代理设备我的容器
- 名字myport2222
- 它是一个代理人设备
- 它在端口上监听主机上的所有接口(0.0.0.0)2222,但如果您愿意,可以配置监听特定的接口。
- 然后它连接到环回接口上的容器的端口 22(不需要放置容器的私有 IP 地址,因为 LXD 已经知道它了)。
我注意到您使用端口23。此端口通常用于 Telnet 协议,并且可能被某些 ISP 阻止。
答案2
我的解决方案是在传入用户的 .ssh/authorized_keys 文件中配置一个命令,该文件充当进入 LXD 容器的网关。这意味着您不需要任何网络即可让跳转服务器工作。当您通过 ssh 进入只有 lo 设备的 Linux 机器时,这是一个相当安全的功能。
我创建了一个 GitHub 存储库,其中详细介绍了设置并包含我使用的网关脚本。