LXC、端口转发和 iptables

LXC、端口转发和 iptables

10.0.3.2我在主机上运行了一个 LXC 容器 ( )。容器内部的端口 上运行着一项服务7000

从主机(10.0.3.1lxcbr0),我可以访问该服务:

$ telnet 10.0.3.2 7000
Trying 10.0.3.2...
Connected to 10.0.3.2.
Escape character is '^]'.

我希望让容器内运行的服务可以被外界访问。因此,我想将7002主机上的端口转发到7000容器上的端口:

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000

其结果是(iptables -t nat -L):

DNAT   tcp  --  anywhere     anywhere     tcp dpt:afs3-prserver to:10.0.3.2:7000

但是,我无法使用转发端口从主机访问该服务:

$ telnet 10.0.3.1 7002
Trying 10.0.3.1...
telnet: Unable to connect to remote host: Connection refused

我感觉我在这里忽略了一些愚蠢的事情。我应该检查什么?调试这些情况的好策略是什么?

为了完整起见,以下是iptables在主机上设置的方法:

iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X

iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o lxcbr0 -j MASQUERADE

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000

答案1

似乎你已经阻止了 10.0.3.1 上的 7002 端口,因为你的默认策略是 DROP

尝试将其添加到 INPUT 规则:

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT

答案2

我遇到了同样的问题。我还没有找到解决方案,但下面我记下了一些观察结果。

我有一台主机${host}(Ubuntu 12.04),它通过 LXC 运行一台客户机。客户机已开启IP 10.0.3.248,网关为10.0.3.1。我在客户机中运行 Web 服务器,并希望将流量从端口转发${host}:888810.0.3.248:80。以下是相关的 iptables 条目:

-A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 10.0.3.248:80
-A POSTROUTING -j MASQUERADE

使用当前配置,我可以从另一台物理机成功访问 10.0.3.248:80 上的 Web 服务器。但是,当我尝试从 访问 10.0.3.248:80 时失败${host}。也许您可以尝试从另一台机器访问 LXC 内的该服务。

我的理解是,当我从 访问时${host},数据包会通过环回接口并直接进入 INPUT 链。尽管我允许 INPUT 上的所有内容,但没有服务在 监听${host}:8888。从 wireshark 中,我看到 RST 已发送并接收。当我从另一台物理机器访问时,数据包进入 PREROUTING 链并按预期进行 DNAT。

一个相关的帖子:

答案3

按照以下教程微软帮我完成了工作。我认为对于大多数用户来说,使用命令会更容易lxc。简短的摘要,假设您的容器名称为container1,并且您正在从主机转发7002到容器的7000

$ lxc profile create proxy-80
$ lxc profile device add proxy-80 hostport80 proxy \
 connect="tcp:127.0.0.1:7000" listen="tcp:0.0.0.0:7002"
$ lxc profile add container1 proxy-80

检查它是否正确应用于您的容器:

$ lxc config show container1 -e

答案4

好的,这是我 2018 年的看法:

我确实安装了 LXC 并试用了一下。我的容器 IP 是10.0.0.10

我添加了这条规则:

iptables -t nat -A PREROUTING -p tcp -i ens192 --dport 81 -j DNAT --to-destination 10.0.0.10:22

它不起作用。然后我意识到,即使 FORWARD 策略是 ACCEPT,也有一条规则会阻止所有 FORWARD。

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            10.0.0.0/24          ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  virbr0 *       10.0.0.0/24          0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    5   268 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

所以我必须在顶部注入规则:

iptables -I FORWARD -p tcp -d 10.0.0.10 --dport 22 -j ACCEPT

现在前进host:81->10.0.0.10:22工作。

相关内容