今天架设了一个陌陌的安全合规平台Bombus,看看里面的东西,发现与我们的要做的合规有些比较相像。

docker的使用方法是 docker + docker-machine + docker-compose + virtualbox,docker-machine虚出一台vm,docker-compose使用yaml编排容器,启动容器,搞定。

在浏览器中访问URL: http://192.168.99.105:60010即可。

想发给同事看看,直接局域网暴露出来。但是无奈网络知识太差。只能踩坑去。

网络拓扑图如下:

compose docker 对外暴露多个端口 docker容器暴露端口_直接访问

10.53.179.27去访问系统,有以下两种方法:

方法一:NAT端口映射,这种方法是将容器的端口与10.53.179.24的端口进行映射,局域网的一台机器访问http://10.53.179.24:60010即可映射到192.168.99.105:60010。

可以直接在virtualbox可视化软件里面进行设置。

compose docker 对外暴露多个端口 docker容器暴露端口_node.js_02

点击ok后即可。可ssh到192.168.99.105的vm上去查看是否设置成功。

docker@bombus:~$ sudo iptables -i nat -L -n-t nat -L -n                                                                                                                                                  
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.20.0.0/16        0.0.0.0/0           
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.20.0.2           172.20.0.2           tcp dpt:6379
MASQUERADE  tcp  --  172.20.0.3           172.20.0.3           tcp dpt:40010
MASQUERADE  tcp  --  172.20.0.4           172.20.0.4           tcp dpt:27017
MASQUERADE  tcp  --  172.20.0.5           172.20.0.5           tcp dpt:30010
MASQUERADE  tcp  --  172.20.0.6           172.20.0.6           tcp dpt:60010

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:6379 to:172.20.0.2:6379
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:40010 to:172.20.0.3:40010
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:27017 to:172.20.0.4:27017
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:30010 to:172.20.0.5:30010
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:60010 to:172.20.0.6:60010

访问即可。这种方法真的非常的简单,效果也很好,但是可能某些微服务的设置可能要发生改变可能需要修改源码的配置或者其他,有点麻烦。

方法二:路由(route) + 转发(ip.forwarding)的方式,我们的目的是要实现10.53.179.27可以在浏览器中直接访问http://192.168.99.105:60010。那么必须要联通这里面的链路。首先需要在10.53.179.254路由器添加路由。但是一般公司里面网络工程师不会鸟你的。怎么办,有人说arp污染(arp spoof),那你牛逼~。

其实我们可以在10.53.179.27上面添加一个路由拓扑图上面有,意思是把访问192.168.0.0/16的流量去导向10.53.179.24的gw。这样179.24就收到了192.168.*.*的流量打过来。
10.53.179.24的机器上添加转发的功能,linux和mac差不多,这里用Mac的方式

$ sudo sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
# 验证一下是否修改成功
$ sudo sysctl -a | grep -i ip.forwarding
net.inet.ip.forwarding: 1

现在 ping 192.168.99.1就已经可以成功了。但是ping 192.168.99.105还是不通的。这个地方我耗费了很久一直不知道是怎么回事。这时,应该先看连通性179.24可以连接99.1,99.1肯定可以连接99.105。

后来在192.168.99.105上面安装tcpdump看看是否有流量打过来发现流量都过来了。那应该是流量返回的时候没有回去。需要去99.105上面去看一下。

docker@bombus:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
127.0.0.1       0.0.0.0         255.255.255.255 UH    0      0        0 lo
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.20.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-cb6c68ac71a8
192.168.99.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1

原来是因为采用NAT的模式下,虚拟机分配了192.168.99.0/24的IP域,所以没有考虑我们这种场景,只有10.0.2.2这个路由,我们自己加一个

docker@bombus:~$ sudo route add -net 10.53.179.0/24 gw 192.168.99.1

然后就ping通了

MacBook-Pro ~ % ping 192.168.99.105
PING 192.168.99.105 (192.168.99.105): 56 data bytes
64 bytes from 192.168.99.105: icmp_seq=0 ttl=63 time=33.172 ms
Request timeout for icmp_seq 1
64 bytes from 192.168.99.105: icmp_seq=1 ttl=63 time=1107.247 ms
64 bytes from 192.168.99.105: icmp_seq=2 ttl=63 time=105.924 ms
64 bytes from 192.168.99.105: icmp_seq=3 ttl=63 time=5.427 ms

开心了直接访问http://192.168.99.105:60010

Docker一般都是直接安装Docker-engine,然后启动docker进程,而docker + docker-machine + docker-compose + virtualbox的方式,更容易去做网络隔离,对物理环境侵入性降低。也不需要启动virtualbox软件。