iptables

iptables不是服务,单有服务脚本,service iptables status ,服务脚本的主要作用在于管理保存的规则。装载及移除iptables/netfilter相关的内核模块:iptables_nat,iptables_filter,iptables_mangle,iptables_raw,ip_nat,ip_conntrack

规则:匹配标准,处理动作

iptables [ -t TABLE ] COMMAND CHAIN [num] 匹配条件 -j 处理办法

TABLE:4表
    filter:过滤,省略时默认为filter。
    nat:地址转换
    mangle:拆包,修改数据再封装
    raw:关闭nat表上的连接追踪机制

优先级:raw-》mangle-》nat-》filter

 

CHAIN:5规则链(当作为主机防火墙时,过滤包都可以在FORWARD链上做)
  过滤:filter表
    INPUT,OUTPUT,FORWARD:
  地址转换:nat表
    PREOUTING:进 POSTROUTING:出 OUTPUT:
  其他处理:mangle表,可以拆包,修改包中其他数据
    INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
  原始格式:raw表,将包恢复到原始情况
    PREROUTING,OUTPUT

同类规则,匹配范围小的放上面
不同类规则,匹配到报文频率较大的放上面
将可由一条规则描述的多条规则合并为一个
设置默认策略

 

COMMAND:命令
  管理规则:
      -A:附加一条规则,添加在链的尾部
      -I CHAIN[num]:插入一条规则,插入为对应CHAIN上的第num条,num省略表示第一条
      -D CHAIN[num]:删除指定链中的第num条规则
      -R CHAIN[num]:替换指定的规则
  管理链:这里面所有的规则都可以-t指定表,不指定默认是filter;同样可以指定链,不指定代表所有。
      -F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链

[root@test ~]# iptables -F

      -P CHAIN:设定指定链的默认策略ACCEPT,DROP,REJECT

[root@test ~]# iptables -P FORWARD DROP

      -N:自定义一条空链

[root@test ~]# iptables -N new_chain

      -X:删除一条自定的空链,centos7默认会有很多自定义链,可以直接删除

[root@test ~]# iptables -X

      -Z:置零指定链中所有规则的计数器

[root@test ~]# iptables -Z

      -E:重命名自定义的链,正在使用的链无法改名无法删除

[root@test ~]# iptables -E new_chain old_chain

   查看类:
      -L:显示指定表中的规则
        -n:以数字格式显示主机地址和端口号
        -v:显示链及规则的详细信息
        -vv:更详细
        -vvv:更更详细
        -x:在详细显示时,显示精确值
        --line-numbers:显示规则号码

[root@test ~]# iptables -L -n -v -x --line-numbers

 

 匹配条件:
  通用匹配:自身就可以完成的匹配
    -s | --src  1.1.1.1:指定源地址
    -d | --dst  1.1.1.1:指定目标地址
    -p {tcp|udp|icmp}:指定协议
    -i 进接口:指定数据报文流入的接口,lo代表环回口,可以用于定义标准的链,PREOUTING,INPUT,FORWARD
    -o 出接口:指定数据报文流出的接口,lo代表环回口,可以用于定义标准的链,POSTROUTING,OUTPUT,FORWARD
  扩展匹配:需要依靠扩展模块来完成的匹配
    隐含扩展:不用特别指明由哪个模块进行的扩展,因此此时可以使用-p {tcp|udp|icmp}
        -p tcp
           --sport PORT[-PORT]:源端口,或连续源端口
           --dport PORT[-PORT]:目标端口
           --tcp-flags mask comp:comp表中出现的标识位必须为1,comp没有而mask有的必须为0.例如,--tcp-flags SYN,FIN,ACK,RST SYN  代表SYN必须为1,其他必须为0,这条规则可以简写为--syn,tcp三次握手中的第一次。

        -p icmp
          --icmp-type 0:echo-reply,应答报文,在INPUT表中就代表"对端回应"的报文;在OUTPUT表中就代表"回应对端"的报文。
          --icmp-type 8:echo-request,请求报文,在INPUT表中就代表"对端请求"的报文;在OUTPUT表中就代表"请求对端"的报文;
            (出8进0代表ping出去的一对;进8出0代表对端请求的一对)
        -p udp
          --sport
          --dport

    显示扩展:使用额外的匹配机制;必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
        -m 扩展模块 --spec-opttions
          state:状态扩展,结合ip_conntrack追踪会话的状态.
            --state NEW:新连接请求
            --state ESTABLISHED:已建立的连接
            --state INVALID:非法连接请求
            --state RELATED:相关联的
/proc/sys/net/nf_conntrack_max:调整链接追踪功能所能够容纳的最大连接数量
/proc/net/nf_conntrack:已经追踪并记录下的连接
/proc/sys/net/netfilter:不同协议或连接类型追踪时长

          multiport:离散多端口匹配扩展
            --source-ports:源端口集合,用逗号分开
            --destination-ports:目标端口集合,用逗号分开
            --ports:端口集合,用逗号隔开
          iprange:ip地址组
            --src-range:源IP集合,用横杠相连
            --dst-range:目的IP集合,用横杠相连
            (例,-m iprange --src-range 1.1.1.1-1.1.1.100)
          connlimit:单个ip连接数限制
            --connlimit-above #:连接数量超过多少个,通常加上!取反
            --connlimit-upto #:连接数量少于等于多少个
          limit:限制连接数
            --limit [/second|/minute|/hour|/day]:限制每秒/分/时/天的连接数
            --limit-burst:限制单次最大连接数
          string:字符串过滤
            --algo {bm|kmp} --string "STRING":选择一种算法,过滤STRING字符串
          time:根据报文到达的时间与指定的时间范围进行匹配
            --timestart 00:00 :起始时间
            --timestop 23:59 :结束时间
          recent:安全模块,可以限制暴力破解密码
            --name:设定匹配的列表名称
            --rsource:匹配源地址,默认选项
            --rdest:匹配目的地址
            --seconds:在多长时间内
            --hitcount:匹配到的次数
            --set:将匹配到的内容加入列表
            --rcheck:从第一个匹配到的地址开始计算时间,检查
            --update:从最后一个匹配到的地址计算时间,检查
            --remove:在列表里删除相应地址,后跟列表名称及地址
            (例:设定表明为SSS,单个ip30秒内超过5次ssh就拒绝。
            iptables -A INPUT -p tcp --dport 22 -m recent --name SSS --set
            iptables -A INPUT -p tcp --dport 22 -m recent --seconds 30 -hitcount 5 --name SSS --recheck -j DROP)

处理办法

  -j :
    ACCEPT:允许通过
    DROP:丢弃
    REJECT:拒绝
    DNAT:目标地址转换
      --to-destination 1.1.1.1[:port]:把目的地址转换为1.1.1.1,或者转换成另一个端口,PNAT,port nat
    SNAT:源地址转换
      --to-source 1.1.1.1[-1.1.1.5]:把源地址转换为1.1.1.1,或者是一个地址范围
      MASQUERADE:动态的转换成某个地址,效率低
    REDIRECT:端口重定向
    MASQUERADE:地址伪装
    LOG:记录日志信息,不做放行或丢弃处理
      --log-prefix “STRING”:记录日志时添加前缀(例:记录ping包:iptables -I INPUT -d 192.168.1.2 -p icmp -j LOG --log-prefix "----------")

 

装载模块: modprobe nf_conntrack_ftp

 

 

允许1.1.1.1主机到2.2.2.2主机的ssh访问
iptables -A INPUT -s 1.1.1.1 -d 2.2.2.2 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 2.2.2.2 -s 1.1.1.1 -p tcp --sport 22 -j ACCEPT

只允许从eth0接口进来的ping请求
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT

允许9000和10000到11000的多端口
iptables -A INPUT -p tcp -m multiport --sports 9000,1000:11000 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 9000,1000:11000 -j ACCEPT

允许1.1.1.1到1.1.1.10访问
iptables -A INPUT -m iprange --src-range 1.1.1.1-1.1.1.10 -j ACCEPT
iptables -A OUTPUT -m iprange --dst-range 1.1.1.1-1.1.1.10 -j ACCEPT

不允许任何人请求带有SOS字符串的网页
iptables -A OUTPUT -m string --algo bm --string 'SOS' -j REJECT

限制主机22点到24点不许访问
iptables -A INPUT -m time --timestart 22:00 --timestop 23:59 -j REJECT
单个ip访问网页限制两个连接
iptables -A INPUT -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT

一分钟允许ping5次
iptables -A INPUT -d 1.1.1.1 -p icmp -m limit --limit-burst 5 --limit 5/minute -j ACCEPT

使用连接追踪来放行21,22和80端口
iptables -A INPUT -d 1.1.1.1 -m state --state RELATED,ESTABLISHED -j ACCEPT #放在第一条做优化匹配
iptables -A INPUT -d 1.1.1.1 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT #任何已经连接的都放行


 

 

打开防火墙的转发功能
临时:echo 1 > /proc/sys/net/ipv4/ip_forward
永久:vim /etc/sysctl.conf 将下面改成1 net.ipv4.ip_forward = 1  之后sysctl -p

保存配置:
  service iptables save:保存在/etc/sysconfig/iptables
  iptables-save > /aaaa.iptables:将配置保存至指定位置
  iptables-restore < /aaaa.iptables:读取配置

ip_conntrack:此模块是用来确定有请求才给回复的,防止服务器中毒后,自己给某个地址发报文。开启此模块后会生成一个连接表/proc/net/ip_conntrack,每一个连接都会记录,最大连接数在/proc/sys/net/ipv4/ip_conntrack_max下。由于这些记录都在内存中,所以当连接数大时,非常耗资源。   

条件取反可以使用!   例:-s !1.1.1.1 

自定义链的调用和返回
  iptables -N NEW_CHAIN         ##生成一个新链
  iptables -A NEW_CHAIN -j DROP    ##给链添加规则
  iptables -A NEW_CHAIN -j RETURN   ##当链没有匹配到的时候返回主链 
  iptables -A INPUT -j NEW_CHAIN    ##在主链中调用新链

利用防火墙抵御DOS攻击
  iptables -I INPUT -d 192.168.1.2 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSHH     #设定表名并记录
  iptables -I INPUT 2 -d 192.168.1.2 -p tcp --dport 22 -m state --state NEW -m recent --update --second 30 --hitcount 3 --name SSHH -j DROP   #30秒内超过3次登陆就锁定

源地址转换(内网上网)
iptables -t nat -A POSTROUTING -s 内网地址 ! -d 内网地址 -j SNAT --to-source  出口ip
iptables -t nat -A POSTROUTING -s 内网地址 ! -d 内网地址 -j MASQUERADE (地址伪装,当没有固定ip上网时使用)

目标地址转换(外网访问内网)
iptables -t nat -A PREROUTING -d 出口ip -p tcp|udp --dport 端口 -j DNAT --to-destination 内网ip[:端口]

 

 

posted @ 2018-04-08 18:02  ForLivetoLearn  阅读(267)  评论(0编辑  收藏  举报