当前位置:
首页
文章
前端
详情

Centos7中使用iptables,docker容器中实例,外网端口无法访问

因微信小程序需要https的域名访问方式,阿里云无法通过IP和端口绑定域名,只能通过IP进行绑定,故如果不想直接使用443端口,就只能进行端口映射了。这里我使用iptables。

由于centos7默认是使用firewall作为防火墙,下面介绍如何将系统的防火墙设置为iptables。

#停止firewall 
systemctl stop firewall.service

#禁止firewall开机启动 
systemctl disable firewall.service

#安装iptables 
yum install iptables-services

#设置iptables防火墙为开机启动项 
systemctl enable iptables.service

#启动防火墙使配置文件生效 
systemctl start iptables.service

#停止防火墙 
systemctl stop iptables.service

#重启防火墙使配置文件生效  
systemctl restart iptables.service

修改/etc/sysconfig/iptables文件,注意备份!!!

# Completed on Wed Jul 11 16:11:57 2018
# Generated by iptables-save v1.4.21 on Wed Jul 11 16:11:57 2018
*nat
:PREROUTING ACCEPT [901:54060]
:INPUT ACCEPT [3:180]
:OUTPUT ACCEPT [10:760]
:POSTROUTING ACCEPT [14:1000]
:DOCKER - [0:0]

#端口映射
-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 10443

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 192.168.0.0/20 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 192.168.0.2/32 -d 192.168.0.2/32 -p tcp -m tcp --dport 6379 -j MASQUERADE
-A POSTROUTING -s 192.168.0.3/32 -d 192.168.0.3/32 -p tcp -m tcp --dport 9000 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 192.168.0.2:6379
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 192.168.0.3:9000
-A DOCKER -p tcp -m tcp --dport 9000 -j DNAT --to-destination 192.168.0.2:9000
-A DOCKER -p tcp -m tcp --dport 6379 -j DNAT --to-destination 192.168.0.3:6379

COMMIT
# Completed on Wed Jul 11 16:11:57 2018


# Generated by iptables-save v1.4.21 on Wed Jul 11 16:11:57 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17672:2225892]

:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

#端口映射
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9080 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A DOCKER -d 192.168.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 6379 -j ACCEPT
-A DOCKER -d 192.168.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9000 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

COMMIT

端口映射 将443映射10443:

在*nat中增加

-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 10443

在*filter中增加

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10443 -j ACCEPT

docker配置比较复杂,我的方法是iptables可能在安装重启后,自动一些配置,但终于无法正常访问。

我将iptables文件所有关于docker的配置,都删除干净,回想起来,就点不破不立的感觉:)

然后将docker服务重启,容器启动起来。

a, 获取容器ip
docker inspect $container_name | grep IPAddress
b. 添加转发规则(192.168.0.2为容器中实例的真实IP)
iptables -t nat -A DOCKER -p tcp --dport 9000 -j DNAT --to-destination 192.168.0.2:9000

这样,外网就可以正常访问容器的实例了。

但,还没有算完,需要将修改的配置保存。

service iptables save

~~~~~~~~~~~~~~~

do one thing, do it better

免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。