美文网首页
iptables防火墙

iptables防火墙

作者: linux_豪哥 | 来源:发表于2019-12-26 17:57 被阅读0次

    1.iptables防火墙介绍

    Iptables其实不是真正的防火墙,只是一个工具。
    我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架的名字叫netfilter
    Netfilter框架存在于linux内核中实现数据包过滤、连接跟踪、地址转换等,来实现网络的安全。
    Netfilter也是网络层的一个模块,可以在网络层的前后设置勾子函数,一旦有数据包流经勾子函数就会被拦截,每一个勾子函数都对应一个链,然后去比对表里的规则看是否通过或者更改。而这些表里的规则就是由iptables这个命令来配置的。

    2.iptables防火墙四表五链

    表的处理优先级:raw>mangle>nat>filter.

    •   filter表——过滤数据包 
    •   Nat表——用于网络地址转换(IP、端口)
    •   Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
    •   Raw表——决定数据包是否被状态跟踪机制处理
    
    image.png

    3.iptables表和链的位置

    进路由(PREROUTING)、进系统(INPUT) 、转发(FORWARD)、出系统(OUTPUT)、出路由(POSTROUTING)

    3.1 双网卡

    image.png image.png

    3.2 单网卡

    image.png

    4.介绍iptables命令

    4.1 结构

    iptables -t 表 命令 链 规则 -j 动作
    
    table 可以是 filter nat mangle 默认是 filter
    

    4.2 常用命令

    -P或 --policy   定义默认策略
    -L或 --list     查看iptables规则列表 
    -A或 --append   在规则列表的最后增加1条规则
    -I或 --insert   在指定的位置插入1条规则
    -D或 --delete   从规则列表中删除1条规则
    -R 或 --replace 替换规则列表中的某条规则 
    -F 或 --flush   删除表中所有规则    
    

    4.3 iptables数据包匹配选项

    -i 或 --in-interface  指定数据包从哪个网络接口进入,如ppp0、eth0、eth1等。
    -o 或 --out-interface 指定数据包从哪个网络接口出去,如ppp0、eth0、eth1等。
    -p 或 --protocol   协议类型 指定数据包匹配的协议,如TCP、UDP、ICMP等
    -s 或 --source   指定数据包匹配的源地址
    -d 或 --destination  指定数据包匹配的目标地址
    --sport   指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个端口号的范围
    --dport   目标端口号,指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个端口号的范围
    
    
    例子
    拒接ICMP协议数据包
    [root@sdh ~]# iptables -t filter -I INPUT -p icmp -j DROP
    
    拒绝从eth1网卡进入ICMP协议数据包
    [root@sdh ~]# iptables -t filter -I INPUT -p icmp -i eth1 -j DROP
    

    4.4 扩展匹配选项

    匹配选项中,还需要加-m引用模块的显示扩展

    4.4.1状态类型

    参数 -m state
         基于状态检测的包过滤,指定检测那种状态
         --state {NEW, ESTABLISHED, INVALID, RELATED}
         说明 用来比对连接状态,连接状态共有四种:NEW, ESTABLISHED, INVALID, RELATED
         INVALID 表示该封包的连接编号(Session ID)无法辨认或编号不正确
         ESTABLISHED 表示该封包属于某个已经建立的连接
         NEW 表示该封包想要起始一个连接(重设连接或将连接重导向)
         RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA连接必定是源自某个FTP连接
        
         范例 iptables –A INPUT -m state --state RELATED,ESTABLISHED 
         拒绝其他主机的新连接
         [root@sdh ~]# iptables -t filter -I INPUT -p tcp -m state --state NEW -j DROP
    

    4.4.2 ICMP类型

    参数-m icmp --icmp-type
       ping 命令使用icmp协议测试网络是否畅通
       icmp有两种常用的数据包icmp-type,常用的类型为echo-reply和echo-request.
       PC1 ping PC2,发出去的数据包是icmp协议的echo-request类型的数据包,PC2返回来的数据包是icmp协议的echo-reply类型的数据包。
     
    例子
    不允许其他主机ping本地(ping其他主机可以)
    [root@sdh ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
    
    icmp 数据包的类型也可以使用数字表示
    类型8:echo-request
    类型0:echo-reply
    举例
    [root@sdh ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j DROP
    

    4.4.3 指定多端口号

    参数 -m multiport
        指定多端口号(只用--dport无法指定多个端口)
       -m multiport
              --sports   源端口
              --dports   目标端口
              --ports   
    示例
    拒绝192.168.80.0/24访问192.168.10.0/24 的1-1024,3389端口
    [root@sdh ~]# iptables -t filter -I INPUT -p tcp -s 192.168.80.0/24 -d 192.168.10.0/24 -m multiport --dports 1:1024,3389 -j DROP
    拒绝访问本机的22端口(SSH没改端口情况下尽量不要用)
    [root@sdh ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
    

    4.4.4 指定IP段

    参数 -m iprange
    指定IP段
            --src-range ip-ip
            --dst-range ip-ip
    示例
    禁止192.168.80.1-100地址段访问
    [root@sdh ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.80.1-192.168.80.100 -j DROP
    

    4.4.5 连接限定

       -m connlimit
       --connlimit-above  限定最大连接个数
    示例
    限制每个ip的连接数为3
    [root@sdh ~]# iptables -t filter -I INPUT -p tcp -m connlimit --connlimit-above 3  -j REJECT
    

    4.4.6 限速

    -m limit --limit
    一个数据包默认设置最大1500字节
    范例   iptables –A INPUT –m limit --limit 3/hour
    说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对;每小时平均流量是否超过一次3个数据包(一小时3个数据包)
    除了每小时平均一次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后:/second、/minute、/day 
        
    例子
    限制每秒对本机发送数据包不能超过300个。300*1500=450 000=450k
    [root@sdh ~]# iptables -t filter -I INPUT -p tcp -m limit --limit 300/s -j ACCEPT
    [root@sdh ~]# iptables -t filter -A INPUT -p tcp -j DROP
    

    4.4.7 瞬间流量控制

    参数 --limit-burst
    范例 iptables –A INPUT –m limit --limit-burst 5
    说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。(通俗点讲 前5个包可以直接通过不限速,但前5个包通过之后如果有限速设置就要按限速的速率来传送数据包)
    
    例子
    只允许其他主机ping本机4个包
    [root@sdh ~]# iptables -t filter -I INPUT -p icmp -m limit --limit-burst 4 -j ACCEPT
    [root@sdh ~]# iptables -t filter -A INPUT -p icmp -j DROP
    
    image.png

    4.4.8 源mac地址限制

    参数 –m mac --mac-source
    说明 用来比对封包来源接口的硬件地址,这个参数不能用在OUTPUT和POSTROUTING规则链上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过ARP通讯协议查出目的地的MAC地址,所以iptables在进行封包比对时,并不知道封包会送到哪个网络接口去。
    
    示例
    拒绝某个计算机的MAC能够访问VMNet8这个网段
    [root@sdh ~]# iptables -t filter -I FORWARD -d 192.168.80.0/24 -m mac --mac-source 00-0C-29-DB-32-6F -j DROP
    

    4.5 处理动作

     -j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK。
      
    filter 表能使用的主要动作
       ACCEPT:将封包放行,进行此处理动作后,将不再匹配其他规则,直接跳往下一个规则链。
       REJECT:拦阻该封包 ,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply或者是tcp-reset(这个封包会要求对方关闭连接),进行完成处理动作后,将不再匹配其他规则,直接中断过滤程序。
       DROP:丢弃封包不予处理,进行完成处理动作后,将不再匹配其他规则,直接中断过滤程序。
       LOG:将封包相关讯息记录在/var/log/messages中,详细位置请查阅/etc/rsyslog.conf配置文件,进行完成处理动作后,将会继续匹配其规则。可以去/etc/rsyslog.conf中更改记录文件,记得重启日志服务
    

    4.5.1 REJECT

    示例:
    与DROP不同DROP是什么动静都没有,REJECT会回复给原主机 目标不可达
    [root@sdh ~]# iptable -t filter -I INPUT -p icmp -j REJECT
    

    4.5.2 LOG

    只对数据包进行记录,不对数据包进行拒绝或者限制的作用,所以数据包的通过与不通过要看接下来的规则链,所以尽量把LOG动作的规则链放到开头。
    
    示例:
    给基于ICMP的封包进行LOG记录
    [root@sdh ~]# iptables -t filter -I INPUT -p icmp -j LOG --log-prefix "iptables-icmp"
    
    --log-prefix  给记录的信息加上一个标记
     然后查看/var/log/messages里面会有封包的信息
    

    5 保存还原防火墙设置

    iptables防火墙重启会加载配置文件,
    所以如果我们当前的规则没有保存到配置文件,就会清空。
    
    iptables配置文件               /etc/sysconfig/iptables
    将当前配置保存到配置文件      service iptables save
    将当前配置规则追加到一个文件           iptables-save > iptables.conf1
    还原iptables-save命令所备份的规则配置   iptables-restore < iptables.config1
    

    6 介绍Iptables防火墙配置文件

    iptables服务的配置文件是/etc/sysconfig/iptbales-config

    vim /etc/sysconfig/iptables-config

    # Load additional iptables modules (nat helpers)
    #   Default: -none-
    # Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
    # are loaded after the firewall rules are applied. Options for the helpers are
    # stored in /etc/modprobe.conf.
    IPTABLES_MODULES=""
     
    # Unload modules on restart and stop
    #   Value: yes|no,  default: yes
    # This option has to be 'yes' to get to a sane state for a firewall
    # restart or stop. Only set to 'no' if there are problems unloading netfilter
    # modules.
    IPTABLES_MODULES_UNLOAD="yes"
     
    # Save current firewall rules on stop.
    #   Value: yes|no,  default: no
    # Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped
    # (e.g. on system shutdown).
    IPTABLES_SAVE_ON_STOP="no"
     
    # Save current firewall rules on restart.
    #   Value: yes|no,  default: no
    # Saves all firewall rules to /etc/sysconfig/iptables if firewall gets
    # restarted.
    IPTABLES_SAVE_ON_RESTART="no"
     
    # Save (and restore) rule and chain counter.
    #   Value: yes|no,  default: no
    # Save counters for rules and chains to /etc/sysconfig/iptables if
    # 'service iptables save' is called or on stop or restart if SAVE_ON_STOP or
    # SAVE_ON_RESTART is enabled.
    IPTABLES_SAVE_COUNTER="no"
     
    # Numeric status output
    #   Value: yes|no,  default: yes
    # Print IP addresses and port numbers in numeric format in the status output.
    IPTABLES_STATUS_NUMERIC="yes"
     
    # Verbose status output
    #   Value: yes|no,  default: yes
    # Print info about the number of packets and bytes plus the "input-" and
    # "outputdevice" in the status output.
    IPTABLES_STATUS_VERBOSE="no"
     
    # Status output with numbered lines
    #   Value: yes|no,  default: yes
    # Print a counter/number for every rule in the status output.
    IPTABLES_STATUS_LINENUMBERS="yes"
    

    6.1 解释配置文件

    IPTABLES_MODULES = “ip_conntrack_netbios_ns”
    在防火墙被激活时,指定一组独立的空间额外加载iptables模块,系统启动,加载防火墙模块,会打印:加载其他iptables模块:ip_conntrack_netbios_ns [确定]
    IPTABLES_MODULES_UNLOAD = “是”
    在重新启动和停止的iptables模块时,是否卸载此模块。
    IPTABLES_SAVE_ON_STOP = “不”
    当防火墙停止时,保存当前防火墙规则到iptables文件,no :(默认值)不保存当前的规则到iptables文件。
    IPTABLES_SAVE_ON_RESTART = “不”
    当防火墙重启时:service iptables restart,保存当前防火墙规则到iptables文件,no :(默认值)不保存当前的规则到iptables文件。
    IPTABLES_SAVE_COUNTER = “不”
    保存并恢复所有链和规则中的数据包和字节计数器,是:保存计数器的值,没有:(默认值)不保存计数器值。
    IPTABLES_STATUS_NUMERIC = “是”
    输出的IP地址是数字的格式,而不是域名和主机名的形式,是:(默认值)在状态输出中只包括IP地址,没有:在状态输出中返回域名或主机名。
    IPTABLES_STATUS_VERBOSE = “不”
    输出iptables的状态时,是否包含输入输出设备,是:包含,不:(默认值)不包含。
    IPTABLES_STATUS_LINENUMBERS = “是”
    输出iptables的状态时,是否同时输出每条规则的匹配数,是:(默认值)输出,NO:不输出
    
    查看iptables状态时 -v显示更多设置 -n以数字形式显示IP和端口
    [root@sdh ~]# iptables -L -vn
    
    

    7 保护服务器安全

    7.1 常规网络安全设置

    示例
    Web服务器对Internet开放TCP 80端口
    SSH端口只允许指定的网段访问
    默认拒绝所有进入的流量
    
    安装web服务(httpd或者nginx)
    设置防火墙规则
    [root@sdh ~]# iptables -t filter -P INPUT DROP
    [root@sdh ~]# iptables –F
    [root@sdh ~]# iptables -t filter -I INPUT -p -tcp --dport 80 -j ACCEPT
    [root@sdh ~]# iptables -t filter -I INPUT -p -tcp --dport 22-s 192.168.10.123/32 -j ACCEPT
    
    

    7.2 recent模块实现服务器网络安全

    recent这个模块很有趣,善加利用可充分保证您服务器的安全

    设定常用参数

    --name    设定列表名称,默认DEFAULT
    --rsource   源地址,此为默认
    --rdest     目标地址
    --seconds   指定时间内
    --hitcount   命中次数
    --set       将地址添加进列表,并更新信息,包含地址加入的时间戳
    --rcheck    检查地址是否在列表,以第一个匹配开始计算时间
    --update    和rcheck类似,以最后一个匹配计算时间
    --remove   在列表里删除相应地址,后跟列表名称及地址,如果来源端数据已存在,则将其删除,若不存在,则不做任何处理;
    
    

    示例1

    SSH连接60秒内只允许连接2次
    #用来设置多长时间 几次 拒绝
    [root@sdh ~]# iptables -t filter -A INPUT -p tcp --dport 52113 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 60 --hitcount 2 -j DROP
    #连接计数
    [root@sdh ~]# iptables -t filter -A INPUT -p tcp --dport 52113 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
    #如果把链的默认改成了DROP,所以要加上一条建立了会话的数据包 就允许进入
    [root@sdh ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
    

    示例2

    限制TCP 80端口60秒内每个IP只能发起10个新连接,超过记录日记及丢失数据包,可防CC及伪造IP的syn洪水
    [root@sdh ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix "DDOS"
    [root@sdh ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
    [root@sdh ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
    #如果把链的默认改成了DROP,所以要加上一条建立了会话的数据包 就允许进入
    [root@sdh ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
    

    8 设置打开端口的钥匙

    #记录日志,前缀SSHOPEN   (-m length --length 指定数据包大小 ) 
    [root@sdh ~]# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -j LOG --log-prefix "SSHOPEN"
    
    #指定数据包1078 字节(包含IP头部20字节,ICMP头部8字节),将ping请求的包大小为1078字节的数据包的源地址记录到sshopen表
    [root@sdh ~]# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -m recent --set --name sshopen --rsource -j ACCEPT
    
    #检查sshopen表中60秒内的记录如果有源地址则允许访问TCP 的22端口
    [root@sdh ~]# iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 60 --name sshopen --rsource -j ACCEPT
    
    #发送ping包指定数据包1178个字节,将客户端地址从sshopen表中移除,客户端将不能使用tcp的22端口建立连接
    [root@sdh ~]# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 1178 -m recent --remove --name sshopen -j ACCEPT
    #已建立连接允许进入
    [root@sdh ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
    
    #记住将INPUT链默认改成DROP
    [root@sdh ~]# iptables -P INPUT DROP
    
    

    最终 会实现什么样情况呢
    直接去连接我们的主机是连不上了
    我们需要ping一下主机并且要指定数据包为1050(因为IP占20个字节,ICMP占8个字节)

    image.png

    这样我们在60秒内去连就可以连上主机
    那如果我们想断开呢
    根据我们上面的设置ping一下1150


    image.png

    这样我们就连不上啦

    Linux下解锁
    ping -s 1050 47.94.108.119
    
    windows下解锁
    ping -l 1050 47.94.108.119
    

    9.保护子网的安全

    9.1 访问内网的主机端口

    适用于双网卡的主机,用来对子网ip的保护
    把子网主机具体需要打开的端口打开
    ptables -P FORWARD DROP 
    iptables -t filter -I FORWARD -p tcp -dport 3389 -d 192.168.10.110/32 -o eth2 -j ACCPET
    现在能够向目标主机发送请求,但是目标主机无法回应。还要再加一条已建立会话允许通过。
    iptables -t filter -I FORWARD -m state --state ESTABLISHED -j ACCEPT
    
    

    9.2 配置NAT实现网络地址转换

    image.png

    做地址的转换 让内部ip可以通过一个公网ip去上网

    9.3 端口映射

    将公网的ip端口映射到内网ip的端口
    如果内网存在多主机打开同一个端口,就要在公网ip上设置其他的端口去映射
    [root@sdh ~]# iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp --dport 3389 -j DNAT --to-destination 192.168.10.110:3389
    [root@sdh ~]# iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp --dport 4000 -j DNAT --to-destination 192.168.10.222:3389
    
    那如果是映射到web主机上的话,就映射80端口就可以啦
    
    

    10.mangle表的应用案例

    TTL 生存时间值 每经过一个路由就减1  windows默认是128  linux默认是64
    如果不设置TTL的话,当输入一个不存在的ip,路由之间就会不断的来回发包,占用带宽。
    当TTL为0是就会停止继续发包
    
    tracert 可以跟踪一个地址看经过多少个路由,原理就是利用TTL。所以我们要利用mangle表来迷惑那些跟踪我们地址的人。
    

    相关文章

      网友评论

          本文标题:iptables防火墙

          本文链接:https://www.haomeiwen.com/subject/ndakoctx.html