我有一台非常强大的机器,运行Ubuntu 16.04服务器。 它运行了几个docker集装箱和虚拟机(使用VirtualBox),以下简称VM。 目前主机已经分配了一个IP地址(比如说192.168.1.10),通过NATing访问虚拟机上的业务(如192.168.1.10:80 – > 172.17.0.2:80),这是不尽人意的。
相反,我想将多个IP地址(比如192.168.1.100-110)绑定到主机接口,并将其他IP地址的stream量转发给虚拟机。 这导致映射<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 [...] /etc/network/interfaces文件(其中ens3明显是主机networking接口的名称)。 这意味着额外的IP地址正在运行。
但是第二部分让我头痛。 到目前为止,我只考虑过基于iptables的解决scheme,因为看起来最合适,而且我读过的所有指南都使用了它。
所以我所做的是通过在/etc/sysctl.conf添加net.ipv4.ip_forward=1来激活IP转发。
然后,我发出以下命令来执行转发: 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 8000build立一个连接,告诉我web服务器正在运行。 但telnet 192.168.1.100 8000不起作用。
几乎所有关于iptables教程都涉及转发一个端口或一系列端口,但只有less数几个端口处理所有stream量。
有谁能发现我的错误? 还是有没有人有好的build议替代工具,完成工作?
你的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规则可以应用于特定协议的特定端口或所有协议和端口(如此处所示)。
在docker方面,至less,你应该可以通过--publish开关来做到这一点,作为一个选项,可以select主机的IP地址。
例如
docker run -p 192.168.1.105:80:80 -d image