zoukankan      html  css  js  c++  java
  • iptables

    iptables

    iptables

    Firewall:防火墙,隔离工具:工作 于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应处理
    主机防火墙
    网络防火墙

    功能:

    filter:过滤,防火墙:
    nat:network address translation,网络地址转换;
    mang1e:拆解报文,做出修改,封装报文;
    raw:关闭nat表上启用的连接追踪机制:

    链(内置):

    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING

    流入:PREROUTING-->INPUT
    流出:OUTPUT-->POSTROUTING
    转发:PREROUTING-->FORWARD-->POSTROUTING

    各功能的分别实现

    filter:INPUT,FORWARD,OUTPUT
    nat:PREROUTING(DNAT),OUTPUT,POSTROUTING(SNAT)
    mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
    raw:PREROUTING,OUTPUT

    路由发生的时刻
    报文进入本机后
    判断目标主机
    报文发出之前:
    判断由哪个接口送往下一跳

    iptables:四表五链
    添加规则时的考量点:
    (1)要实现哪种功能:判断添加在哪张表上:
    (2)报文流经的路径:判断添加在哪个链上:

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

    功能的优先级次序:raw >> managle >> nat >> filter
    enter description here

    规则

    组成部分:报文的匹配条件,匹配到之后处理动作
    匹配条件:根据协议报文特征指定
    基本匹配条件
    扩展匹配条件
    处理动作
    内建处理机制
    自定义处理机制

    注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;

    iptables:规则管理工具
    添加、修改、删除、显示等;

    规则和链有计数器:
    pkgs:由规则或链所匹配到的报文的个数;
    bytes:由规则或链匹配到的所有报文大小之和;

    iptables [-t table] {-A|-C|-D} chain rule-specification
    iptables [-t table] -I chain [rulenum] rule-specification
    iptables [-t table] -R chain rulenum rule-specification
    iptables [-t table] -D chain rulenum
    iptables [-t table] -S [chain [rulenum]]
    iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
    iptables [-t table] -N chain
    iptables [-t table] -X [chain]
    iptables [-t table] -P chain target
    iptables [-t table] -E old-chain-name new-chain-name
    

    iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET
    iptables 表名 子命令 指定子命令在哪链上 匹配规则进的标准 -j 一但匹配作什么处理

    -t table
    filter nat mangle raw

    链管理

    -F flush 清空规则链 若省略链,表示清空指定表上的所有
    -N new 创建新的自定义规则链,不能重名
    -X drop 删除用户自定义的空的规则链
    -Z zero 清零,重置规则计数器
    -P policy 为指定链设置默认策略,对filter表中的链而言,默认策略通常有ACCEPT,DROP REJECT
    -E rename 重命名自定义链,引用计数不为0的自定义链,无法改名,也无法删除

    规则管理

    -A append 将新规则追加于指定链的尾部
    -I insert 将新规则插入至指定链的指定位置
    -D delete 删除指定链上的指定的规则
    有两种指定方式
    1、指定匹配条件
    2、指定规则编号
    -R replace 替换指定链上的指定规则

    查看

    -L list 列出指定链上的所有规则
    -n numberic 以数字格式显示地址和端口号
    -v verbose 显示详细信息
    -vv -vvv
    --line-numbers 显示规则编号
    -x: exactly 显示计数器结果的结果精确值,不进行单位换算

    匹配条件

    基本匹配
    [!] -s --src --source ip|NETADDR 加!可取反 检查报文中源IP地址是否符合此处指定的地址范围
    [!] -d --dst --destination ip|NETADDR 加!可取反 检查报文中目标IP地址是否符合此处指定的地址范围
    -p --protocol {tcp|udp|icmp} 检查报文中的协议,即ip首部中的protocols所标识的协议
    -i --in-interface IFACE 数据报文的流入接口,仅能用于PREROUTING,INPUT及FORWARD链上
    -o --out-interface IFACE 数据报文的流出接口 仅能用于FORWARD,OUTPUT及POSTROUTING链上

    扩展匹配 -m macth_name --spec_options

    -m tcp --dport 22

    隐式扩展 对 -p protocol指明的协议进行的扩展,可省略-m选项

    -p tcp
    --dport PORT[-PORT] 目标端口,可以是单个端口或连接多个端口
    --sport PORT[-PORT]
    
    iptables -I INPUT -d 192.168.200.102 -p tcp --dport 22 -j ACCEPT
    iptables -I OUTPUT -s 192.168.200.102 -p tcp --sport 22 -j ACCEPT
    

    --tcp-fags LIST1 LIST2 检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0:没有LIST1中指明的,不作检查
    SYN ACK FIN RST PSH URG

    --tcp-flags SYN,ACK,FIN,RST SYN
    --syn 
    
    -p udp 
    --dport
    --sport
    
    -p icmp
    --icmp-type
    可用数字表示其类型
    0 echo-reply  响应ping
    8 echo-request 请求ping
    
    让自己ping别人
    iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 8 -j ACCEPT 
    iptables -A INPUT -d 192.168.200.102 -p icmp --icmp-type 0 -j ACCEPT
    让别人ping自己
    iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -j ACCEPT 
    iptables -A INPUT -d 192.168.200.102 -p icmp --icmp-type 8 -j ACCEPT 
    

    显式扩展 必须使用-m选项指定使用的扩展

    目标
    -j TARGET jump至指定的TARGET
    ACCEPT 接收
    DROP 丢弃
    REJECT 拒绝
    RETURN 返回调用链
    REDIRECT 端口重定向
    LOG 记录日志
    MARK 做防火墙标记
    DNAT 目标地址转换
    SNAT 源地址转换
    MASQUERADE 地址伪装
    ...
    自定义链 由自定义链上的规则进行匹配检查

    iptables -t filter -A INPUT -d 192.168.200.102 -p tcp -j ACCEPT
    iptables -t filter -A OUTPUT -s 192.168.200.102 -p tcp -j ACCEPT 
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
    
    iptables -t filter -A INPUT -d 192.168.200.102 -p icmp -j ACCEPT
    iptables -t filter -A OUTPUT -s 192.168.200.102 -p icmp -j ACCEPT 
    
    iptables -nL --line-number
    iptables -D INPUT 2
    iptables -L -n --line-numbers
    
    
    iptables -A INPUT -d 192.168.200.102 -i ens32 -j ACCEPT 
    iptables -A OUTPUT -s 192.168.200.102 -o ens32 -j ACCEPT
    
    rpm -ql iptables |grep '[[:lower:]]+.so$'
    

    Centos 6 man iptables
    Centos 7 man iptables-extensions

    1、multiport扩展 多端口匹配

    以离散方式定义多端口匹配,最多指定15个端口
    
    [!] --source-ports,--sports port[,port|,port:port]... 指明多个源端口
    [!] --destination-ports,--dports port[,port|,port:port]... 指明多个离散的目标端口
    [!] --ports port[,port|,port:port]... 如果源端口或目标端口等于给定端口之一,则匹配
    
    iptables -I INPUT -s 192.168.200.0/24 -d 192.168.200.102 -p tcp -m multiport --dports 22,80 -j ACCEPT
    iptables -I OUTPUT -d 192.168.200.0/24 -s 192.168.200.102 -p tcp -m multiport --sports 22,80 -j ACCEPT
    

    2、iprange扩展

    指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用
    
    [!] --src-range from[-to] 指明连续的源IP地址范围
    [!] --dst-range from[-to] 指明连续的目标IP地址范围
    iptables -I INPUT -d 192.168.200.102 -p tcp -m multiport --dports 22,23,80 -m iprange --src-range 192.168.200.1-192.168.200.200 -j ACCEPT
    iptables -I OUTPUT -s 192.168.200.102 -p tcp -m multiport --dports 22,23,80 -m iprange --src-range 192.168.200.1-192.168.200.200 -j ACCEPT
    

    3、string扩展

    检查报文中出现的字符串
    
    --algo {bm|kmp}
    bm = Boyer-Moore
    kmp = Knuth-Pratt-Morris 
    
    iptables -I OUTPUT -m string --algo bm --string 'mp4' -j REJECT
    

    4、time扩展

    根据报文到达的时间与指定的时间范围进行匹配
    
    --datestart
    --datestop
    --timestart
    --timestop
    --monthdays
    --weekdays
    
    iptables -I INPUT -d 192.168.200.102 -p tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j REJECT 
    注意:时间是UTC
    

    5、connlimit扩展 并发连接数量

    根据每客户端IP(也可以是地址块)做并发连接数数量匹配:
    -connlimit-above n:连接的数量大于n     默认策略是ACCEPT用这个
    -connlimit-upto n: 连接的数量小于等于n  默认策略是DROP用这个
    
    iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
    

    6、limit扩展
    基于收发报文的速率做检查
    令牌桶过滤器

    --limit rate[/second|/minute|/hour|/day]
    --limit-burst number
    iptables -A INPUT -d 192.168.200.102 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
    iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -j ACCEPT
    

    7、state扩展

    根据连接追踪机制检查连接的状态
    
    调整连接追踪功能所能够容纳的最大连接数量
    /proc/sys/net/nf_conntrack_max
    已经追踪到并记录下的连接(连接模板)
    cat /proc/net/nf_conntrack
    可追踪的连接状态
    NEW:新发出的的请求 连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求
    ESTABLISHEDNEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态
    RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系:
    INVALIED:无法识别的连接,都不是NEWESTABLISHEDRELATED状态
    
    iptables -I INPUT -d 192.168.200.102 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -I OUTPUT -s 192.168.200.102 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
    
    iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -m state --state ESTABSHED -j ACCEPT 
    iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
    
    iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
    iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT 
    iptables -I INPUT 2 -d 192.168.200.102 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
    

    问题:如何开放被动模式的FTP服务

    1、装载FTP追踪时的专用的模块
    /lib/modules/3.10.0-862.el7.x86_64/kernel/net/netfilter
    modinfo nf_conntrack_ftp.ko.xz
    手动装载模块
    modprobe nf_conntrack_ftp
    lsmod|grep ftp
    
    2、放行请求报文
    命令连接 NEW,ESTABLISHED
    数据连接 RELATED,ESTABLISHED
    iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A INPUT -d LocalIP -p tcp -m state --state REALTED,ESTABLISHED -j ACCEPT
    
    3、放行响应报文
    ESTABLISHED
    
    iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
    

    如何保存重载规则
    保存规则至指定文件
    iptables-save > /PATH/TO/SOMEFILE
    从指定文件重载规则
    iptables-restore < /PATH/TO/SOMEFILE

    Centos6

    servier iptables save == iptables-save > /etc/sysconfig/iptables
    
    servier iptables restart == iptables-restore < /etc/sysconfig/iptables
    

    Centos7
    引入了新的iptables前端管理服务工具 firewalld
    firewalld-cmd
    firewalld-config

    若在centos7使用iptables,先禁用firewalld
    systemctl disable firewalld.service

    开启转发
    echo 1 > /proc/sys/net/ipv4/ip_forward
    net.ipv4.ip_forward
    iptablse forward链写规则

    iptables -A FORWARD -d 192.168.200.103 -p tcp --dport 80 -j ACCEPT 
    iptables -A FORWARD -s 192.168.200.103 -p tcp --sport 80 -j ACCEPT
    
    iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT 
    iptables -A FORWARD -d 192.168.200.103 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT 
    
    iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT 
    iptables -R FORWARD 2 -d 192.168.200.103 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT 
    

    nat:Network Address Translation 安全性,网络层+传输层
    proxy:代理,应用层

    nat

    snat 只修改请求报文的源地址
    dnat 只修改请求报文的目标地址

    nat表
    PREROUTING:DNAT
    OUTPUT
    POSTROUTING:SNAT

    源地址转换

    enter description here

    1543291319677.jpg

    iptables -t nat -A POSTROUTING -s LocalNet ! -d LocalNet -j SNAT --to-source ExternalIP
    iptables -t nat -A POSTROUTING -s LocalNet ! -d LocalNet -j MASQUERADE
    iptables -t nat 路由后 -s client/24 ! -d client/24 -j SNAT --to-source 确定转发的网卡的IP地址
    iptables -t nat -A 路由后 -s client/24 ! -d clients/24 -j MASQUERADE
    
    webserver 
    ifconfig ens32 192.168.200.103/24 up
    systemctl start httpd
    tail -1 /var/log/httpd/access_log
    #route add -net 192.168.1.0/24 gw 192.168.200.102
    #route del -net 192.168.1.0/24
    #tcpdump -i ens32 host 192.168.200.103收到报文回不去
    
    snat
    ifconfig ens32 192.168.200.102/24 up
    ifconfig ens33 192.168.1.254/24 up
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 192.168.200.102
    #iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    
    client
    ifconfig ens32 192.168.1.2/24 up
    route add default gw 192.168.1.254
    curl http://192.168.200.103/
    

    目标地址转换

    enter description here

    1543291250758.jpg

    iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT -to-destination InterServerIP[:PORT]
    iptables -t nat  -A 路由前 -d VIP -p tcp|udp --dport -PORT -j DNAT -to-destination 内网IP[:PORT]
    
    webserver
    ifconfig ens32 192.168.1.2/24 up
    tailf /var/log/httpd/access_log
    
    dnat
    ifconfig ens32 192.168.200.102/24 up
    ifconfig ens33 192.168.1.254/24 up
    iptables -t nat -A PREROUTING -d 192.168.200.102 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080
    
    client
    ifconfig ens32 192.168.200.103
    curl http://192.168.200.102/
    

    创建一个自定义链

    iptables -N clean_in
    iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP  去掉广播PING
    iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP 
    iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP 丢弃非法(伪装)的包
    iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP 
    iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
    iptables -A clean_in -d 192.168.1.1 -j RETURN 返回主链继续匹配
    iptables -A INPUT -d 192.168.1.1 -j clean_in 访问目标地址为192.168.1.1的指定一个规则链clean_in ,若没有匹配项,返回(跳出clean_in)继续匹配
    iptables -A INPUT -i lo -j ACCEPTLo进来允许
    iptables -A OUTPUT -o lo -j ACCEPTLo出去允许 
    iptabels -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP 用不到的服务禁掉
    iptabels -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
    iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
    iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
    iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPTICMP做速率限制每秒不超过10个
    

    利用iptables的RECENT模块来抵御DOS攻击:22建立一个列表,保存有所有访问过指定的服务的客户端的IP

    iptables -I INPUT -p tcp --dport 22 -m conmlimit --conmlimit-above 3 -j DROP
    iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
    iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach:"
    iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
    

    1.利用connlimit模块将单P的并发设置为3:会误杀使用NAT上网的用户,可以根据实际情况增大该值:
    2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。

    1.第二句是记录访间tcp 22端口的新连接,记录名称为SHH
    -set 记录数据位的来源IP,如乘IP已经存在将更新已盛存在的条日
    2.第三句是抛5st记录中的[P,300s内发起超过3次连接则推绝此IP的
    -update是指每次建立连接都更新列表:
    ·seconds必须与…rcheck成者update间时使用一hitcount必美与…rcheck或着-update同时使用
    3.iptables的记录:/proc/net/xt.recent/SSH
    也可以使用下面的这句记录日志

    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
    
  • 相关阅读:
    Devops运维交流群
    CentOS7.5下二进制安装MySQL5.7.26
    CentOS7.5安装MySQL8.0.18简易流程
    Kubernetes中的Pod生命周期详解
    Linux系统发行版本及其区别
    数据库设计
    Vue 起步
    CSS 中的伪类和伪元素
    百度智能云虚拟主机 Typecho 分类功能失效 | 开启伪静态地址
    C#开发BIMFACE系列39 网页集成开发3:审图系统中三维模型比对
  • 原文地址:https://www.cnblogs.com/fina/p/10025646.html
Copyright © 2011-2022 走看看