通过 ssh 为 lxd 容器设置 iptables 规则

通过 ssh 为 lxd 容器设置 iptables 规则

你好。我使用 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

我们创造了

  1. 容器的代理设备我的容器
  2. 名字myport2222
  3. 它是一个代理人设备
  4. 它在端口上监听主机上的所有接口(0.0.0.0)2222,但如果您愿意,可以配置监听特定的接口。
  5. 然后它连接到环回接口上的容器的端口 22(不需要放置容器的私有 IP 地址,因为 LXD 已经知道它了)。

我注意到您使用端口23。此端口通常用于 Telnet 协议,并且可能被某些 ISP 阻止。

答案2

我的解决方案是在传入用户的 .ssh/authorized_keys 文件中配置一个命令,该文件充当进入 LXD 容器的网关。这意味着您不需要任何网络即可让跳转服务器工作。当您通过 ssh 进入只有 lo 设备的 Linux 机器时,这是一个相当安全的功能。

我创建了一个 GitHub 存储库,其中详细介绍了设置并包含我使用的网关脚本。

https://github.com/Dweller/lxd-ssh-gateway

相关内容