4个功能表:raw、mangle、nat(网络地址转换)、filter(过滤);每个表都有Chain(链)

  1. 编辑内核配置文件,开启转发
    vim /etc/sysctl.conf
    #设置
    net.ipv4.ip_forward = 1
    net.ipv4.conf.default.rp_filter=1
    #即rp_filter参数有三个值,0、1、2,具体含义:
    #0:不开启源地址校验。
    #1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
    #2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
    #开启rp_filter参数的作用
    #1. 减少DDoS攻击
    #校验数据包的反向路径,如果反向路径不合适,则直接丢弃数据包,避免过多的无效连接消耗系统资源。
    #2. 防止IP Spoofing
    #校验数据包的反向路径,如果客户端伪造的源IP地址对应的反向路径不在路由表中,或者反向路径不是最佳#路径,则直接丢弃数据包,不会向伪造IP的客户端回复响应。
    #使内核生效
    sysctl -p
  2. 查看filter表
    iptables -t filter -nvL
    #每1秒查看变化
    watch -n1 iptables -t filter -nvL

iptables的filter表(包过滤)基本语法

  • 语法构成

    iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
    #如:阻止ping测试
    [root@localhost~]iptables -t filter -I INPUT -p icmp -j REJECT
    [root@localhost~]iptables -I FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j DROP

几个注意事项

  • 不指定表名时,默认指filter表
  • 不指定链名时,默认指表内的所有链
  • 除非设置链的默认策略,否则必须指定匹配条件
  • 选项、链名、控制类型使用大写字母,其余均为小写

数据包常用控制类型

  • ACCEPT:允许通过
  • DROP:直接丢弃,不给出任何回应
  • REJECT:拒绝通过,必要时会给出提示
  • LOG:记录日志信息,然后传给下一条规则继续匹配

添加新的规则

  • -A:在链的末尾追加一条规则

  • -I:在链的开头(或指定序号)插入一条规则

    [root@localhost~]iptables -t filter -A INPUT -p tcp -j ACCEPT
    [root@localhost~]iptables -I INPUT -p udp -j ACCEPT
    [root@localhost~]iptables -I INPUT 2 -p icmp -j ACCEPT #-p用来指定协议

查看规则列表

  • -L:列出所有规则条目

  • -n:以数字形式显示地址、端口等信息

  • -v:以更详细的方式显示规则信息

  • --line-numbers:查看规则时,显示规则的序号

    [root@localhost~]iptables -t filter -nvL --line-numbers

删除、清空规则

  • -D:删除链内指定序号(或内容)的一条规则

  • -F:清空所有规则

    [root@localhost~]iptables -D INPUT 3
    [root@localhost~]iptables -n -L INPUT
    [root@localhost~]iptables -F
    [root@localhost~]iptables -t nat -F
    [root@localhost~]iptables -t mangle -F
    [root@localhost~]iptables -t raw -F

设置默认策略

  • -P:为指定的链设置默认规则

    [root@localhost~]iptables -t filter -P FORWARD DROP
    [root@localhost~]iptables -P OUTPUT ACCEPT 
    #默认策略要么时ACCEPT,要么是DROP

规则匹配条件

  • 通用匹配

    可直接使用,不依赖于其他条件或扩展

    包括网络协议、IP地址、网络接口等条件

  • 隐含匹配

    要求以特定的协议匹配作为前提

    包括端口、TCP标记、ICMP类型等条件

  • 显式匹配

    要求以“-m扩展模块”的形式明确指出类型

    包括多端口、MAC地址、IP范围、数据包状态等条件

常用的通用匹配条件

  • 协议匹配:-p 协议名

  • 地址匹配:-s 源地址(0.0.0.0/0) -d 目的地址(0.0.0.0/0)

  • 接口匹配:-i 入站网卡 -o 出站网卡

    [root@localhost~]iptables -I INPUT -p icmp -j DROP
    [root@localhost~]iptables -A FORWARD ! -p icmp -j ACCEPT
    [root@localhost~]iptables -A FORWARD -s 192.168.1.11 -j REJECT
    [root@localhost~]iptables -I INPUT -s 10.20.30.0/24 -j DROP
    [root@localhost~]iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP

常用的隐含匹配条件

  • 端口匹配:--sport 源端口 --dport 目的端口

  • TCP标记匹配:--tcp-flags 检查范围 被设置的标记

  • ICMP类型匹配:--icmp-type ICMP类型

    [root@localhost~]iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
    [root@localhost~]iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
    [root@localhost~]iptables -A INPUT -p icmp --icmp-type 8 -j DROP #8请求
    [root@localhost~]iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #0回显
    [root@localhost~]iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #3不可达
    [root@localhost~]iptables -A INPUT -p icmp -j DROP

常用的显式匹配条件

  • 多端口匹配:-m multiport --sport 源端口列表 /-m multiport --dport 目的端口列表

  • IP范围匹配:-m iprange --src-range IP范围

  • MAC地址匹配:-m mac --mac-source MAC地址

  • 状态匹配:-m state --state 连接状态

    [root@localhost~]iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
    [root@localhost~]iptables -P INPUT DROP
    [root@localhost~]iptables -A INPUT -p tcp -m multiport --dport 80 -j ACCEPT
    [root@localhost~]iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
    [root@localhost~]service vsftpd start
    [root@localhost~]ss -antpl |grep 21 #查看端口是否打开

iptables自定义链增加和删除

#新建一条自定义链SSAUDIT
iptables -t filter -N SSAUDIT
#删除自定义链
iptables -t filter -D OUTPUT -j SSAUDIT
iptables -t filter -F SSAUDIT
iptables -t filter -X SSAUDIT

Debian下保存iptables服务器防火墙规则

CentOS下,能够 根据service iptables save立即保存;假如未设置开机运行,可应用chkconfig –level 345 iptables on设置

文中的思路很简单,就是说根据建立自启动脚本制作修复以前的iptables设置

  1. 保存iptables目前规则到/etc/iptables.up.rules

    [root@localhost~]iptables-save > /etc/iptables.up.rules
  2. 创建开机启动载入文档/etc/network/if-pre-up.d/iptables

    [root@localhost~]vi /etc/network/if-pre-up.d/iptables

    键入以下几点

    #!/bin/bash
    /sbin/iptables-restore < /etc/iptables.up.rules
  3. 让文档具有实行管理权限

    chmod +x /etc/network/if-pre-up.d/iptables

iptables的nat表(网络地址转换)

有3个Chain:PREROUTING(路由前位置规则)、POSTROUTING(路由后位置规则)、OUTPUT(输出)

  1. snat源地址转换(内网主机访问外网服务器)
    优效截图20211211213500.png
    [root@localhost~]iptables -F FORWARD #清除转发规则限制,允许所有数据转发
    [root@localhost~]iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.1.0/24 -j SNAT --to-source 12.34.56.78
    [root@localhost~]ifdown eth1
    [root@localhost~]ifup eth1
    //如果网关IP(12.34.56.78)不固定,可以使用以下规则
    [root@localhost~]iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.1.0/24 -j MASQUERADE #伪装
    [root@localhost~]iptables -t nat -D POSTROUTING 1
  2. dnat目标地址转换(外网主机访问内网服务器)
    优效截图20211211215530.png
    优效截图20211211224907.png
    [root@localhost~]iptables -t nat -A PREROUTING -i eth1 -d 12.23.56.80 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:8080