概念

iptable相当于一个客户端命令工具,位于用户空间,netfilter是防火墙的框架,位于内核空间

iptables 有状态的防火墙 规则控制 免费

配置复杂 维护难

iptables 功能 :数据包过滤 数据转发 限速 防攻击

iptables 主要包括四表五链

四表

filter(包过滤)、nat(网络地址转换)、mangle(包重构)、raw(数据跟踪处理),优先级:raw->mangle->nat->filter

  • filter 包含INPUT、OUTPUT、FORWARD链,负责过滤功能,防火墙
  • nat 包含PREROUTING、POSTROUTING、OUTPUT链,网络地址转换功能
  • manglel 包含INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING链,拆解报文,做出修改,并重新封装的功能
  • raw 包含 PREROUTING、OUTPUT链,关闭nat表上启用的连接追踪机制
五链

当一个数据包进入网卡时,它首先进入prerouting链,内核根据数据包目的IP判断是否需要转送出去 如果数据包就是本机的,他就会到达input链。数据包到了input链后,任何进程都会收到它,本机上运行的程序可以发送数据包,这些数据包会经过output链,然后到达postrouting链输出

如果数据包不是本机就要转送出去,则由prerouting–forward–postrouting转发到其他主机

Iptables

处理动作
  • ACCEPT: 允许数据包通过
  • DROP: 直接丢弃数据包,不给任何回应信息,过了时间才会有反应
  • REJECT: 拒绝数据包通过,必要时会给数据发送端一个响应信息,客户端请求就会收到拒绝的信息
  • SNAT: 源地址转换,解决内网用户用同一个公网地址上网问题
  • REDIRECT: 在本机做端口映射
  • DNAT: 目标地址转换
  • MASQUERADE: 是snat的一种特殊形式,适用于动态、临时会变得IP
  • LOG: 在/var/log/messages文件中记录日志信息,然后将数据包传送给下一条规则

    1
    2
    3
    4
    
    iptables -t filter -L
    
    # -t:指定操作的表,不加-t默认filter表
    # -L:列出规则
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    # 查看指定链的规则
    
    iptables -L INPUT
    iptables -vL 
    iptables -nvL 
    iptables --line-number -nvL
    iptables -F 
    
    # -F 清空规则
    # -v 显示详细信息
    # -n 不对ip地址进行名称解析
    # --line-number 显示序号,直接使用--line同效
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    *案列演示*
    iptbales -t filter -I INPUT -s X.X.X.X -j DROP
    iptables -A INPUT -s X.X.X.X -j ACCEPT   # 默认操作filter表
    
    # -I 表示插入规则,在链的首部插入规则
    # -s 指明源地址
    # -A 表示添加规则,在链的尾部追加规则
    # 说明一下,定义的规则,从上往下优先级执行,-I插入会优先-A执行规则
    # -s x.x.x.x,x.x.x.x 使用逗号可多指定IP地址
删除规则
1
2
3
4
5
6
7
8
9
iptables --line -vnL  INPUT

# 删除指定第几条的规则
iptables -t filter -D INPUT 3

# 根据匹配条件和动作删除
iptables -D INPUT -s x.x.x.x -j ACCEPT

# -D INPUT: 表示删除INPUT链中的规则
修改规则
1
2
3
4
5
6
7
8
9
iptables -t filter -R INPUT 3 -s x.x.x.x -j REJECT

# -R: 指定修改的链
# 3: 指定的第几条规则

# 修改指定链的默认策略
iptables -t filter -P FORWARD DROP

# -P: 指定要修改的链
保存规则
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
centos7 默认使用firewalld 需要安装iptables
yum install iptables-services -y
systemctl start iptables && systemctl enable iptables

# 禁用firewalld
systemctl stop firewalld && systemctl disable firewalld

# 保存规则,默认保存到/etc/sysconfig/iptables
service iptables save

# 查看保存的规则
cat /etc/sysconfig/iptables

# 将当前规则以保后的形式输出到屏幕,并不能保存当前定义的规则
iptables-save 

# 重定向到配置文件即可保存
iptables-save > /etc/sysconfig/iptable

# 重载规则,现有规则会被覆盖
iptables-restore < /etc/sysconfig/iptables
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 只拒绝111向112这个ip发送的报文,不妨碍111向别的ip发送报文
iptables -t filter -A INPUT -s 192.168.11.111 -d 192.168.11.112 -j DROP

# 不指定源地址,则默认0.0.0.0/0 同理不指定目标地址
iptables -t filter -A INPUT -d 192.18.11.113 -j DROP

# 协议类型.指定tcp协议拒绝 -p tcp
iptable -I INPUT -s 192.168.1.11 -d 192.168.1.12 -p tcp -j REJECT
 
# 拒绝网卡eth0的ping请求
iptables -t filter -I INPUT -i eht0 -p icmp -j DROP

# --dport 指定端口 22 拒绝
iptbales -t filter -I INPUT -s 192.168.1.11 -p tcp --dport 22 -j REJECT

# 指定匹配端口 0到100 和指定端口80-65535
iptables -t filter -I INPUT -s 192.168.1.11 -p tcp --dport :100 -j ACCEPT
iptables -t filter -I INPUT -s 192.168.1.11 -p tcp --dport 80: -j ACCEPT
常用扩展模块
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 使用扩展模块 -m multiport --dport 指定多个端口
iptables -t filter -I INPUT -s 192.168.1.11 -p tcp -m multiport --dport 22,25,80 -j ACCEPT

# -m iprange ,--src-range, --dst-range指定源地址和目标地址范围
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.11-192.168.1.111 -j ACCEPT

# connlimt 模块对连接数进行限制
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j ACCEPT
# --connlimit-above 表示每个客户端IP到server的链接数上限为10
# --connlimit-mask 24 表示子网掩码255.255.255.0中的ip段

# udp 扩展
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT

# icmp 扩展 不让别人ping通我们
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j REJECT
IPtables 白名单机制
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 指定放行特定报文,只有匹配这二条规则报文才会被放行
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

# 将INPUT链默认策略改为DROP,实现机制
iptables -P INPUT DROP
# 如果之后清空规则 那么INPUT链中不存在规则,所有报文都会被拒绝,所以这种方法不合适

# 将INPUT链默认策略修改为ACCPET
iptables -P INPUT ACCEPT

# 在放行规则的底部设置一条拒绝所有请求的规则
iptables -A INPUT -j REJECT
IPtables 字定义链

为了方便管理规则,需要字定义链,比如按服务分类httpd,ssh服务内外网规则

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# -N 创建自定义链WEB
iptables -t filter -N WEB

# 添加一条规则
iptables -t filter -I WEB -s 192.168.1.11 -j REJECT
# 为字定义链添加规则后,并不会去匹配响应报文,需要用INPUT链去引用
iptables -I INPUT -p tcp --dport 80 -j WEB

# 重命名字定义链
iptables -E WEB SERVER

# 删除字定义链,需要先删除对应的应用规则,清除自定义链的规则
iptables -nvL INPUT
iptables -D INPUT 1 # 数字1表示删除第一条  
iptables -t filter -F WEB 
iptables -X WEB
IPtables 之网络防火墙

防火墙分为二类: - 主机防火墙:针对单个主机进行防护,前面所述的iptables都是作为主机防火墙角色 - 网络防火墙:处于网络入口的边缘,针对网络入口进行防护,服务于防火墙背后的局域网

前面所述只用到了INPUT和OUTPUT链,因为有过滤功能的链只有3条,INPUT,OUTPUT,FORWARD,当报文发往本机时,如果想要过滤,只能在INPUT,OUTPUT链中实现,而此时,iptables的角色发生了转变,我们想要将iptables所在的主机打造成网络防火墙(过滤并转发),要想过滤,只能在INPUT,OUTPUT,FORWARD三条链中实现,要想转发,报文只能经过FORWARD链,所以,iptables的角色变为网络防火墙时,规则只能定义在FORWARD链中

FORWARD

A为外部网络主机,圆形内为内部网络,B充当了网络防火墙角色,有二块网卡,A访问内部网络,在B主机进行转发过滤

开启B主机路由转发

1
2
3
4
5
6
# 临时生效
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久生效
ehco "net.ipv4.ip_forward = 1" >  /etc/sysctl.conf
sysctl -p
1
2
3
# 配置一条转发规则试试
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
IPtables 动作

iptables 有三个常用动作 ACCEPT DROP REJECT,可以为动作指定提升信息

REJECT动作可用值 > icmp-net-ubreachable、icmp-host-ubreachable、icmp-port-ubreachable、icmp-proto-ubreachable、icmp-net-prohibited、icmp-host-pro-hibited、icmp-admin-prohibited、当不设置任何值时,默认值使用icmp-net-ubreachable

SNAT

1
2
3
4
5
# 源地址转换案列,参考上图实列
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
# -A POSTROUTING 表示将SNAT规则添加到POSTROUTING链于INPUT链中,cetos6只能存在POSTROUTOING链中
# -s 10.1.0.0/16 表示报文来自这个网段
# --to-source 192.168.1.146 表示匹配到的报文的源地址修改为这个IP

DNAT

1
2
# 同理,从外部网络访问内部网络服务
iptables -t nat -I PREROUTING -D 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.0:3389