10.0.3.2
我在主机上运行了一个 LXC 容器 ( )。容器内部的端口 上运行着一项服务7000
。
从主机(10.0.3.1
,lxcbr0
),我可以访问该服务:
$ 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}: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
使用当前配置,我可以从另一台物理机成功访问 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
工作。