我有一台运行 Ubuntu 16.04 Server 的相当强大的机器。它运行着几个 docker 容器和虚拟机(使用 VirtualBox),以下称为 VM。目前,主机已分配一个 IP 地址(例如,192.168.1.10),并且 VM 上的服务通过 NATing 访问(例如 192.168.1.10:80 -> 172.17.0.2:80),这并不令人满意。
相反,我想将多个 IP 地址(例如,192.168.1.100-110)绑定到主机接口,并将到达其他 IP 地址的流量转发到 VM。这会导致映射<public IP> <--> <private IP>
。
我已经能够通过向 我的文件
[...] up ip addr add 192.168.1.1xx/24 dev ens3 label ens3:0 down ip addr del 192.168.1.1xx/24 dev ens3 label ens3:0 [...]
中添加条目来完成第一部分(其中显然是主机网络接口的名称)。这意味着额外的 IP 地址正在运行。/etc/network/interfaces
ens3
但第二部分让我头疼。到目前为止,我只考虑了iptables
基于的解决方案,因为它看起来最合适,而且到目前为止我读过的所有指南也都使用了它。
所以我所做的是通过添加到来激活 IPnet.ipv4.ip_forward=1
转发/etc/sysctl.conf
。
然后,我发出以下命令进行转发:
iptables -t nat -A POSTROUTING -d 172.17.0.2 -j SNAT --to-source 192.168.1.100 iptables -t nat -A PREROUTING -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2
172.17.0.2
是其中一个虚拟机的私有 IP。它在端口 8000 上运行 Web 服务器。telnet 172.17.0.2 8000
建立连接,告诉我 Web 服务器正在运行。但telnet 192.168.1.100 8000
不起作用。
几乎所有教程都iptables
涉及转发一个端口或一系列端口,但只有少数教程处理接口上的所有流量。
有人能发现我的错误吗?或者有人对完成工作的替代工具有好的建议吗?
答案1
您的 NAT 规则应该起作用:
iptables -t nat -A PREROUTING -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2
但是,如果您从同一台机器(本地)请求某些服务,则需要添加另一条规则:
iptables -t nat -A OUTPUT -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2
NAT 规则可以应用于特定协议的特定端口或所有协议和端口(如这里的情况)。
答案2
在 docker 方面,至少,您应该能够使用交换机来执行此操作--publish
,该交换机可以选择使用主机的 ip。
例如
docker run -p 192.168.1.105:80:80 -d image