iptables
工作图
一、切换Centos7防火墙为iptables
#关闭firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
systemctl mask firewalld.service #移除firewall
#安装iptables
yum install -y iptables-services #安装iptables
vim /etc/sysconfig/iptables #编辑防火墙配置文件
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
#其他相关命令
systemctl disable iptables #禁止iptables服务
systemctl stop iptables #暂停服务
systemctl enable iptables #解除禁止iptables
systemctl start iptables #开启服务
二、docker 修改iptables的配置说明
#nat 链规则修改说明
# Generated by iptables-save v1.4.21 on Sun Mar 22 22:30:43 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [8:496]
:POSTROUTING ACCEPT [8:496]
:DOCKER - [0:0]
# 如果请求的目标地址是本机的地址, 那么将请求转到 DOCKER 链处理
#-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
# 如果请求的目标地址不匹配 127.0.0.0/8, 并且目标地址属于本机地址, 那么将请求跳转到 DOCKER 链处理
#-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
# 对于来自于 172.17.0.0/16 的请求, 目标地址不是 docker0 所在的网段的地址, POSTROUTING 链将会将该请求伪装成宿主机的请求转发到外网
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.20.0.0/16 ! -o br-cb8fb8f7ba15 -j MASQUERADE
#开放端口
#-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
# 由 docker0 设备传入的请求 DOCKER 链会返回上一层处理
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-cb8fb8f7ba15 -j RETURN
#-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
COMMIT
# Completed on Sun Mar 22 22:30:43 2020
# Generated by iptables-save v1.4.21 on Sun Mar 22 22:30:43 2020
#filter 链修改说明
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [201:28569]
# DOCKER 链
:DOCKER - [0:0]
# DOCKER-ISOLATION-STAGE-1 链
:DOCKER-ISOLATION-STAGE-1 - [0:0]
# DOCKER-ISOLATION-STAGE-2 链
:DOCKER-ISOLATION-STAGE-2 - [0:0]
# DOCKER-USER 链
: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 8080 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
# FORWARD 链的请求跳转到 DOCKER-USER 链处理
-A FORWARD -j DOCKER-USER
# FORWARD 链的请求跳转到 DOCKER-ISOLATION-STAGE-1 链处理
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
# FORWARD 链的请求如果目标是 docker0 所在的网段, 而且已经建立的连接或者和已建立连接相关那么接受请求
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# FORWARD 链请求目标是 docker0 所在的网段, 那么跳转到 DOCKER 链处理
-A FORWARD -o docker0 -j DOCKER
# FORWARD 链的请求来自于 docker0 所在网段, 而且目标网段不是 docker0 所在网段, 那么接收请求.
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
# FORWARD 链的请求来自于 docker0 所在网段, 而且目标网段也是 docker0 所在网段, 那么接收请求
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-cb8fb8f7ba15 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-cb8fb8f7ba15 -j DOCKER
-A FORWARD -i br-cb8fb8f7ba15 ! -o br-cb8fb8f7ba15 -j ACCEPT
-A FORWARD -i br-cb8fb8f7ba15 -o br-cb8fb8f7ba15 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
#-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
# DOCKER-ISOLATION-STAGE-1 链的请求如果来自 docker0 所在网段, 而且目标网段不属于 docker0 所在网段, 那么跳转到 DOCKER-ISOLATION-STAGE-2 处理
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-cb8fb8f7ba15 ! -o br-cb8fb8f7ba15 -j DOCKER-ISOLATION-STAGE-2
# DOCKER-ISOLATION-STAGE-1 链未处理的请求返回到上一层继续处理
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
# DOCKER-ISOLATION-STAGE-2 链的请求如果目标的网段为 docker0 所在网段则丢弃请求
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-cb8fb8f7ba15 -j DROP
# DOCKER-ISOLATION-STAGE-2 链未处理的请求返回到上一层继续处理
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
# DOCKER-USER 链未处理的请求返回到上一层继续处理
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Sun Mar 22 22:30:43 2020
后续新注意
后续新增只需要新增和
docker0
类似的规则即可
#nat 链修改说明
:DOCKER - [0:0]
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
#filter 链修改说明
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-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 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
常用命令
- 查看
iptables -L -n # 查看默认filter表规则详情
iptables -t filter -L -n --line-number| grep -C 10 INPUT
- 添加(所有操作目前只在内存里面,重启就丢失)
# -A 规则添加到末尾
iptables -t filter -A INPUT -p tcp --dprot 180 -j DROP
# -I 默认每次插到首行
iptables -t filter -I INPUT -p tcp --dport 800 -j DROP
# -I INPUT 8 也可以指定插到第几行
iptables -t filter -I INPUT -p tcp --dport 800 -j DROP
# -i 流量的入口 -s 源地址
iptables -t filter -A INPUT -i eth0 -s 10.0.0.104 -j DROP
# ! -s 排除某ip
iptables -t filter -A INPUT -p tcp -i eth0 ! -s 10.0.0.1 -j DROP
# 排除指定网段
iptables -t filter -A INPUT -i eth0 -p tcp ! -s 10.0.0.0/24 -j DROP
- 删除
iptables -F # 清空所有规则,但不包括默认规则
iptables -t filter -D INPUT -p tcp --dport 180 -j DROP
iptables -t filter -D INPUT
- 默认规则的配置(最后匹配)
iptables -P INPUT DROP
如果Docker
的容器不能访问外网
- 检查是否开启了
ip_forward
为0表示关闭了转发,为1代表开启转发
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
0
# 开启转发
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
# 或者编辑/proc/sys/net/ipv4/ip_forward文件,设置值为1