iptables表规则

Posted by FanHao on 2023-06-15

iptables表规则

  1. 链上规则的次序,即为检查的次序
    同类规则(访问同一应用),匹配范围小的放上面;
    不同类规则(访问不同应用),匹配到报文频率较大的放上面;
    将那些可由一条规则描述的多个规则合并为一个;
    设置的默认策略(policy);

  2. 规则
    规则由匹配条件和处理动作组成。
    匹配条件一般为协议、源地址、目的地址、源端口、目的端口;还有一些扩展条件,但需使用内核扩展模块。
    处理动作:一般有内置动作和自定义动作。在iptables中,动作一般称之为target。
    内置动作:ACCEPT、DROP、REJECT、LOG、QUEUE、RETURN、REDIRECT、MARK、DNAT、SNAT、MASQUERADE

  3. 内置动作详解
    ACCEPT:接收数据包
    DROP:丢弃数据包,不响应
    REJECT:拒绝数据包,返回拒绝消息
    LOG:记录日志信息,用于定位错误信息
    RETURN:停止执行当前链中的后续规则,并返回到调用链 (父链)执行
    REDIRECT:重定向
    MARK:内核标记数据包,不影响实际包内容
    DNAT:目的地址转换
    SNAT:源地址转换
    MASQUERADE:地址伪装,SNAT一种方式,动态IP。
    TTL:修改time to live 的值
    TOS:设置IP 头中的Type of Service 字段

iptables命令

  1. 常见命令
    帮助命令:iptables –h
    查看规则命令: iptables -t nat -nvL #查看nat表的所有链规则详细信息
    查看规则命令: iptables -t filter -nvL FORWARD #查看filter表的FORWARD链规则详细信息
    改变FORWARD链默认策略为DROP:iptables -t filter -P FORWARD DROP
    INPUT链末尾添加规则:iptables -A INPUT –dport 80 -j DROP
    INPUT链第一规则前插入规则: iptables -I INPUT 1 –dport 80 -j ACCEPT
    删除INPUT链规则:iptables –D INPUT –dport 80 -j DROP
    删除INPUT链第1条规则: iptables –D INPUT 1
    清空INPUT链默认表filtre规则:iptables -F INPUT
    清空iptables默认filter表的规则: iptables -F
    新建自定义链,不指定表时默认为filter表:iptables -N test_chain
    nat表新建自定义链: iptables -t nat -N testchain

  2. 命令OPTIONS
    (1)添加规则时的Option匹配之通用匹配:

    1
    2
    3
    4
    5
    6
    IPv4/ipv6: -4  -6
    协议类型tcp/udp/icmp: -p tcp
    源地址:-s 192.168.100.1/32 或者 192.168.0.0/255.255.0.0
    目的地址:-d 192.168.1.1 (参考源地址)
    匹配进入的接口:-i eth0
    匹配出去接口:-o ppp0

    (2)添加规则时的Option匹配之隐式匹配:

    1
    2
    3
    匹配tcp包端口:iptables -A  INPUT -p tcp --sport 22     (UDP端口匹配同理)
    匹配tcp标记:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
    ICMP type匹配: iptables –A INPUT –p icmp --icmp-type 8

    (3)添加规则时的Option匹配之显式匹配:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    匹配包数率Limit:iptables -A INPUT -m limit  --limit  3/second
    匹配包源/目的MAC:iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
    Mark标记: iptables -t mangle -A INPUT -m mark --mark 1
    Multiport多端口:iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110(参考源地址)
    Owner匹配,用户ID、组ID、进程ID、会话ID:iptables -A OUTPUT -m owner --pid-owner 78
    State:iptables -A INPUT -m state --state RELATED,ESTABLISHED
    TOS:iptables -A INPUT -p tcp --sport 22 (UDP端口匹配同理)
    TTL:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
    ICMP type匹配: iptables –A INPUT –p icmp --icmp-type 8
  3. 命令实例
    Jumps/Targets:这个参数对应了我们iptables规则匹配到数据包之后,需要对数据包执行的动作。
    这个动作包括:跳转到自定义子链中继续匹配或执行规则默认动作( ACCEPT 、DROP等)
    规则实例1:DNAT,在PREROUTING链实现nat功能

    1
    iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport  80 -j DNAT --to-destination 192.168.1.1-192.168.1.10

    实例2:SNAT,在POSTROUTING链实现nat功能

    1
    iptables -t nat -A POSTROUTING -p tcp -o eth0 -j  SNAT  --to-source 194.236.50.155-194.236.50.160:1024-32000

    实例3: MASQUERADE ,在POSTROUTING链实现nat功能

    1
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o  ppp0  -j MASQUERADE

    实例4:ACCEPT,在INPUT链的子链上实现filter功能

    1
    iptables  -t  filter  -I aclblock   1   -p icmp  -i  !br0   -j   ACCEPT

    实例5:DROP,在INPUT链实现filter功能

    1
    iptables  -t  filter  -I aclblock   1   -p tcp  --sport  21  -i  br0   -j   DROP

启用iptables规则

以下以centos系统为例

  1. Centos6
    1
    2
    3
    4
    查看防火墙运行状态:service  iptables   status
    停止/启动防火墙:service iptables stop/start
    开机自启动/关闭(永久关闭):chkconfig iptables on/off
    重启生效:service iptables restart
    iptabels配置文件路径
    1
    /etc/sysconfig/iptables
    终端中手动输入iptables规则命令,然后使用如下命令保存至iptables文件中
    1
    service iptables  save
  2. Centos7
    centos7中默认使用防火墙firewall,而不再是iptables过滤数据包
    1
    2
    3
    4
    5
    6
    帮助命令:firewall-cmd  -h
    查看防火墙运行状态:firewall-cmd --state
    查看开放的端口: firewall-cmd --list-port
    开放指定端口:firewall-cmd --add-port=8000/tcp –permanent #permanent永久生效
    配置生效:firewall-cmd --reload
    查看所有:firewall-cmd --list-all
    若想重新启用iptables;安装iptables服务
    1
    yum -y install iptables-service
    禁用firewall
    1
    2
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    启用iptables
    1
    2
    systemctl  start iptables
    systemctl enable iptables