参考来源: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端口。