Linux iptables防火墙开放端口指令 docker 容器动态添加端口

参考来源:https://www.cnblogs.com/luckyftt/p/7698085.html

例如:

# 开放一个端口 9080
$ iptables -A OUTPUT -p tcp --sport 9080 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 9080 -j ACCEPT
# 保存并重启
$ service iptables save && service iptables restart
# 查看是否添加
$ iptables -L -n

# 移除规则
$ iptables -L INPUT --line-numbers
$ iptables -D INPUT 11 (注意,这个11是行号,是iptables -L INPUT --line-numbers 所打印出来的行号)

docker容器动态加端口 【好像不行】

docker的端口映射本质上就是通过宿主机的IPtable控制网桥实现的。
例如有一个容器的8000端口映射到主机的9000端口,先查看iptabes设置了什么规则:

# 先查看iptabes设置了什么规则
iptables -t nat -vnL

输出结果:

Chain DOCKER (2 references)
pkts bytes target prot opt in     out     source        destination         
 98  5872 RETURN  all  --  docker0 *     0.0.0.0/0     0.0.0.0/0           
237 14316 DNAT    tcp  --  !docker0 *    0.0.0.0/0    0.0.0.0/0    tcp dpt:9000 to:172.17.0.3:8000

可以看出,docker创建一个名为DOCKER的链(Chain)来管理容器进出数据的NAT地址转换。
我们可以通过以下命令得到容器的ip地址

docker inspect [containerId] |grep IPAddress

以下是添加映射端口命令语法
例如我们要映射的容器ip地址为172.17.0.3,映射端口:8081(宿主机)>81(容器)
只需要在DOCKER链(chain)添加一条规则

iptables -t nat -A  DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.3:81

如果加错了或者想修改:

#先显示行号查看
sudo iptables -t nat -vnL DOCKER --line-number
#删除规则3
sudo iptables -t nat -D DOCKER 3

多个端口范围映射:
我们可能在容器里搭建某些需要开放一段大量范围端口的服务(如RTP实时流),此时就建议使用IPtable端口范围映射。

对于这种情况,通过IPtable命令映射,是对服务器最效率、最节约资源的方法,因为如果是通过DOCKER创建容器时映射多个端口的话,当创建好容器后,通过命令sudo iptables -t nat -vnL查看IPtable规则就会发现,创建容器的时候映射了多少个端口,docker服务就会在IPtable的DOCKER链里添加多少条规则。对于IPtable来说,每条规则都是一个线程,当映射的端口少还影响不大,如果是有很多端口(比如20000-30000),IPtable就会多出10001个线程,届时服务器的运行效率就会受到明显的影响。如果是用IPtable命令添加,只需要一条规则就可以搞定,这样就大大的节约了规则的数量,避免了这样的问题发生。

具体的命令和上面的示例区别也不大,下面同样也来个示例

例如我们要映射的容器ip地址为172.17.0.3,映射端口:20000-30000(宿主机)>20000-30000(容器)

同样在DOCKER链(chain)添加规则

iptables -t nat -A  DOCKER -p tcp --dport 20000-30000 -j DNAT --to-destination 172.17.0.3:20000-30000

ps:需要注意的是,由于IPtable内核机制,当匹配的端口在映射端口的区间内时,那么端口号不会被修改。如果匹配端口不在映射端口的区间内,则大多数情况下映射端口号为最小的端口号,即映射端口号是不可预测的。

举例: [20000-30000] 映射到[20000-30000]时会一 一映射
   [20000-30000] 映射到[30000-40000]结果不可预知,一般会映射到30000端口。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值