iptables/netfilter——Linux系统下的防火墙
基本原理
防火墙主要功能
工作于主机或者网络边缘,对进出本主机或本网络的报文进行匹配检测,对匹配到规则的报文进行于规则相对应的处理。
防火墙主要分类
- 按功能分类
主机防火墙
网络防火墙
- 按构成分类
软件防火墙
硬件防火墙
Linux防火墙软件iptables/netfilter(以后简称iptables)
内置五条链
PREROUTING INPUT FORWARD OUTPUT POSTROUTING
构成五大功能(五个表)
filter:过滤,防火墙; nat:network address translation;用于修改源IP或目标IP,也可以改端口; mangle:拆解报文,做出修改,并重新封装起来; raw:关闭nat表上启用的连接追踪机制; security:未广泛使用
各功能链结构
raw:PREROUTING, OUTPUT mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING filter:INPUT,FORWARD,OUTPUT
包过滤流程图
配置思路
iptables内容
主要包含两个方面
-
匹配条件
基本匹配条件:内建
扩展匹配条件:由扩展模块定义 -
处理动作
基本处理动作:内建
扩展处理动作:由扩展模块定义
自定义处理机制:自定义链
iptables配置原则
- 要实现哪种功能:判断添加到哪个表上
- 报文流经的路径:判断添加到哪个链上
链配置原则
- 同类规则(访问同一应用),匹配范围小的放上面
- 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面
- 将那些可由一条规则描述的多个规则合并起来
- 设置默认策略
iptables配置指令——filter
链管理
-N 自定义一条新链
iptables [-t table] -N chain
-X 删除自定义的规则链(仅能删除引用计数为0的空的自定义链)
iptables [-t table] -X [chain]
-P 设置默认策略
iptables [-t table] -P chain target
-E 重命名自定义链(不能重命名引用计数不为0的链)
iptables [-t table] -E old-chain-name new-chain-name
规则管理
-A 在尾部追加新规则
iptables [-t table] -A chain rule-specification
-I 插入新规则到指定位置(不指定为插入到第一条)
iptables [-t table] -I chain [rulenum] rule-specification
-D 删除指定规则
iptables [-t table] -D chain rulenum 指定序号删除 iptables [-t table] -D chain rule-specification 指定规则删除
-R 替换指定规则
iptables [-t table] -R chain rulenum rule-specification
-F 清空指定规则链(默认清空所有)
iptables [-t table] -F [chain [rulenum]] [options...]
-Z 归零规则链
iptables的每条规则都有两个计数器:
- 匹配到的报文的个数;
- 匹配到的所有报文的大小之和;
iptables [-t table] -Z [chain [rulenum]] [options...]
-L 查看iptables规则
- -n:numberic,以数字格式显示地址和端口号;
- -v:verbose,详细信息;-vv, -vvv
- -x:exactly,显示计数器结果的精确值;
iptables [-t table] -L [chain [rulenum]] [options...]
rule-specification
包含两方面内容
- 匹配条件
- 处理动作
匹配条件
- 基本匹配条件
[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围; [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;所有地址:0.0.0.0/0 [!] -p, --protocol //protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all" {tcp|udp|icmp} [!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链; [!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
-
拓展匹配条件
-
隐式拓展条件
不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块
-
隐式拓展条件
tcp: [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围; [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围; [!] --tcp-flags mask comp mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST comp is a comma-separated list of flags which must be set,例如SYN 例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0; [!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“; udp [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围; [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围; icmp [!] --icmp-type {type[/code]|typename} echo-request:8 echo-reply:0
-
-
显式拓展条件
必须使用-m选项指明要调用的扩展模块的扩展机制
-
显式拓展条件
1、multiport
This module matches a set of source or destination ports. Up to 15 ports can be specified. A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp. 以离散或连续的 方式定义多端口匹配条件,最多15个; [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口; # iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT
2、iprange
以连续地址块的方式来指明多IP地址匹配条件; [!] --src-range from[-to] [!] --dst-range from[-to] # iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT
3、time
This matches if the packet arrival time/date is within a given range. --timestart hh:mm[:ss] --timestop hh:mm[:ss] [!] --weekdays day[,day...] [!] --monthdays day[,day...] --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --kerneltz:使用内核配置的时区而非默认的UTC;
4、string
This modules matches a given string by using some pattern matching strategy. --algo {bm|kmp} [!] --string pattern [!] --hex-string pattern --from offset --to offset ~]# iptables -I OUTPUT -m string --algo bm --string "say" -j REJECT
5、connlimit
Allows you to restrict the number of parallel connections to a server per client IP address (or client address block). --connlimit-upto n --connlimit-above n ~]# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
6、limit
This module matches at a limited rate using a token bucket filter. --limit rate[/second|/minute|/hour|/day] --limit-burst number ~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT 限制本机某tcp服务接收新请求的速率:--syn, -m limit
7、state
The "state" extension is a subset of the "conntrack" module. "state" allows access to the connection tracking state for this packet. [!] --state state INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED. NEW: 新连接请求; ESTABLISHED:已建立的连接; INVALID:无法识别的连接; RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接; UNTRACKED:未追踪的连接; state扩展: 内核模块装载: nf_conntrack nf_conntrack_ipv4 手动装载: nf_conntrack_ftp 追踪到的连接: /proc/net/nf_conntrack 调整可记录的连接数量最大值: /proc/sys/net/nf_conntrack_max 超时时长: /proc/sys/net/netfilter/*timeout*
处理动作
-j: ACCEPT/DROP 接受/丢弃 REJECT:--reject-with 返回错误 LOG:--log-level, --log-prefix 记录日志 自定义链 转入使用自定义链 RETURN 返回上一层链
iptables保存和还原
iptables-save 保存iptables配置 iptables-restore 还原iptables配置(会清空原有配置)
iptables配置指令——nat
NAT: Network Address Translation 地址转换
- 请求报文:由管理员定义
- 响应报文:由NAT的conntrack机制自动实现
请求报文中的地址变动
- 修改源地址:SNAT,MASQUERADE
- 修改目标地址:DNAT
- 修改端口地址:REDIRECT
NAT定义在nat表:PREROUTING,INPUT,OUTPUT,POSTROUTING
- SNAT:POSTROUTING
- DNAT:PREROUTING
target:
-
SNAT
--to-source [ipaddr[-ipaddr]]
-
DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
- MASQUERADE
-
REDIRECT
--to-ports port[-port]
原创文章,作者:easyTang,如若转载,请注明出处:http://www.178linux.com/78009