iptables

防火墙的作用是阻止非授权网络的访问,防患于未然。只能识别事先定义好的规则。
杀毒软件的作用是杀毒,是治病的,当电脑遭受到攻击之后才起作用。
入侵检测与管理系统

防火墙

端口:进程地址
互联网主机间进程通讯的过程:传输层封装报文是会将进程端口写在报文上,ip封装时会写上源ip和目标ip,数据链路层会在报文外层再加一层帧封装,在报文传输过程中,MAC层首部会不断变换,而ip层首部始终不变,直到经过层层转发,到达目的主机。

防火墙的分类:
主机防火墙,服务范围为当前主机
网络防火墙,服务范围为防火墙一侧的局域网

硬件防火墙
软件防火墙

网络层防火墙,OSI模型下四层

hook

prerouting:所有到达本机的数据包都要首先经过此hook,它的位置在本机内核边缘。
input :所有发给本机的数据包都要经过此hook
output:所有由本机出去的数据包都要经过此hook
forward:所有经过本机转发的数据包都要经过此hook
postrouting:所有经由本机出去的额数据包都要经过此hook

iptables表

iptables默认包含5张表,分别具有不同的功能,大部分情况仅需使用filter和nat,其余用于更加复杂的情况,例如多路有哦和路由判定等
raw

  • 用于配置数据包,raw中的数据包不会被系统跟踪

filter

  • 用于存放所有域防火墙相关操作的默认表

nat

  • 用于网络地址转换,即端口转发

mangle

  • 用于对特定数据包的修改

security

  • 用于强制访问控制网络规则,如selinux

报文流向

到本机内部

  • prerouting-> input

由本机发出

  • output -> postrouting

由本机转发

  • prerouting -> forward

安装iptables-services包,可以开启系统服务管理规则,

table与chains之间的映射关系

filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
mangle:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
raw:PREROUTING,OUTPUT

iptables命令详解

命令使用格式
iptables [ -t table] SUBCOMMAND chain [ num|rule-spec]

SUBCOMMAND自命令介绍

  • 管理规则

    -A:append,追加,追加到最后一条
    -I:insert,插入,默认插入到第一条,可以指定插到第几条
    -D:删除
    -R:替换

  • 管理链

    -N:new,新增一条链
    -X:删除一条自定义的、空的、引用计数为0的链。
    -E:
    -P:policy,创建链的默认策略
    -F:flush,清空链上的所有策略,不包括默认策略
    -Z:zero,计数器置零,iptables的每条规则和每个链都有专用的两个计数器:pkts,bytes
    -L:查看表中的链上定义的策略,加上-n选项,表示不经过地址解析,直接以数字的方式显示主机地址和端口,加上-v,显示详细信息,加上-x显示精确的匹配到的数据大小,–line-numbers显示每条规则的编号

检查报文,检查报文的tcp/udp首部、ip首部,MAC首部格式中的某个数据。

  • tcp/udp首部:源端口,目标端口
  • ip首部:sip、dip
  • MAC首部:源MAC,目的MAC

匹配条件

  • 通用匹配

    [!] -s,–sip,–source-ip:报文源地址,其值可以是单个ip或一个网段,但不能是离散单个ip,前面加!表示取反。
    [!] -d,–dip,–destnation-ip:目标ip
    -i,–in-interface报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
    -o,–out-interface,报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
    -p protocol:四层协议,例如tcp,udp,icmp

  • 扩展匹配

    隐式扩展
    显式扩展,需要使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块。模块可以通过ls /lib/modules/`uname -r`/kernel/net/netfilter 命令查看

隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块

  • 基于tcp的隐式扩展

    [!] –source-port, –sport port[:port]:匹配报文源端口,可为端口范围
    [!] –destination-port,–dport port[:port]:匹配报文目标端口,可为范围
    [!] –tcp-flags mask comp

  • 基于icmp的隐式扩展

    [!] –icmp-type {type[/code]|typename}
    type/code
    0/0 echo-reply icmp应答
    8/0 echo-request icmp请求

处理动作

  • DROP:丢弃
  • REJECT:拒绝
  • ACCEPT:接受
  • RETURN:返回调用链
  • REDIRECT
  • SNAT
  • DNAT
  • MASQURADE
  • LOG

iptables实战

查看规则

  • iptables -t filter -vnL

将某个链的计数置零

  • iptables -t fileter -Z INPUT

拒绝web服务被某个特定的网段访问

  • iptables -I INPUT -p tcp -s 192.168.34.0/16 -d 192.168.34.108 –dport 80 -j REJECT

允许发出dns请求

  • iptables -I OUTPUT -p udp –dport 53 -j ACCEPT
  • iptables -I INPIT -p udp –sport 53 -j ACCEPT

当本机作为Samba服务器时,开放相关端口允许访问,udp:137,138 tcp:139,445

  • iptables -A cifs_rules -p tcp –dport 139 -j ACCEPT
  • iptables -A cifs_rules -p tcp –dport 445 -j ACCEPT
  • iptables -A cifs_rules -p udp –dport 137:138 -j ACCEPT
  • iptables -A cifs_rules -j RETURN (如果本链中没有规则被匹配到,则将请求返回给调用者)
  • iptables -I INPUT 5 -S 172.18.0.0/16 -j cifs_rules

如果要删除该自定义链,则

  • iptables -D INPUT 5
  • iptables -F cifs_rules
  • iptables -X cifs_rules

显式扩展实战

multiport扩展:以离散的方式定义多个端口匹配,最多指定15个端口,用:隔开的算作一个端口
[!] –sports port[,port,port:port,…] 指定多个源端口
[!] –destination-ports,–dports port[,port|,port:port]…指定多个目标端口
[!] –ports port[,port|,port:port]…多个源或目标端口
示例

  • iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport –dports 20:22,80 -j ACCEPT

iprange扩展:指明连续的(但一般不是整个网段)ip地址范围
[!] –src-range from[-to] 源IP地址范围
[!] –dst-range from[-to] 目标IP地址范围
示例

  • iptables -A INPUT -d 172.16.1.100 -p tcp –dport 80 -m iprange –src-range 172.16.1.5-172.16.1.10 -j DROP

mac扩展:指明源MAC地址,适用于:PREROUTING,FORWARD,INPUT
[!] –mac-source XX:XX:XX:XX:XX:XX
示例

  • iptables -A INPUT -s 172.16.0.100 -m mac –mac-source 00:50:56:12:34:56 -j ACCEPT
  • iptables -A INPUT -s 172.16.0.100 -j REJECT

set扩展
set扩展依赖ipset工具,需要安装ipset包
yum -y install ipset
使用ipset创建一个集合,如果是网段使用hash:net,如果是单个网址使用hash:ip。
创建集合后,向集合内添加元素,然后利用该集合创建策略。
示例

  • ipset create allowpinghosts hash:ip
  • ipset list #查看创建的列表
  • ipset add allowpinghosts 172.18.0.100
  • ipset add allowpinghosts 172.18.0.200
  • iptables -I INPUT 4 -p icmp –icmp-type 8 -m set –match-set allowpinghosts src -j ACCEPT
  • iptables -I OUTPUT 4 -p icmp –icmp-type 0 -m set –match-set allowpinghosts dst -j ACCEPT

string扩展:对报文中的应用层数据做字符创模式匹配检测
–algo {bm|kmp} 字符串匹配检测算法

bm:Boyer-Moore
kmp:Knuth-Pratt-Morris

–from offset 开始偏移
–to offset 结束偏移
[!] –string pattern 要检测的字符串模式
[!] –hex-string pattern要检测字符串模式,16进制格式
示例

  • iptables -I INPUT -m string –string “sex” –algo bm -j REJECT
  • iptables -I OUTPUT -m string –string “sex” –algo bm -j REJECT

time扩展
根据报文达到的时间与指定的时间范围进行匹配度检测
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss] 时间
–timestop hh:mm[:ss]
[!] –monthdays day[,day…] 每个月的几号
[!] –weekdays day[,day…] 星期几,1 – 7 分别表示星期一到星期日
–kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC

connlimit扩展
根据客户端ip做并发连接数量匹配
可防止CC(Challenge Collapsar挑战黑洞)攻击
–connlimit-upto #:连接的数量小于等于#时匹配
–connlimit-above #:连接的数量大于#时匹配
通常分别与默认的拒绝或允许策略配合使用
例如

  • iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT

limit扩展
基于收发报文速率的匹配
令牌桶过滤器
–limit #[/second|/minute|/hour|/day]
–limit-burst number
示例

  • iptables -I INPUT -p icmp –icmp-type 8 -m limit –limit 6/minute –limite-burst 5 -j ACCEPT

state扩展
根据”连接追踪机制”去检查连接的状态,比较消耗资源
[!] –state state
conntrack机制:追踪本机上的请求和响应之间的关系
state状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此链接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

示例

  • iptables -t filter -A INPUT -s 172.18.0.0/16 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
  • iptables -t filter -d 182.18.0.230 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT

已经追踪到的并记录下来的连接信息库

  • /proc/net/nf_conntrack

调整连接追踪功能所能够容纳的最大连接数量

  • /proc/sys/net/nf_conntrack_max,各种状态的超时连接会从表中删除,当模板满载时,后续连接可能会超时,解决办法有两个

    加大nf_conntrack_max的值
    vi /etc/sysctl.conf
    net.nf_conntrack_max = 393216
    net.netfilter.nf_conntrack_max = 393216

    减低nf_conntrack timeout时间
    vi /etc/sysctl.conf
    net.netfilter.nf_conntrack_tcp_timeout_established = 300
    net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
    net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
    net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

不同的协议的连接追踪时长

  • /proc/sys/net/netfilter/

注意:centos7需要加载模块:modeprob nf_conntrack

开放被动模式的ftp服务

  1. 装载ftp连接追踪的专用模块:
    跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
    vim /etc/sysconfig/iptables-config 配置文件
    IPTABLES_MODULES=“nf_conntrack_ftp”
    modproble nf_conntrack_ftp
  2. 放行请求报文:
    命令连接:NEW, ESTABLISHED
    数据连接:RELATED, ESTABLISHED
    iptables –I INPUT -d LocalIP -p tcp -m state –state ESTABLISHED,RELATED -j
    ACCEPT
    iptables -A INPUT -d LocalIP -p tcp –dport 21 -m state –state NEW -j ACCEPT
  3. 放行响应报文:
    iptables -I OUTPUT -s LocalIP -p tcp -m state –state ESTABLISHED -j ACCEPT

示例
开放被动模式的ftp服务示例

yum install vsftpd
systemctl start vsftpd
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -vnL

最后的动作包括:ACCEPT,DROP,REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE…
其中
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则之前,并将日志记录在/var/log/messages系统日志中
–log-level level 级别有:debug,info,notice,warning,error,crit,alert,emerg
–log-prefix prefix日志前缀,用于区别不同的日志,最多29个字符
示例

  • iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport –dports 21:23,80 -m state –state NEW -j LOG –log-prefix “new connections:”

iptables策略的优化
任何不允许的访问,应该在请求到达时给予拒绝
规则在链上的次序即为其检查时的生效次序

  1. 按去哪个放行所有入栈和出站的状态为ESTABLISHED状态连接
  2. 谨慎放行入栈的新情求
  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
  4. 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
  5. 不同类的规则(访问不同应用),匹配范围大的放在前面
  6. 应该将那些可由一条规则能够描述的多个规则合并为一条
  7. 设置默认策略,建议白名单(只放行特定连接)
    • iptables -P,不建议
    • 建议在规则的最后定义规则做为默认策略

策略有效期限:使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
将规则保存至指定文件

  • centos6

    service iptables save
    规则将覆盖把哦哦存执/etc/sysconfig/iptables文件中

  • centos7

    iptables-save > /PATH/TO/SOME_RULES_FILE

将文件中的规则载入到iptables中

  • centos6

    service iptables restart
    会自动从/etc/sysconfig/iptables重载规则

  • centos7

    iptables-restore < /PATH/FROM/SOME_RULES_FILE
    -n,–noflush:不清除原有规则
    -t,–test:仅分析生成规则集,但不提交

iptables的网络地址转发功能

NAT:network address translation
可以在PREROUTING,INPUT,OUTPUT,POSTROUTING链上做网络地址转发的相关策略,比较常见的是在PREROUTING和POSTROUTING链上做策略。
请求报文:修改源/目标ip,由定义如何修改
响应报文:修改源/目标ip,根据跟踪机制自动实现

SNAT:source nat POSTROUTING,INPUT

让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,也解决了地址不够用的问题。
对请求报文修改源ip
SNAT只能在POSTROUTING链上做报文修改,因为如果在PREROUTING链上做修改,主机会认为是发给自己的报文。postrouting位置在报文刚要离开本机还未进行路由的地方。
iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -d 172.18.0.0/16 -j SNAT –to-source localhost-ip

DNAT:

prerouting,位置在报文刚刚到达本机还未进行路由的地方
DNAT还可以做端口映射
iptables -t nat -A PREROUTING -d serverip -p tcp –dport 80 -j DNAT –to-destination real-serverip[:port]

REDIRECT

NAT表
可用于:PREROUTING OUTPUT 自定义链
通过改变目标IP和端口,将接受的包转发至不同端口
–to-ports port[-port]
REDIRECT可以实现对本机端口访问的报文做端口转换,例如本机的httpd监听的端口是8080,而客户端只能通过80访问,此时就可以在本机PREROUTING链上做端口转换。
iptables -t nat -A PREROUTING -d 本机ip –dport 80 -j REDIRECT –to-ports 8080