iptables
注意
在参照本文进行iptables实验时,请务必在个人的测试机上进行。
# 简介
Linux 系统自带的防火墙工具 iptables
iptables 默认维护着 4 个表和 5 个链。
四表是指 iptables 的功能,默认的 iptables 规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)
五链是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤)
# 查看规则
# 查看指定表中的规则
查看 filter 表的所有规则
iptables -t filter -nvL
# 查看指定表中的指定链上的规则
查看 filter 表的 INPUT 链的规则
iptables --line-numbers -t filter -nvL INPUT
# 1.参数说明
- --line-numbers 表示显示规则的编号。
- -t 指定要操作的表,默认操作 filter 表,如果要操作 nat 表,可以使用 -t nat 参数。
- -n 表示不对IP地址进行名称反解,直接显示IP地址,显示速度会加快。
- -v 表示输出详细信息,包含通过该规则的数据包数量、总字节数以及相应的网络接口。
- -L 表示查看当前表的所有规则。
# 增加规则
# 常用的处理动作
- ACCEPT:允许数据包通过。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
- DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
# 不指定IP
# 开放某个端口
允许所有ip访问80端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# 开放多个端口
允许所有ip访问80,443和1024以上的端口
iptables -I INPUT -p tcp -m multiport --dport 80,443,1024:65535 -j ACCEPT
# 指定某个IP(白名单或黑名单)
# 允许 指定的ip访问服务器的所有端口
iptables -I INPUT -s 1.12.219.198 -j ACCEPT
# 允许 指定的IP访问服务器的指定端口
iptables -I INPUT -s 1.12.219.198 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -s 1.12.219.198 -p tcp --dport 3306 -j ACCEPT
# 指定多个IP(白名单或黑名单)
# 拒绝 指定的多个IP访问服务器的所有端口
iptables -I INPUT -s 10.0.8.3,1.12.219.198 -j REJECT
注意:多个IP之间必须用逗号相连,逗号两侧均不能包含空格
# 拒绝 指定的IP段访问服务器的指定端口
iptables -I INPUT -s 172.26.0.0/16 -p tcp --dport 21 -j REJECT
172.0.0.0/8#封整个IP段即从172.0.0.1到172.255.255.254172.26.0.0/16#封部分IP段即从172.26.0.1到172.26.255.254172.26.4.0/24#封部分IP段即从172.26.4.1到172.26.4.254
# 2.参数说明
- -I:表示在链的首部插入规则
- -A:表示在链的尾部追加规则
- -s:报文的源地址
- -p:指定需要匹配的报文的协议类型
- –dport:表示tcp扩展模块中的一个扩展匹配条件,可用于匹配报文的目标端口
- -j:满足“匹配条件”时执行的动作,在iptables中,处理动作被称为target
# iptables的工作机制
规则的顺序很重要: 如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。
# 指定新增规则的编号
iptables -I INPUT 2 -s 1.12.219.198 -j DROP
# 删除规则
# 根据规则的编号去删除规则
删除 filter 表中 INPUT 链上的第 3 条规则
iptables -D INPUT 3
# 根据具体的匹配条件与动作删除规则
删除 filter 表中 INPUT 链上源地址为 1.12.219.198,动作为 ACCEPT 的规则
iptables -D INPUT -s 1.12.219.198 -j ACCEPT
# 清空规则(慎用)
清空指定表中某条链上的所有规则
iptables -t 表名 -F 链名
清空指定表中所有链上的所有规则
iptables -t 表名 -F
# 3.参数说明
参照 增加规则
# 修改规则
# 4.参数说明
- -R:表示修改指定的链上的规则,在修改规则时指定规则对应的编号即可(有坑,慎行)
# 修改示例
将 “filter 表中 INPUT 链上源地址为 1.12.219.198,动作为 ACCEPT” 的规则动作改为 REJECT(假设为第一条规则)
iptables -R INPUT 1 -s 1.12.219.198 -j REJECT
注意:上例中,-s选项以及对应的源地址不可省略!
说明:即使我们已经指定了规则对应的编号,但是在使用 -R 选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定)。
建议: 可以先将这条规则删除,然后在同样位置再插入一条新规则。
# 修改指定链的“默认策略”
iptables -t 表名 -P 链名 策略
默认禁止所有人访问
iptables -P INPUT DROP
# 保存规则
在默认的情况下,我们对“防火墙”所做出的修改都是“临时的”,换句话说就是,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则“保存”。
# 方法一
将指令写入系统自启动文件,如 /etc/rc.local 或 sh 脚本等。
# 方法二
安装相应持久化工具辅助,如 iptables-persistent 或 iptables-services 等。所以一般可以使用更上层的工具来配置,如 ufw 或 firewalld。