LXC,端口转发和iptables

我有一个主机上运行的LXC容器( 10.0.3.2 )。 服务在端口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 

我觉得我在这里错过了一些愚蠢的东西。 我应该检查什么东西? debugging这些情况的好策略是什么?

为了完整iptables是在主机上设置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 

似乎您在10.0.3.1上阻塞了7002端口,因为您的默认策略是DROP

尝试将其添加到INPUT规则:

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

我遇到了同样的问题。 我还没有find解决办法,但下面我注意到一些意见。

我有一个主机${host}机器(Ubuntu 12.04),它通过LXC运行一个访客机器。 来宾在IP 10.0.3.248和网关是10.0.3.1 。 我在guest虚拟机中运行Web服务器,并希望将stream量从${host}:8888端口转换为10.0.3.248:80 。 以下是相关的iptables条目:

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

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

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

一个相关的post:

  • iptables将本地连接redirect到远程系统/端口

我需要添加一个FORWARD规则

 iptables -A FORWARD -p tcp -d 10.0.3.2 --dport 7002 -j ACCEPT 

您的容器可通过主机桥接口从局域网访问,从而连接到与主机相同的子网。

您需要让您的路由器将这些端口转发到您的容器。