使用iptables实现Docker网关路由及内网服务端口映射

总感觉使用Docker时坑坑洼洼的,有时不留神duang的一声就掉坑里了。Docker自带的网络用起来一直感觉不是太方便,比如启动一个需要访问容器内部端口的容器时只要用-v参数做端口映射,这时Docker会启用一个类似这样的进程来完成端口转发的功能:

docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.6 -container-port 5000

看似很美好,从外面可以访问容器内部端口。不过有两个问题需要解决:

1、如果由于某些特别的要求需要再新增加一个端口映射,怎么办。

2、此时容器内部是不能访问外网(公网),容器内的程序不能解析域名或者从公网获取数据等。

第1个问题,可以新建容器,在新建容器的时候映射多个端口。但是之前的容器还是只有一个端口映射,看似问题解决了,其实并没有解决。这2个问题都可以通过强大的iptables来解决,不用新建或重启容器只需要插入几条规则即可。

针对单台宿主机(多台宿主机集群不用考虑):

docker宿主机网卡eth1(外网)ip:222.7x.1xx.xx9/24,网关:222.7x.1xx.1

docker宿主机网卡eth0(内网)绑定到自定义的网桥br0,ip:10.0.1.10/24,网关:无

宿主机网卡配置文件如下:

[root@xxx-xx ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

BRIDGE=br0

HWADDR=00:0C:29:08:63:C5

[root@xxx-xx ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0

BOOTPROTO=static

ONBOOT=yes

TYPE=Bridge

IPADDR=10.0.1.10

NETMASK=255.255.255.0

[root@xxx-xx ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

BOOTPROTO=static

HWADDR=00:0C:29:08:63:CF

ONBOOT=yes

TYPE=Ethernet

IPADDR=222.7x.1xx.xx9

NETMASK=255.255.255.0

GATEWAY=222.7x.1xx.1

[root@h5-dev1 ~]#

重启网络服务,修改docker配置文件/etc/sysconfig/docker (centos6.6),让docker使用自定义网桥br0(也可以不用自定义的网桥,这里使用自定义网桥主要是为了和其它宿主机上的容器互通)。

other_args="-b br0"

#other_args=

网络环境基本就是这样的了,现在开始主题-修改iptables(采用脚本的方式,方便快捷)

#!/bin/bash

iptables -F

iptables -t nat -F

modprobe ip_conntrack_ftp

#### Below are the basal iptables config, normally need not be modified #######

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -p tcp --source-port 53 -j ACCEPT

iptables -A INPUT -p udp --source-port 53 -j ACCEPT

iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT

##### Below are the Appalication related iptables config #######

#设置内网路由转发到外网

iptables -t nat -I POSTROUTING -s 0/0 -j MASQUERADE

#端口映射,将内网服务映射到外网

iptables -t nat -I PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.1.2:80

iptables -t nat -I PREROUTING -p tcp --dport 873 -j DNAT --to 10.0.1.2:873

iptables -t nat -I PREROUTING -p tcp --dport 90022 -j DNAT --to 10.0.1.2:22

iptables -t nat -I PREROUTING -p tcp --dport 90023 -j DNAT --to 10.0.1.3:22

iptables -t nat -I PREROUTING -p tcp --dport 3306 -j DNAT --to 10.0.1.3:63306

iptables -A INPUT -j DROP

#iptables -A FORWARD -j DROP

执行这个设置iptables设置的脚本,容器内部就能访问外网的数据了,除了在创建容器的时候用-v参数做端口映射外,还可以在该脚本中增加新的端口映射。

K8S中文社区微信公众号
分享到:更多 ()

评论 抢沙发

评论前必须登录!