docker运行时插入新的规则,可能导致所有设备无法访问,重启docker可能解决这个问题
iptables是位于用户空间的防火墙管理工具,在实际工作中是在Linux内核中,利用内核中netfilter模块来进行,其中四表是用户记录和修改数据包中字段,五链主要是每个阶段对应的规则。这个工具在/sbin目录下,所以只能root用户才能操作。
iptables介绍
iptables在使用时必须要知道一个表所包含的链,才能够正确的在这个表中添加规则
四个表分别是filter、net、raw、mangle
四个表是由优先级的一个链的的表的优先级是raw、mangle、nat、filter
filter主要是进行数据包的过滤,包含input、output、forward链
nat主要是进行nat地址的转换,包含prerouting、postrouting、output链。。nat是必须在数据包连接的基础上使用的,如果raw选择不进行追踪,就会跳过nat表
mangle主要是修改服务类型,数据包的生存周期等值,包含全部的五链
raw主要是进行看这个数据包是否要进行追踪,只包含output、pereouting链
数据包跟踪是一种进行消耗CPU资源的为数据包添加状态的操作,他会在内存中建立一个哈希表进行存储,这个大小是有限的,当这个连接表溢出后会导致网络连接失败。不进行追踪也不会影响后面的过滤,但是会有高级功能需要这个追踪。如果要禁止数据包在raw中进行可以提高效率,例如禁止ping,在raw中禁止ping,可以节省进行追踪的CPU资源。指定raw比默认filter效率高
五链主要是input、output、forward、prerouting、postrouting五个链
input主要是收到本机IP的数据包
output主要是发出本机IP的数据包
forward主要是从本机中转的数据包
prerouting主要是在路由确定前的数据包
postrouting主要是路由确定后的数据包
如果说一个机器没有开启流量中转功能ip_forward,forward就没有事情,prerouting会一直活跃,如果说ip_forward没有开启,它会数据包丢弃
iptables使用
-t 加上要操作的表,如果没有使用,默认在filter表中添加规则
-A 加上-t指定的表中的链,如果后面的链不存在前面的表中会报错
-p 指定具体的协议,如果这个协议中又有不同的具体协议可以加上,例如
-p icmp --icmp-type echo-request-j 添加具体要进行的操作,ACCEPT同意,DROP拒绝,REJECT拒绝并给发送者提醒,LOG将这个记录的syslog中并匹配下一个,具体的表还有不同的操作
-s 添加源地址
-d 添加目的地址
--sport 添加源端口(可能需要和-p tcp/udp使用)
--dport 添加目的端口
-i/-d 添加网络接口
-D 删除规则
-I 在开头插入
--list 展示规则
-n 不解析域名
-v 看流量包数量
如果想要主机禁止别人ping自己可以在raw表PREROUTING链中禁止icmp,具体命令,大写是不能随意换成小写的
sudo iptables -t raw -A PREROUTING -p icmp --icmp-type echo-request -j DROP删除时直接将-A换成-D即可,比如删除raw中prerouting链中的第一行规则
sudo iptables -t raw -D PREROUTING 1后面删除的可以添加行号,也可以直接将原始的规则中A换成D,但是其他部分必须完全相同才能匹配。
-A直接换成-I就可以直接插入开头
查看并显示行号
sudo iptables -t raw -L -n -v --line-numbers清空表规则
sudo iptables -t filter -F更新规则第一行的规则
sudo iptables -R INPUT 1 -s 192.168.1.1 -j ACCEPT