iptables 包过滤 防火墙
- firewall 防火墙工作在网络边缘(主机边缘)对于进出的网络数据包进行规则排查,并在匹配某规则时由规则定义的处理进行处理的功能组件
防火墙类型
- 根据工作区域不同分为:
- OSI 的第三层,即网络层的防火墙
- OSI 的第七层,即应用层的防火墙 ,或者代理服务器/网关
网络层的防护墙:包过滤器
- 在网络层 对数据进行条件是选择,根据访问控制表(ACL),即检查每个数据的源地址,目的地址,端口号,协议状态等.
- 针对端口
代理服务防火墙
- 代理服务会把同过或者服务控制规则的数据转发给请求访问的用户,内外网的用户访问都是通过代理服务器上的链接来实现,从而起到了隔离防火墙内为计算机系统作用
- 针对数据
主机防火墙和网络防火墙
- 主机防火墙:服务范围为当前主机;
- 网络防火墙: 服务范围为防火墙所在的局域网;
Iptables的组成
- 四个表:
- filter :过滤规则表,该表根据管理员预定义的一组规则过滤符合条件的数据包
- nat : 地址转换规则表;用于修改源IP或目标IP,也可以改端口;
- mangle :修改数据标记位规则表;拆解报文,作出修改,并重新封装起来;
- raw:跟踪数据表规则表 ;关闭nat表上启用的连接追踪机制
- 五个链接:
- INPUT OUTPUT FORWARD PREROUTING POSTROUTING
- 功能<--链:
- raw:PREROUTING, OUTPUT
- mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
- nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
- filter:INPUT,FORWARD,OUTPUT
- 报文流向:
- 流入本机:PREROUTING --> INPUT
- 由本机流出:OUTPUT --> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
添加规则的考量点
- (1) 要实现那种功能 : 判断条件在那张表上
- (2) 报文流经的路径: 判断添加在那个路径上
- 规则:
- 组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
- 匹配条件:
- 基本匹配条件
- 扩展匹配条件
- 处理动作:
- 基本处理动作
- 扩展处理动作
- 自定义处理机制:
ipatables 命令
- 查看:
- -L:list, 列出指定鏈上的所有规则;
- -n:numberic,以数字格式显示地址和端口号;
- -v:verbose,详细信息;
- -x:exactly,显示计数器结果的精确值;
- --line-numbers:显示规则的序号;
- 示例:
- 不指定表的话默认为filter表
- 指定查看raw表
- 常用选项组合-vnL 显示详细属性信息
- 查看指定链详细信息
-
链管理:
- -N:new, 自定义一条新的规则链;
- -X: delete,删除自定义的规则链;
- -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
- ACCEPT:接受
- DROP:丢弃
- REJECT:拒绝
- -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
- 示例:
- 添加一个新链
- 每一个自定义链都由引用计数
- 删除自定义链
- 注意:仅能删除用户自定义的引用计数为0的空链
- 修改规则策略
- 重命名自定义规则连名称
规则管理:
- -A:append,追加;
- -I:insert, 插入,要指明位置,省略时表示第一条;
- -D:delete,删除;
- (1) 指明规则序号;
- (2) 指明规则本身;
- -R:replace,替换指定链上的指定规则;
- -F:flush,清空指定的规则链;
- -Z:zero,置零;
- iptables的每条规则都有两个计数器:
- (1) 匹配到的报文的个数;
- (2) 匹配到的所有报文的大小之和;
匹配条件:
- 基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
- [!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
- [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
- [!] -p, --protocol protocol 指定协议 所有地址:0.0.0.0/0
- 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指明了协议,就表示已经指明了要扩展的模块,无需再同时使用-m指明模块;
- tcp:
- [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
- [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
- [!] --tcp-flags mask comp
- 例如:“--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 回应的状态码
-
定义白名单规则 : 对本机开放ssh
- 修改其默认策略
- 如下图 表示允许基于tcp协议22端口的192.168.117.133的访问其他协议IP会被DROP 匹配
- 注意此时如果使用 -F 清除规则那么 就只剩下默认规则 ,此处设置为DROP,会导致客户端断开连等各种不便
- 下面如图不需要修改其默认策略
- 控制ping 规则 这个表示 会响应任何人
- 如果你本地地址有多个可以基于i o 网卡设定规则
- 这个时候就可以去掉之前的REJECT 设置
- 允许本机ping任何人反之不能ping主机
-
显式扩展:必须使用-m 指明使用的扩展模块进行的扩展;调用模块
- 1、multiport扩展
- 此模块匹配一组源端口或目标端口。最多可指定15个端口。端口范围(端口:端口)算作两个端口。
- 它只能用于下列协议:TCP,UDP连接,udplite,DCCP和SCTP
- [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
- [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
- [!] --ports port[,port|,port:port]...:指明多个端口;
- 示例:
- 一次开放22,80,443,端口
- [root@wxC7 ~]# iptables -I INPUT 1 -d 192.168.117.133 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
- [root@wxC7 ~]# iptables -I OUTPUT 1 -s 192.168.117.133 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
- 2、iprange
- 以连续地址块的方式来指明多IP地址匹配条件;
- [!] --src-range from[-to] 源地址
- [!] --dst-range from[-to] 目标地址
- 示例: 设定指定ip范围内的开放23端口
- [root@wxC7 ~]# iptables -I INPUT 2 -d 192.168.117.133 -p tcp --dport 23 -m iprange --src-range 192.168.117.100-192.168.117.140 -j ACCEPT
- [root@wxC7 ~]# iptables -I OUTPUT 2 -s 192.168.117.133 -p tcp --sport 23 -m iprange --dst-range 192.168.117.100-192.168.117.140 -j ACCEPT
- 3、time
- 如果包到达时间/日期在给定范围内,则匹配。
- --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;
- 示例:
- 定制改地址范围内与规定时间内访问基于内核时间
- [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp --dport 23 -m iprange --src-range 192.168.117.130-192.168.117.135 -m time --timestart 12:00:00 --timestop 15:00:00 --weekdays 2,3,4, --kerneltz -j ACCEPT
- [root@wxC7 ~]# iptables -I OUTPUT 3 -s 192.168.117.133 -p tcp --sport 23 -m iprange --dst-range 192.168.117.130-192.168.117.135 -m time --timestart 12:00:00 --timestop 15:00:00 --weekdays 2,3,4, --kerneltz -j ACCEPT
- 4、string
- 该模块使用某种模式匹配策略匹配给定的字符串
- --algo {bm|kmp}
- [!] --string pattern
- [!] --hex-string pattern
- --from offset
- --to offset
- ~]# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT
- 示例:
- 凡是匹配到的字符串 都拒绝
- [root@wxC7 ~]# vim /web/www/index.html 内容how are you
- [root@wxC7 ~]# iptables -I OUTPUT -s 192.168.117.133 -m string --algo kmp --string "how" -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 大于..
- 示例: 单链接的最大并发连接控制;只需限制请求即可
- [root@wxC7 ~]# iptables -I INPUT -d 192.168.117.133 -s 192.168.0.0/16 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
- 6、limit 速率限制
- This module matches at a limited rate using a token bucket filter.
- 采用令牌桶算法
- --limit rate[/second|/minute|/hour|/day]
- --limit-burst number
- 限制本机某tcp服务接收新请求的速率:--syn, -m limit
- 示例:
- [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
- [root@wxC7 ~]# iptables -I OUTPUT 3 -d 192.168.117.133 -p icmp --icmp-type 0 -j ACCEPT
- 7、state
- 连接跟踪模块的一部分。允许访问此包的连接跟踪状态。
- [!] --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*
- 示例:设定规则 放行new及ESTABLISGED,默认规则为 拒绝
- [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp -m multiport --dport 21:23,80,139,445,443,3306 -m state --state NEW -j ACCEPT
- [root@wxC7 ~]# iptables -I INPUT -d 192.168.117.133 -m state --state ESTABLISHED -j ACCEPT
- [root@wxC7 ~]# iptables -A OUTPUT -s 192.168.117.133 -m state --state ESTABLISHED -j ACCEPT
- [root@wxC7 ~]# iptables -A INPUT -d 192.168.117.133 -j REJECT
- [root@wxC7 ~]# iptables -A OUTPUT -s 192.168.117.133 -j REJECT
- [root@wxC7 ~]# iptables -R OUTPUT 2 -s 192.168.117.133 -p udp -m multiport --sports 123,323 -m state --state NEW -j ACCEPT
- 要放行RELATED装态
- [root@wxC7 ~]# iptables -R INPUT 1 -d 192.168.117.133 -m state --state ESTABLISHED,RELATED -j ACCEPT
- 要追踪RELATED则要手动加载模块 :
- modprobe nf_conntrack_ftp
处理动作(跳转目标):
- -j targetname [per-target-options]
- 简单target:
- ACCEPT, DROP
- 扩展target:
- REJECT
- 这用于响应匹配包发送错误数据包:否则它相当于下降,因此它是终止目标、结束规则遍历。
- --reject-with type
- The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐ able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited (*), which return the appropriate ICMP error message (icmp-port-unreachable is the default).
- LOG打开匹配包的内核日志记录
- --log-level
- --log-prefix
- 默认日志保存于/var/log/messages
- 示例: 必须在其访问之前做追踪
- [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp --dport 23 -m state --state NEW -j LOG
- 也可以加个前缀表示访问telnet服务
- [root@wxC7 ~]# iptables -I INPUT 3 -d 192.168.117.133 -p tcp --dport 23 -m state --state NEW -j LOG --log-prefix "access telnet "
自定义规则连
- 示例: 定义ping 的规则
- [root@wxC7 ~]# iptables -N in_ping_rules
- [root@wxC7 ~]# iptables -A in_ping_rules -d 192.168.117.133 -p icmp --icmp-type 8 -j ACCEPT
- 拒绝指定ip访问
- [root@wxC7 ~]# iptables -I in_ping_rules -d 192.168.117.133 -s 192.168.117.131 -p icmp -j REJECT
- 规则链调用
- [root@wxC7 ~]# iptables -I INPUT 5 -d 192.168.117.133 -p icmp -j in_ping_rules
- 注意自定义链 一旦被引用 删不掉的
- 要删 清空其规则链
保存和载入规则:
- iptables规则定义完后都在内存中
- 保存:iptables-save > /PATH/TO/SOME_RULE_FILE
- 重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
- -n, --noflush:不清除原有规则 追加进去
- 示例:
- [root@wxC7 ~]# iptables-save > /etc/sysconfig/iptables-20170613-01
- [root@wxC7 ~]# iptables-restore < /etc/sysconfig/iptables-20170613-01
- CentOS 6:
- 保存规则:
- service iptables save
- 保存规则于/etc/sysconfig/iptables文件,覆盖保存;
- 重载规则:
- service iptables restart :重载覆盖
- 默认重载/etc/sysconfig/iptables文件中的规则
- 配置文件:/etc/sysconfig/iptables-config
- 规则优化的思路:
- 使用自定义链管理特定应用的相关规则,模块化管理规则;
- (1) 优先放行双方向状态为ESTABLISHED的报文;
- (2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
- (3) 服务于同一类别的功能的规则,匹配条件较严格的放在前面;
- (4) 设置默认策略:白名单机制
- (a) iptables -P,不建议;
- (b) 建议在规则的最后定义规则做为默认策略;
iptables/netfilter网络防火墙
- 此网络联通后做访问控制
- 对于对于外网80端口访问控制
- (1) [root@wxC6 ~]# iptables -A FORWARD -j REJECT
- [root@wxC6 ~]# iptables -I FORWARD -s 192.168.174.0/24 -p tcp --dport 80 -j ACCEPT
- [root@wxC6 ~]# iptables -I FORWARD 2 -d 192.168.10.0/24 -p tcp --sport 80 -j ACCEPT
- (2) 基于state状态控制
- [root@wxC6 ~]# iptables -A FORWARD -j REJECT
- [root@wxC6 ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
- [root@wxC6 ~]# iptables -I FORWARD 2 -s 192.168.174.0/24 -m state --state NEW -j ACCEPT
- [root@wxC6 ~]# iptables -I FORWARD 3 -d 192.168.174.0/24 -p tcp --dport 80 -m state --state NEW -J ACCEPT
- (3) 多端口放行控制
- [root@wxC6 ~]# iptables -I FORWARD 4 -d 192.168.174.129 -p tcp -m multiport --dports 21:23,80,139,443,445 -m state --state NEW -j ACCEPT
- [root@wxC6 ~]# iptables -I FORWARD 5 -d 192.168.174.129 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
- (4) 放行外网RELATED状态访问
- [root@wxC6 ~]# iptables -I FORWARD 6 -d 192.168.174.129 -p tcp -m state --state RELATED -j ACCEP
- 要注意的问题:
- (1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性;
- (2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;
NAT: Network Address Translation
- 网络地址转换:隐藏地址(把请求报文的源地址转换为网关地址)
- 请求报文:由管理员定义;
- 响应报文:由NAT的conntrack机制自动实现;
- 请求报文:
- 改源地址:SNAT,MASQUERADE
- 改目标地址:DNAT
- iptables/netfilter:
- NAT定义在nat表;
- PREROUTING,INPUT,OUTPUT,POSTROUTING
- SNAT:POSTROUTING
- DNAT:PREROUTING
- PAT:
- target:
- SNAT:
- This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
- --to-source [ipaddr[-ipaddr]]
- 示例:
- 转换地址为网关地址
- [root@wxC6 ~]# iptables -t nat -A POSTROUTING -s 192.168.174.0/24 -j SNAT --to-source 172.16.251.106
- MASQUERADE
- 这个目标只适用于nat表,在POSTROUTING链。它应该只被用于动态分配的IP(拨号)连接:如果你有一个静态IP地址,你应该使用SNAT目标
- 用于SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target;
- DNAT:
- 这个目标只适用于nat表,在PREROUTING和OUTPUT链,和用户定义的调用这些链的链。
- --to-destination [ipaddr[-ipaddr]][:port[-port]] 转到目标xx
- 示例:
- [root@wxC6 ~]# iptables -t nat -A PREROUTING -d 172.16.251.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.174.136
- [root@wxC6 ~]# iptables -t nat -I PREROUTING -d 172.16.251.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.174.136:8080
- REDIRECT
- 端口映射(重定向)
- 这个目标只适用于nat表,在PREROUTING和OUTPUT链,和用户定义的调用这些链的链。
- --to-ports port[-port]
- 示例:
- [root@wxC6 ~]# iptables -A PREROUTING -t nat -d 192.168.174.136 -p tcp --dport 80 -j REDIRECT --to-ports 8080