Linux之iptables(四、网络防火墙及NAT)
iptables规则重启自动生效--永久生效
iptables命令
使用通用格式
iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
————————————————
# iptables [-t tables] [-AI 链] [-io 网络接口] [-p 协议] [-s 来源IP/网域] [-d 目标IP/网域] -j [ACCEPT|DROP|REJECT|LOG]
# iptables [-t tables] [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源IP/网域] [--sport 埠口范围] [-d 目标IP/网域] [--dport 埠口范围] -j [ACCEPT|DROP|REJECT]
COMMAND
链管理
1.1-N
: new,自定义一条新的规则链~]# iptables -N in_icmp
1.2
-X
: delete/drop, 删除自定义的规则链,指明名字删除一个, 不指明将删除多个
杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )~]# iptables -X in_icmp ~]# iptables -X -t nat #也可以一个一个table的清除<清除具体某一个table的规则>
1.3
-P
: policy, 设置默认策略, 指明是黑名单还是白名单,对于filter表中的链而方, 其默认策略有:
1.3.1ACCEPT
: 接受
1.3.2 DROP : 丢弃
1.3.3 REJECT : 拒绝~]# iptables -t filter -P FORWARD ACCEPT ~]# iptables -t filter -P FORWARD DROP
1.4
-E
: 重命名自定义链, 引用计数不为0的自定义链, 不能被重命名或者删除~]# iptables -E OLD_NAME NEW_NAME
-
规则管理
2.1-A
: append, 追加规则
2.2-I
: insert, 插入规则,需要指明位置,省略时表示第一条
2.3-D
: delete, 删除规则
** 指明规则号删除
** 指明规则本身
#查看原有规则 ~$ sudo iptables-save -t filter # Generated by iptables-save v1.4.14 on Tue May 19 01:51:33 2020 *filter :INPUT ACCEPT [23230:2572269] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [29398:3001269] COMMIT # Completed on Tue May 19 01:51:33 2020 #添加一个规则 ~$ sudo iptables -A INPUT -p tcp --syn -m state --state NEW -j ACCEPT #再次查看 umbra@UMB-BOX-094143:/etc/umbra$ sudo iptables-save -t filter # Generated by iptables-save v1.4.14 on Tue May 19 01:52:58 2020 *filter :INPUT ACCEPT [1071:109891] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1938:184341] -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j ACCEPT COMMIT # Completed on Tue May 19 01:52:58 2020 #删除这个规则 ~$ sudo iptables -D INPUT -p tcp --syn -m state --state NEW -j ACCEPT #查看删除结果 ~$ sudo iptables-save -t filter # Generated by iptables-save v1.4.14 on Tue May 19 01:53:54 2020 *filter :INPUT ACCEPT [92:9212] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [161:15459] COMMIT # Completed on Tue May 19 01:53:54 2020
2.4-R
: replace, 替换指定链上的指定规则
** 指明替换号
** 指明替换规则本身
2.5-F
: flush, 清空指定的规则链~]# iptables -F # 不指明链, 清除所有的已订定的规则 ~]# iptables -F -t filter # 也可以指明某个table的清除<清除具体某一个table的规则> ~]# iptables -F -t nat
2.6
-Z
: zero, 置零
** 匹配到的报文个数
** 匹配到的所有报文的大小之和(字节数)将所有的 chain 的计数与流量统计都归零 #清除本机防火墙 (filter)的计数与流量统计 ~]# iptables -Z ~]# iptables -Z -t filter #清除本机防火墙 (nat)的计数与流量统计 ~]# iptables -Z -t nat
-
查看
3.1 -L : list, 列出指定链上的所有规则
3.1.1 -n : numberic ,以数据格式显示地址和端口
3.1.2 -v : verbose ,详细信息
vv
vvv
3.1.3 -x : exactly(精确的),显示计数器结果的精确值
3.1.4 --line-numbers : 显示规则的序号
chain
- PREROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
匹配条件
- 基本匹配条件
无需加载任何模块,由iptables/netfilter自行提供
1.1 [!]-s address[/mask][,...]
检查报文中源IP地址, 是否符合此处指定的地址或范围
1.2 [!]-d address[/mask][,...]
检查报文中的目标IP地址,是否符合此处指定的地址或范围
1.3 [!]-p protocol
表明在传输层应用的协议,其可以有tcp,udp,udplite,icmp,icmpv6, esp,ah,sctp,mh 或者all
1.4 [!]-i in-interface name
只能应用于数据报文流入的接口,INPUT,FORWARD and PREROUTING chains
1.5 [!]-o out-interface name
只能应用于数据报文流出的接口,OUTPUT,FORWARD POSTROUTING - 隐匿扩展
不需要手动加载扩展模块,因为它们是对协议的扩展,所以但凡使用-p
指明了协议,就表示已经指明了要扩展的模块
2.1 tcp
2.1.1 [!]--sport port[:port]
匹配报文的源端口,可以是连续的端口范围
2.1.2 [!]--dport port[:port]
匹配报文的目标端口,可以是连续的端口范围
2.1.3 [!]--tcp-flags mask comp
mask : 必须要检查的标识位,必须以,号分隔
comp : 必须为1的标识位,必须以,号分隔
2.1.4 --syn--tcp-flags syn,ack,fin,rst syn : #表示要检查的标识位为syn,ack,fin,rst. 但syn必须为1,余下的必须为0,其是匹配每一次握手 iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp !--syn -m state --state NEW -j DROP #不是TCP第一次握手,但状态又是new的报文
匹配第一次握手,相当于 --tcp-flags syn,ack,fin,rst syn
2.2 udp
2.2.1 [!]--sport port[:port]
匹配报文的源端口,可以是端口范围
2.2.2 [!]--dport port[:port]
匹配报文的目标端口,可以是连续的端口范围
2.3 icmp
2.3.1 [!] --icmp {type[/code] | typename}~]# iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT --icmp-type :后面必须要接 ICMP 的封包类型,也可以使用代号, 例如 8 代表 echo request 的意思。 范例:让 0,3,4,11,12,14,16,18 的 ICMP type 可以进入本机: [root@www ~]# vi somefile #!/bin/bash icmp_type="0 3 4 11 12 14 16 18" for typeicmp in $icmp_type do iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT done [root@www ~]# sh somefile
显示扩展
必须使用-m
选项手动加载模块, 其扩展模块路径为:/lib/xtables,其中大写的为目标扩展,小写的为规则扩展
获取扩展选项帮助 : Centos 6 : man iptables Centos 7 : man iptables-extensions
3.1 multiport扩展
: 以离散方式定义多端口匹配,但最多指定15个端口
3.1.1 [!] --sports port[,port | ,port:port]
指定多个源端口
3.1.2
[!] --dports port[,port | ,port:port]
指定多个目标端口
3.1.3 --ports port[,port | ,port:port]
指定多个目标及源端口
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
3.2 state扩展
3.2.1
根据连接追踪机制,查检连接的状态, 跟TCP没有关系,是内核中netfilter实现, 能实现tcp,udp,icmp的连接追踪,内核会记录每一个连接(放置在内存中),谁,通过什么协议, 访问什么服务, 访问的时间,这种机制被称之为conntrack机制.也正是有了state扩展,iptables成为了有连接追踪的防火墙,安全性是更高. 是由state扩展提供,库文件为/lib/xtables/libxt_conntrack.so . 追踪连接功能在内核的内存空间中,把出去和进来的连接通过模板建立关联关系. 追踪本机的请求和响应之间的关系,状态如下几种:
3.2.2 STATE
-
NEW
: 新发起的请求 -
ESTABLISHED
: new状态之后,连接追踪模板中为其建立的条目失效之前期间内所有的通信状态 -
RELATED
: 相关的连接,如FTP协议中的命令连接与数据连接之间的关系 -
INVALID
: 无效的连接,如tcp状态全为1或者全为0的连接 -
UNTRACKED
: 未进行追踪的连接
3.2.3[!] --state STATE
: 多个state可以使用,号分隔iptables -A INPUT -d 172.168.100.67 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sport 22,80 -m state --state ESTABLISHED -j ACCEPT iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
target的分类
-
ACCEPT
: 接受 -
DROP
: 丢弃 -
REJECT
: 拒绝 -
RETURN
: 返回调用链 -
REDIRECT
: 端口重定向 -
LOG
: 记录日志
--log-level LEVEL
: 日志的等级
--log-prefix FREFIX
: 日志的提示语句的前缀
iptables -A INPUT -d 172.16.36.61 -p tcp --dport 21 -j LOG --log-prefix "netfilter log"
-
MASK
: 做防火墙标记 -
DNAT
: 目标地址转换 -
SNAT
: 源地址转换 -
MASQUERADE
: 地址伪装 - 用户自定义链