iptables 订阅
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。 [1] 展开全文
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。 [1]
信息
版    本
Red Hat Linux 7.1
有效状态
ESTABLISHED 、 INVALID
组    件
netfilter 和 iptables
中文名
iptables
优    点
配置有状态的防火墙
外文名
iptables
IPTABLES历史版本
与Linux内核各版本集成的防火墙历史版本:2.0.X内核:ipfwadm2.2.X内核:ipchains2.4.X内核:iptables
收起全文
精华内容
下载资源
问答
  • iptables

    千次阅读 2018-07-05 11:39:08
    1.iptables防火墙   1,selinux(生产中也是关闭的),ids入侵检测,md5指纹。 2,iptables(生产看情况,内网关闭,外网打开)大并发的情况,不能打开防火墙,影响性能,硬件防火墙。 安全优化 1,尽可能的...

    1.iptables防火墙

     

    1,selinux(生产中也是关闭的),ids入侵检测,md5指纹。

    2,iptables(生产看情况,内网关闭,外网打开)大并发的情况,不能打开防火墙,影响性能,硬件防火墙。

    安全优化

    1,尽可能的不给服务器配置外网IP,可以通过代理转发,或者换通过防火墙映射。

    2. 并发不是特别大的情况并在有外网IP的环境下,开启iptables防火墙。

    1.2 iptabbles基础

     

    OSI7层模型以及不同层次对应那些协议

    TCP/IP的三次握手,四次挥手,TCP HRADER

    常用的服务端口要了如指掌

    1.3 iptables防火墙简介

           iptables又可以称作为netfilter,是Linux/Unix自带的一款优秀的且开放源代码的完全自由的基于包过滤的防火墙工具,他的功能十分的强大,使用非常的灵活,可以对流入和流出的数据包进行很精细的控制。特别它可以在一台硬件很 低的机器上跑的很好,提供近400人的上网读取,好不逊色企业级专业路由器防火墙。iptables主要工作在OSI七层的二三层和四层,如果重新编译内核iptables也可以支持7层控制。

    1.3 iptables工作流程

    iptables采用数据包过滤机制来工作,所以他会对请求的数据包的包头数据进行分析,并根据我么预先设定的规则进行匹配来决定是否可以进入主机。

    iptables 工作流程小结

     

    防火墙是一层层过滤的,实际是按照配置规则自上而下进行的,从前到后进行过滤的。

    如果匹配上规则,即明确表示是阻止还是通过,此时的数据包就不在进行下面的匹配了。

    如果所有规则中没有明确是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到到匹配到默认规则(默认规则会明确表明是通过还是阻止)。

    防火墙的默认规则是对应链的所有的规则 执行完才会执行的。

    1.5 iptables专业名词

     

    容器:包含和被包含的关系   

    iptables是表的容器

    iptables包含四张表

    表是链的容器,每个表中都包含着若干个链

    链是规则的容器,真正的过滤规则是属于链里面的,

    规则,是iptables一系列过滤信息的规范和具体方法

    真正的规则是属于链里面的

    形象比喻

    iptables====国家

    表    =====省

    链    =====市

    规则   =====县级

     

    2 .iptables的表(tables)和链(chains)

    2.1 简介

    默认的情况下,iptables根据功能和表的定义划分包含的三个表,filter,nat,mangle,其每张表又包含不同的操作链(chains)

    2.2 表和链的对应关系

     

         iptables  表  filter  nat  mangle  raw

         chain     链  INPUT FORWARD OUTPUT PRETOUTING POSTROUTING

         policy    规则 端口IP协议等各式各样的规则

     

    filter表 真正的防火墙 INPUT FORWARD OUTPUT  三张链

    NAT表  数据包的改写 网关共享上网,IP和端口的映射 OUTPUTPREROUTING POSTROUTING 三张表

    mangel   不常用  路由包的改写。INPUT FORWARD OUTPUTPREROUTING POSTROUTING,不常用 路由的标记等

    RAW   不常用

    2.3 filter表

     

    主要和主机自身有关,真正负责主机防火墙功能(过滤流入,流出,主机的数据包)。filter是主机默认使用的表。这表定义了三个链。生产场景单台,服务器的防火墙功能全靠这张表

     

    INPUT:负责过滤进入主机的数据包

    FORWARD:负责转发流进主机的数据包,起转发的作用,和NAT关系很大,后面会详细介绍,LVSNAT模式。路过 net.ipv4.ip_forward=0  内核模块

    OUTPUT : 处理所有源地址就是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包

    对filter表的控制是我们实现主机防火强的重要功能,特别是对INPUT链的控制。

    2.4 nat表

     

    负责网络地址转换,即来源与目的ip地址和port的转换。

    应用:和主机本身无关,防火墙一般不用nat,一般用于局域网共享上网或者特殊的端口和ip的转换服务相关

    一般企业工作场景:

    1,用于做企业路由(zebra)或网关(ipbles),共享上网,POSTROUTING链起关键作用

    2,做内部外部IP地址一对一映射,通过iptables防火墙映射到内部服务器

    3,web,单个端口映射,直接映射80端口,这个表定义了三个链,nat功能 就相当于网络的acl控制。和网络交换机acl类似。

    4,OUTPUT:和主机发出去的数据包有关,改变主机发出去数据包的目的地址

    5,PREROUTING: 在数据包到防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址,目的端口的等(等于是收到信的时候,根据规则重写收件人的地址)打仗先锋。

     

    6     PSOTROUYING: 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,端口等(好比,就是寄邮件,写好发件人的地址,要让人家回信时能有地址可回)。举例:我们现在的笔记本和虚拟机都是10.0.0.0/24,就是出网的时候被我们企业路由器吧源地址改成了公网地址,生产应用:局域网共享上网,军队断后的部队,离开防火墙的最后一道关。

     

    2.5 iptables表和链工作的流程

     可用北京1.2号地铁老表述

     

    数据包进入流程:

    nat PREROUTING   端口 IP转换 核心要控制的

    filter INPUT   进去主机,防火墙核心要控制的的链

    nat OUTPUT    

    filter OUTPUT  出主机,核心要控制的。

    流进主机的包

    FORWARD

    1号线:主要时NAT功能,

    企业案例  1,局域网上网共享路由和网关。NAT POSTTOUTING  出网

             2,外部IP和端口映射成为内部的IP和端口 使用NAT 的 PREROUTING 链

    2号线:主要时filter功能,指的就是防火墙的功能,filterINPUT FORWARD(转发)

    企业案例: 主要指的就是企业当中的防火墙

     

    3 iptables常用命令  基于filter表

    3.1 常用命令

     

    iptables -F  清楚所有规则,不会清理默认的规则

    iptables -X  删除用户自定义的链  自己创建 链 再配置相应的规则

    iptables -Z   链的计数器清零   

    iptables-V   显示版本默认 Linux自带iptables防火墙

    iptables -h   查看帮助

    iptables -P   更改默认规则

    iptables -p    协议(tcp udp icmp all) 不加的情况默认是all

    iptables -nL   列表形式显示默认表的所有信息 L list 列表 -n number 数字

    iptables -t    指定表   -t      tables  表

    iptables -s     指定源地址-s source

    iptables -i      input  匹配进入的端口

    iptables -o     output  匹配出去的端口

    iptables -A    添加规则到指定链的结尾,最后一条

    iptables -I     添加规则到指定链的开头第一条  优先的使用 -I

    iptables --deport     目标端口 到哪里去的

    iptables  --prot    指定 源端口 从哪里来的

    iptables -D  指定链指定 序号 进行 删除

    netstat -lntup|grep ssh  ss -lntup|grep ssh  lsof -i:22 查看ssh对饮端口要服务的关系 

    iptables -nL --line-number 显示链下面规则对饮的序号,便于删除。

     

    3.2 模块加载

     

      modprobe ip_tables

      modprobe iptables_filter

      modprobe iptables_nat

      modprobe ip_conntrack

      modprobe ip_conntrack_ftp

      modeprobe ip_nat_ftp

      modprobe ipt_state

    解析默认的filter表 INPUT 默认的规则是 ACCEPT 接受  

    使用 /etc/init.d/iptables status 查询效果和iptables -nL  是一样的 

    如何查看Linux加载的模块  

    lsmod  | grep"nat|filter" 

     

    3.3 全命令,在服务端禁止掉,客户端ssh的访问

    iptables -t filter -A INPUT -p tcp --dport 22 -j DORP  也可以不指定表 默认是filter 表

    iptables -t 指定表

    Iptables -A 添加规则到指定链的结尾,最后一条  append 添加

    iptables -I   是添加规则到指定链的开头,第一条 insert 插入 插到第一行 首先执行

    iptables -p   指定协议  默认 不写 指的所有端口 

    iptables -J 指定动作  ACCEPT 接受 DROP 丢弃 REJECT 拒绝(拒绝会透漏信息一般不用) 

    iptables --line-numbers  显示序号

    禁掉端口号 之后,跑到机房 VMworkstations关闭防火墙  -F清除规则 或者重启 即可

    iptables -t filter -A INPUT -p tcp --deport 52113 -j DROP

     

    3.4 删除小结

     

    iptables -F 删除所有规则

    /etc/init.d/iptables  restart

    iptables -D INTUP  规则序号     D ------deleter  删除

    iptables -D (指定链)指定链  后加链 在接所要删除的序号

    iptables -t filter -D INPUT -p tcp --deport 22 -j DROP  

     

    3.5 恢复刚才断掉的ssh链接

     

     去机房重启系统或者登陆服务器删除刚才禁止的规则

     让机房人员重新启动服务器或让机房的人员拿着密码登录进去

      通过服务器的远程连接卡管理      “推荐”

     先写一个定时任务  没五分钟关闭一次防火墙

     测试环境  提前测试好,写成脚本,批量执行

     

    3.6 禁止网段连入

     

    例如:我们要在LVS负载均衡组上面做防火墙,服务器上加上网段的限制,源地址符合什么网段如10网段的就让你连,别的拒绝。防火墙开的,ssh开的,外网连不进来,但是VPN之后,可以连接,这是因为内网做了iptables的允许。社会是不公平的,也是不公平的。

     

    基于客户端源地址进行控制

     

    iptables -t filter  -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP 
    iptables            -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP   默认  filter 表 

     

    Windows  CMD ipconfig 查看本机的网段。

    注 :这两条命令的等价的 

    执行以上命令,之后我们已经无法连接了。

    登录虚拟机 , 删除我们刚才即禁止的来源地址为10网段的命令

    iptables -D INPUT -I -s 10.0.0.0/24 -j DROP 

    iptables -D INPUT 1   后面直接接,数字也可以。

     

     

     

    3.7 ! 叹号 取反

    iptables -t filter -A INPUT -i eth0 ! -s 10.0.0.0/24 -j DROP 

    意将,不是这个网段的IP封杀在外面

     

    3.8 多条件匹配  过滤

    iptables -t filter -A INPUT -p tcp --dport 22 -i eth0 ! -s 10.0.0.0/24 -j DROP

    去所有条件的交集,同时过滤

     

    3.9封掉端口

    iptables -A INPUT -p tcp --dprot 3306 -j DROP   ### 禁止访问MySQL端口 

     

    3.10 匹配唯一端口

    iptables -A  -p tcp  --sport 53   ## 指定 源端口

    匹配除了指定端口之外的端口

    iptables -A INPUT -p tcp --dport !22 ###匹配 指定目的端口以外

     

    3.11 匹配端口范围

    iptables -I INTUP -p tcp --dport 18:80 -j DROP
    iptables -I INPUT  -p tcp  -m multiport --deport 21,22,23,24 -j DROP  ##输出禁止端口范围

     

    3.12 匹配网络接口

     

    iptables -A INPUT  -i  eth0 input  匹配进去的网卡接口

    iptables -A FORWARD -o eth0   -o output  匹配 出去的网卡

    匹配icmp类型

    iptables -I INTUP -p icmp --icmp-type 8 -j DROP
    iptables -I INTUP -p icmp --icmp-type 8 -j  ACCEPT
    

    匹配网络状态

    -m state --state 

     

    NEW   已经或将启动新的连接

    ESTABILISHED: 已经建立的连接

    RELATRD 正在启动的新连接

    INVALID: 非法或无法识别的

    限制指定时间包的允许通过数量以及并发数-

    -m limit --limit n/{second/minute/hour}:

     

    4 .手动执行iptables命令配置企业生产环境下的防火墙

    4.1 生产场景配置主机防火墙有两种模式,介绍

     

    逛公园和看电影两种模式

    逛公园:默认随便进出,对非法分子进行拒绝  企业实际生产场景:企业配置上网网关路由

    看电影:默认没有票就进不去,花钱买票才能进去,看电影。企业应用:服务器主机防火墙

    很显然,第二种更加的严格,安全

    逛公园以及看电影两种模式两种模式的本质就防火墙的默认规则是允许还是拒绝,没有匹配上的情况下我是拒绝还是允许,拒绝才是安全的。类似与sudo命令。

    再此,我们以电影院模式,来布置一个生产场景下的防火墙

     

    4.2 各种清除

     

    iptables -F 清空之前所有的规则

    iptables -X 清空用户自定义的量

    iptables -Z  清空计数器  

     

    4.3 在配置拒绝之前,要配置允许,

    [root@lb-01-5 ~]# iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT ##指定网段
    [root@lb-01-5 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT   ###指定端口 

    允许回环接口

    iptables -t filtet -A INPUT -i lo -j ACCEPT 
    iptables -t filter -A OUTPUT -o lo -j ACCEPT  

    之后,自己的本级要能够通信

     

    4.4 修改默认规则

    iptables -P INPUT DROP  
    iptables -P FORWARD DROP   
    iptables -P OUTPUT ACCEPT

    到目前为止,是很安全的模式,对外默认如果没有匹配上规则丢弃的

     

    4.5 办公司固定ip网段

    iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT  ##### 办公室固定IP段
    iptables -A INPUT -s 192.168.1.9/24 -p all -j ACCEPT    ##### IDC机房的内网网段
    iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT         ###  其他机房的外网网段
    iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT  #### IDC机房的外网网段 
    iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT   ###其他IDC机房的外网网段

     

    本步骤表示允许IDC LAN和办公网IP的无条件连接访问,因为使我们自己的“人”,所以要信任通过, 对于外部用户还无法访问服务器的任何服务。

     

    4.6 允许80端口

    [root@lb-01-5 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

     

    4.7 允许其他人能ping通

    [root@lb-01-5 ~]# iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

     

    4.8 允许关联的包通过

    [root@lb-01-5 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    [root@lb-01-5 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

     

    4.9 基本的防火墙配置完成

    [root@lb-01-5 ~]# iptables -nL
    Chain INPUT (policy DROP)
    target     prot opt source               destination         
    ACCEPT     tcp  --  10.0.0.0/24          0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  124.43.62.96/27      0.0.0.0/0           
    ACCEPT     all  --  192.168.1.0/24       0.0.0.0/0           
    ACCEPT     all  --  192.168.1.0/24       0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 
    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255 
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
    
    Chain FORWARD (policy DROP)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

     

    4.10.1 如何永久保存

     

    我们在命令行中的操作,都是储存在内存当中,没有在磁盘,重启服务器就会丢失

    我们要将其存到配置文件,做到永久存储

     

    4.10.2 方法一:命令保存

    [root@lb-01-5 ~]# /etc/init.d/iptables save
    iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

     

    4.10.2 方法二:重定向

     

    [root@lb-01-5 sysconfig]# iptables-save>/etc/sysconfig/iptables.bak

     

    4.11如何查看 所有端口

    [root@lb-01-5 sysconfig]# nmap 10.0.0.5 -p 1-65535
    
    Starting Nmap 5.51 ( http://nmap.org ) at 2017-04-16 15:31 CST
    Nmap scan report for www.etiantian.org (10.0.0.5)
    Host is up (0.0000030s latency).
    Not shown: 65533 closed ports
    PORT   STATE SERVICE
    22/tcp open  ssh
    80/tcp open  http
    
    Nmap done: 1 IP address (1 host up) scanned in 0.70 seconds
    

     

     

     

     

     

     

    展开全文
  • Iptables

    千次阅读 2019-03-21 18:49:36
    iptables介绍 linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成。 netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则...

    iptables介绍
    linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成。
    netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
    iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。

    iptables基础
    我们知道iptables是按照规则来办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

    当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,而这些关卡在iptables中不被称为"关卡",而被称为"链"。
    在这里插入图片描述
    其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他"关卡",也就是其他"链",他们就是 “路由前”、“转发”、“路由后”,他们的英文名是
    PREROUTING、FORWARD、POSTROUTING

    也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过"链"可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。
    在这里插入图片描述
    所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
    到本机某进程的报文:PREROUTING --> INPUT
    由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
    由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

    表的概念
    我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了5种表

    filter表:负责过滤功能,防火墙,也就是由filter表来决定一个数据包是否继续发往它的目的地址或者被丢弃;内核模块:iptables_filter

    nat表:network address translation,网络地址转换功能;内核模块:iptable_nat

    mangle表:拆解报文,做出修改,并重新封装 的功能,用于修改IP头部信息,如TTL(time to live);iptable_mangle

    raw表:关闭nat表上启用的连接追踪机制;iptable_raw

    security :提供在数据包中加入SElinux特性的功能。

    最常用的有三张表:filter,nat,mangle
    在这里插入图片描述
    数据经过防火墙的流程
    在这里插入图片描述

    链的作用
    prerouting
    数据包进入路由表之前的操作在此进行

    input
    通过路由表后发现目的地址为本机,则匹配该链中规则

    forward
    通过路由表后发现目的地址非本机,则匹配该链中规则

    output
    由本机产生的,向外转发的匹配该链中的规则

    postrouting
    发送到网卡接口之前,进行该链中规则的匹配

    命令格式
    iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 处理动作或跳转]
    -t 接表名,如果不加-t 默认就是 –t filter

    命令选项
    -L 列出一个或所有链的规则
    -v 显示详细信息,包括每条规则的匹配句数量和匹配字节数
    -x 在v的基础上,禁止自动换算单位(K,M)
    -n 只显示ip地址和端口号,不显示域名和服务名称
    -I 插入到防火墙第一条生效
    -A 添加链是添加到最后一条
    -D 删除指定链中的某一条规则,按规则序号或内容确定要删除的规则
    -F 清空指定链中的所有规则,默认清空表中所有链的内容
    -X 删除指定表中用户自定义的规则链

    条件匹配
    -i 入站请求接口
    -o 出站请求接口
    -s 入站源地址
    -d 目标地址
    -p 指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议
    –dport 目的端口,数据包的目的(dport)地址是80,就是要访问我本地的80端口
    –sport 来源端口 数据包的来源端口是(sport)80,就是对方的数据包是80端口发送过来的。

    处理动作
    ACCEPT:允许数据包通过。
    DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
    REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
    SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
    MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
    DNAT:目标地址转换。
    REDIRECT:在本机做端口映射。
    LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
    一般不使用REJECT(拒绝)行为.REJECT会带来安全隐患

    操作样例:
    1 查看iptables规则
    iptables -L -n

    2 清除默认规则
    iptables –F 清除所有规则
    iptables –X 删除用户自定义的链
    iptables –Z 链的计数器清零
    默认情况下,我们的清除规则实际是对filter表的操作,如果是nat表,需要指定表
    iptables –t nat –F

    3 保存修改
    [root@es salt]# /etc/init.d/iptables save

    4 禁止ssh 默认22端口
    iptables -A INPUT -p tcp --dport 22 -j DROP

    5 禁止多端口
    iptables -A INPUT -p tcp --dport 80:3306 -j DROP
    [root@es ~]# iptables -L -n
    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    DROP tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:3306
    列表形式禁止多端口
    iptables -A INPUT -p tcp -m multiport --dport 50,51,60,8888 -j DROP
    注:-m multiport 列表禁止多端口的参数
    [root@es ~]# iptables -L -n
    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    DROP tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:3306
    DROP tcp – 0.0.0.0/0 0.0.0.0/0 multiport dports 50,51,60,8888

    6 删除规则
    方法1
    iptables -D INPUT -p tcp --dport 22 -j DROP
    方法2
    [root@es ~]# iptables -L -n --line-number
    Chain INPUT (policy ACCEPT)
    num target prot opt source destination
    1 DROP tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpts:80:3306
    2 DROP tcp – 0.0.0.0/0 0.0.0.0/0 multiport dports 50,51,60,8888

    iptables -D INPUT 1
    [root@es ~]# iptables -L -n --line-number
    Chain INPUT (policy ACCEPT)
    num target prot opt source destination
    1 DROP tcp – 0.0.0.0/0 0.0.0.0/0 multiport dports 50,51,60,8888

    7 禁止10.0.0.0/24网段连入
    iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP
    注:-i 入站请求接口
    -o 出站请求接口
    -s 入站源地址
    -d 目标地址
    [root@es ~]# iptables -L -n
    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    DROP all – 10.0.0.0/24 0.0.0.0/0

    8 除了192.168.56.1其他IP都不能通过eth0连接
    iptables -I INPUT -i eth0 -s ! 192.168.56.1 -j DROP
    注:!和IP之间有空格 有提示 不用理会
    [root@es ~]# iptables -L -n
    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    DROP all – !192.168.56.1 0.0.0.0/0

    9 禁 192.168.56.7 ping 本机
    iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.56.7 -j DROP

    10 对外的WEB服务器,要允许http服务通过,并且不限制IP
    iptables -I INPUT -p tcp --dport 80 -j ACCEPT

    11 允许FTP服务
    iptables -A INPUT -p tcp --dport 21 -j ACCEPT
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    注:FTP服务有些特殊 说以要允许ftp服务通过防火墙需要上面两步
    ESTABLISHED 已经建立连接的数据包允许通过
    RELATED 发出去的数据包允许通过

    12 端口转发
    iptables -t nat -A PREROUTING -d 192.168.52.5 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.1.17:80
    注: 访问目标地址是192.168.52.5 端口80的访问都转给172.16.1.17:80

    展开全文
  • iptables基础

    2020-08-02 21:04:55
    iptables是Linux上常用的防火墙软件,iptables的安装、清除iptables规则、iptables只开放指定端口、iptables屏蔽指定ip、ip段及解封、删除已添加的iptables规则等
  • iptables 防火墙 linux
  • iptables讲解

    2018-06-08 22:19:42
    iptables 好用的叫学,非常的厉害iptables 好用的叫学,非常的厉害iptables 好用的叫学,非常的厉害iptables 好用的叫学,非常的厉害iptables 好用的叫学,非常的厉害iptables 好用的叫学,非常的厉害iptables 好用...
  • iptables详解

    2018-09-04 10:03:06
    安全体系概览,预备知识:OSI七层模型,Firewalls: netfilter/iptables,数据包的流向图(iptables语法,标准流程)
  • iptables-save命令用于保存iptables的表配置。 语法格式:iptables-save [参数] 常用参数: -c 指定要保存的iptables表时,保存当前的数据包计算器和字节计数器的值 -t 指定要保存的表的名称 参考实例 指定...
  • iptables-restore命令用来还原iptables-save命令所备份的iptables配置。 语法格式:iptables-restore [参数] 常用参数: -c 指定在还原iptables表时候,还原当前的数据包计数器和字节计数器的值 -t 指定要还原...
  • iptables 源码

    2016-06-05 09:40:29
    iptables 协议栈
  • Iptables基础使用

    2021-01-09 03:19:03
    状态查看:service iptables status 打开:service iptables start 关闭:service iptables stop 2、防火墙安装 注意:仅以Centos7作为参考 1、查看防火墙是否已经安装或系统自带有 rpm -qa|grep iptables 2、...
  • os-iptablesiptables的包装
  • iptables食谱 安装iptables并提供用于添加和删除iptables规则的自定义资源 要求 平台类 Ubuntu / Debian的 RHEL / CentOS及其衍生版本 亚马逊Linux 厨师 厨师14+ 资源 菜谱 默认 默认配方将安装iptables,并提供...
  • iptables-1.4.21

    2020-11-24 09:14:40
    centos7离线安装iptablesiptables-1.4.21-34.el7.x86_64.rpm和iptables-services-1.4.21-34.el7.x86_64.rpm
  • iptables工作原理及iptables命令行使用介绍

    千次阅读 多人点赞 2019-02-07 20:22:38
    iptables详解iptables原理技能 iptables原理 技能 最需要掌握的技能就是查看iptables规则来进行trouble shoot了。掌握iptables的根本在于掌握数据包在四表五链的流转过程。 查看iptables规则最实用的命令是: ...

    iptables原理

    iptables中的五链

    实际上,iptables 只是一个操作 Linux 内核 Netfilter 子系统的“界面”。顾名思义,Netfilter 子系统的作用,就是 Linux 内核里挡在“网卡”和“用户态进程”之间的一道“防火墙”。它 们的关系,可以用如下的示意图来表示:
    在这里插入图片描述图片来自张磊极客时间专栏(侵删)

    可以看到,这幅示意图中,IP 包“一进一出”的两条路径上,有几个关键的“检查点”,它们 正是 Netfilter 设置“防火墙”的地方。在 iptables 中,这些“检查点”(每个检查点都可以设置iptables规则对数据包进行过滤或修改)被称为:链 (Chain)。这是因为这些“检查点”对应的 iptables 规则,是按照定义顺序依次进行匹配 的。这些“检查点”的具体工作原理,可以用如下所示的示意图进行描述:
    在这里插入图片描述可以看到,当一个 IP 包通过网卡进入主机之后,它就进入了 Netfilter 定义的流入路径(Input Path)里。在这个路径中,IP 包要经过路由表路由来决定下一步的去向。而在这次路由之前,Netfilter 设 置了一个名叫 PREROUTING 的“检查点”。在 Linux 内核的实现里,所谓“检查点”实际上 就是内核网络协议栈代码里的 Hook(比如,在执行路由判断的代码之前,内核会先调用 PREROUTING 的 Hook)。
    而在经过路由之后,IP 包的去向就分为了两种:

    • 第一种,继续在本机处理;
    • 第二种,被转发到其他目的地。

    数据包在Linux内核的流转过程

    1. 当一个数据包进入网卡时,数据包首先进入PREROUTING链, 内核根据数据包目的IP判断是否需要转发出去。
    2. 如果数据包就是进入本机的,数据包就会沿着图继续向上层协议栈流动,这时候,数据包将继续向上层协议栈流动。在它进入传输层之前,Netfilter 会设置一个名叫 INPUT 的“检查点”。到这里,数据包流入路径(Input Path) 结束。接下来,这个 数据包通过传输层进入用户空间,交给用户进程处理。而处理完成后,用户进程会 通过本机发出返回的 数据包。这时候,这个数据包就进入了流出路径(Output Path)。此时,数据包首先还是会经过主机的路由表进行路由。路由结束后,Netfilter 就会设置一个名叫 OUTPUT 的“检查点”。然后,在 OUTPUT 之后,再设置一个名叫 POSTROUTING“检查点”。在流出路径设置两个检查点的原因见下方黄色字体。
    3. 如果数据包是要转发出去的,且内核允许转发,在这种情况下,这个 数据包不会进入传输层,而是会继续在网络层流动,从而进入到转发路径 (Forward Path)。在转发路径中,Netfilter 会设置一个名叫 FORWARD 的“检查点”。而在 FORWARD“检查点”完成后,IP 包就会来到流出路径。而转发的 IP 包由于目的地已经确定,它就不会再经过路由,也自然不会经过 OUTPUT,而是会直接来到 POSTROUTING“检 查点”。

    上述五条链,其实就是五个检查点,那么为什么要设置这五个检查点呢?我猜是因为每个检查点针对的数据包的作用域不一样,如下表所示。

    链名作用域
    PREOUTING所有进入本机的数据包
    INPUT继续在本机处理,向上层协议栈流入的数据包,交由本机进程处理
    FORWARD被转发到其他目的地的数据包
    OUTPUT经过本机进程处理流出的数据包
    POSTROUTING所有流出本机的数据包(包括从从Forward Path流出的数据包以及从Output Path流出的数据包)

    POSTROUTING 的作用,其实就是上述两条路径(Output Path和Forward Path),最终汇聚在一起的“最终检查点”,对两条路径上的数据包进行统一的检查和处理。

    **总结:**上文涉及到了三条路径Input Path、Output Path、Forward Path来详细说明数据包的流转过程,在这个流转过程中设置了一些检查点(chain),使得用户可以在这些检查点上设置一定的规则来将匹配到的数据包进行处理。

    iptables的四表

    Netfilter官网图片上图高清原图链接

    建议将上图原图链接打开,放大观看。前文所讲的就是上图绿色的部分,也就是Network Layer中的iptables工作流程,每一个白色的“检查点”上,还有一个绿色的“标签”,比如:raw、 nat、filter 等等。在 iptables 里,这些标签叫作:表。比如,同样是 OUTPUT 这个“检查点”,filter Output 和 nat Output 在 iptables 里的语法和参数,就完全不一样,实现的功能也完全不同。

    每个表的功能如下所示:

    名称功能
    filter一般的过滤功能,这个是默认的 table
    nat用于nat功能(端口映射,地址映射等),这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关
    mangle主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。简单来讲就是给数据包打标签。
    raw涉及到数据包的跟踪处理功能,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,即设置NOTRACK动作提高性能

    raw表中所说的跟踪状态指的是被跟踪连接的四种不同状态有关的。它们分别是NEW,ESTABLISHED,RELATED和INVALID。具体请看参考文献,此处不再细说。

    下图所示是Netfilter中表和链的对应关系。表的处理优先级:raw>mangle>nat>filter。
    在这里插入图片描述

    总结: iptables 表的作用,就是在某个具体的“检查点”(比如 Output)上,按顺序执行几个不同的检查动作(比如,先执行 nat,再执行 filter),在这些检查动作中包含了一系列的iptables规则,匹配到相应规则的数据包则会执行相应的处理动作。以上就是iptables中的四表五链,有错误,欢迎指正。

    iptables命令掌握

    iptables命令语法

    iptables -t table   command   chain   rules   -j target
    
    • table ------- 指定表名(raw表、mangle表、nat表、filter表)
    • command ------- 对链的操作命令(-A:追加规则(最下面进行追加规则)、-I:插入(一般在相应的哪条规则前后插入))
    • chain ------- 链名(prerouting链、forward链、input链、output链、postrouting链,以及若干自定义链)
    • rules ------- 定义一系列的规则来选择匹配到的数据包,比如可以通过协议,端口号,等等来匹配过滤数据包。
    • target ------- 对rules匹配到的数据包进行处理,比如接收请求,丢弃请求等等。

    -j jump,指的是跳转到何种动作上。

    table

    表选项用于指定命令应用于哪个iptables内置表,iptables内置包括:filter表、nat表、mangle表和raw表
    使用的参数为: -t + 表名,如果不使用-t参数,默认是使用filter表

    command

    • -P或–policy + <链名>: 定义默认策略
    • -L或–list + <链名>: 查看iptables规则列表
    • -A或–append + <链名>: 在规则列表的最后增加1条规则
    • -I或–insert + <链名>: 在指定的位置插入1条规则
    • -D或–delete + <链名> + number: 从规则列表中删除1条规则
    • -R或–replace + <链名> + number: 替换规则列表中的某条规则
    • -F或–flush + <链名> :清除所有制定的规则
    • -X或–delete-chain + <用户自定义的链名>: 删除表中所有规则(注意:无法清空默认规则)
    • -Z或–zero + <链名> :将表中数据包计数器和流量计数器归零
    • -N或 --new-chain + <用户自定义的链名>:新建一个用户自定义的链,且链名必须跟内置那些链名不同
      实例:

    清除iptables规则:

    iptables -F
    #清除所有制定的规则
    iptables -X
    #清除用户自定义的chain
    iptables -Z
    #将所有流量统计归0
    

    但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:iptables -t NAT -F

    chain

    默认五条链

    自定义链

    rules

    rules主要是制定一定的规则,匹配到符合规则的数据包,进行处理。

    基本匹配条件:

    匹配条件当中出现"!"是取反的意思

    • -s --source + <源地址或子网>: 指定数据包匹配的源地址。
    iptables -A OUTPUT -s 192.168.1.1
    #指定该规则与源地址为192.168.1.1的数据包匹配。   
    iptables -A OUTPUT -s 192.168.0.0/24
    #指定该规则与源地址为192.168.0.0/24子网下的网络包匹配     
    iptables -A OUTPUT -s ! 203.16.1.89 
    #指定该规则将与 除来自源地址 203.16.1.89 外的任何信息包匹配。 
    
    • -d --destination + <目标地址或子网>: 指定数据包匹配的目标地址
    • -i --in-interface + <网络接口名>: 指定数据包从哪个网络接口进入,如ppp0、eth0和eth1等。注意:该参数只能用于INPUT、FORWARD、PREROUTING这三个链
    • -o --out-interface + <网络接口名>: 指定数据包从哪块网络接口输出,如ppp0、eth0和eth1等。注意:该参数只应用于FORWARD、OUTPUT、POSTROUTING链
    • -p --protocol + < 协议类型>: 指定数据包匹配的协议, 如tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp等。

    扩展匹配条件:

    man iptables-extensions查看帮助文档

    隐式扩展

    在使用-p选项指明了特定的协议时,无需再用-m选项 指明扩展模块的扩展机制,不需要手动加载扩展模块

    • tcp协议的扩展选项
    --source-port, --sport port[:port]:匹配报文源端口, 可为端口范围 
    --destination-port,--dport port[:port]:匹配报文目标 端口,可为范围
    --tcp-flags  mask  comp 
    mask 需检查的标志位列表,用,分隔 例如 SYN,ACK,FIN,RST; 
    comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
    

    实例:

    --tcp-flags  SYN,ACK,FIN,RST  SYN  
    #表示要检查 的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
    
    
    • udp协议的扩展选项
    --source-port, --sport port[:port]:匹配报文的 源端口;可以是端口范围 
    --destination-port,--dport port[:port]:匹配报 文的目标端口;可以是端口范围
    
    显示扩展

    必须使用-m选项指明要调用的扩展模块的扩展 机制,要手动加载扩展模块
    -m matchname

    学会使用帮助文档,由于扩展是很多的,不可能介绍完所有的,所以学会查询帮助文档是而非常有必要的。

    #查看addrtype扩展的帮助文档
    iptables -m addrtype --help
    

    1.multiport扩展

    iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
    #以离散方式定义多端口匹配,最多指定15个端口,用","分隔。
    #上述命令中表明源地址为172.16.0.0/16,目标地址为172.16.100.10的数据包中,目的端口为20-22范围之间的以及80号端口,都接收。
    #":"表示一个范围,比如20:22,表示是20到22之间的所有端口。
    

    2.iprange扩展

    --src-range from[-to] 源IP地址范围
    --dst-range from[-to] 目标IP地址范围
    
    #实例
    iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5172.16.100.10 -j DROP
    #指明连续的(但一般不是整个网络)ip地址范围 
    

    3.mac扩展

    #实例:
    iptables -A INPUT -s 172.16.0.100  -j REJECT
    #指明源MAC地址 
    

    4.string扩展

    #对报文中的应用层数据做字符串模式匹配检测 
    --algo {bm|kmp}:字符串匹配检测算法 
      bm:Boyer-Moore 
      kmp:Knuth-Pratt-Morris 
    --from offset  开始偏移 
    --to offset    结束偏移
    --string pattern:要检测的字符串模式
    
    #实例
    iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
    

    5.time扩展
    根据将报文到达的时间与指定的时间范围进行匹配

    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 
    --timestart hh:mm[:ss] 
    --timestop hh:mm[:ss] 
    --monthdays day[,day...] 
    --weekdays day[,day...] 
    
    #实例:
    iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
    

    6.connlimit扩展
    根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击,通常分别与默认的拒绝或允许策略配合使用。

    --connlimit-upto n:连接的数量小于等于n时匹配 
    --connlimit-above n:连接的数量大于n时匹配
    
    #示例:
    iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
    

    7.limit扩展
    基于收发报文的速率做匹配 令牌桶过滤器

    --limit rate[/second|/minute|/hour|/day] 
    --limit-burst number 
    示例:
    iptables -I INPUT -d 172.16.100.10 -p icmp --icmptype 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
    

    8.state扩展
    根据”连接追踪机制“去检查连接的状态,较耗资源 ,状态有如下几种:

    • NEW:新发出请求;连接追踪信息库中不存在此连接的 相关信息条目,因此,将其识别为第一次发出的请求
    • ESTABLISHED:NEW状态之后,连接追踪信息库中为 其建立的条目失效之前期间内所进行的通信状态
    • RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系
    • INVALID:无效的连接,如flag标记不正确
    • UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

    CentOS7 需要加载模块: modprobe nf_conntrack

    --state state 
    
    #示例:
    iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport -dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT 
    

    9.comment扩展
    为任何规则添加注释(最多256个字符),主要是为了解释说明该规则。

    iptables -A INPUT -i eth1 -m comment --comment "my local LAN"
    

    target

    target可以是一个"动作",target也能是一个"自定义链",当target为一个动作时,表示报文按照指定的动作处理,当target为自定义链时,表示报文由自定义链中的规则处理。具体见下文中自定义链的使用。

    targetname解释说明
    ACCEPT接受数据包
    DROP丢弃数据包
    REDIRECT通过改变目标IP和端口,将接受的包转发至不同端口 --to-ports port[-port]
    SNAT源地址转换,即改变数据包的源地址。
    DNAT目标地址转换,即改变数据包的目的地址。
    MASQUERADEMASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。效果和SNAT相似。
    LOG日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错
    NOTRACK取消跟踪功能,一般用于在raw表设置,提高WEB服务器的效率。

    常见问题

    • SNAT 和 MASQUERADE 的区别:SNAT 是明确指定修改的源地址,而 MASQUERADE 会自动获取出口接口(根据路由表)的 IP 地址。性能方面比 SNAT 几乎忽略不计,而无需明确指定 IP 地址,所以在 DHCP 和 PPPOE 的动态 IP 环境下(也就是IP不固定的时候)使用特别方便。
    iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
    iptables -t nat -A POSTROUTING -o $WAN -j SNAT --to-source $IP
    
    • DNAT 和 REDIRECT 的区别:这组动作和上面的刚好相反,是用来修改目的地址的。DNAT 是明确指定修改的目的地址,而 REDIRECT 会把要转发的包的目的地址改写为入口接口的 IP 地址。
    iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j REDIRECT --to-ports 3128
    iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to-destination $IP --to-ports 3128
    

    iptables命令案例

    为数据包设置trace

    实验环境(centos7)

    监控所有相关icmp包的流转变化。

    iptables -t raw -A OUTPUT -p icmp -j TRACE 
    iptables -t raw -A PREROUTING -p icmp -j TRACE
    
    modprobe nf_log_ipv4
    #加载所需模块儿 
    

    然后你就可以在/var/log/messages看到包追踪信息了。
    关闭
    删除掉TRACE规则即可:

        iptables -t raw -D PREROUTING 1
    

    开启路由转发功能

    1.直接配置到内存中,但是只是当前生效

    echo 1 > /proc/sys/net/ipv4/ip_forward
    

    2.写到配置文件当中

    cat <<EOF >  /etc/sysctl.d/forward.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    
    sysctl --system
    #加载/etc/sysctl.d/*.conf配置文件
    #net.ipv4.ip_forward标识着是否转发,为1代表开启转发功能
    #net.bridge.bridge-nf-call-iptables 标志着二层网桥的包是否被主机的iptables过滤,为1代表也就意味着二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,为0即iptables不对bridge的数据进行处理。
    

    设置自定义链

    为什么还需要自定义链呢?

    原因如下:

    当默认链中的规则非常多时,不方便我们管理。
    想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。
    所以,iptables中,可以自定义链,通过自定义链即可解决上述问题。

    设置自定义链有以下几个步骤:

    1. 创建自定义链
    2. 在自定义链中配置规则
    3. 在默认链中引用自定义链

    示例如下:
    示例来自朱双印的博客,连接在文章下文,侵删
    1.创建一条名为IN_WEB的自定义链。
    在这里插入图片描述
    2.在这条自定义链上设置一定的规则。
    在这里插入图片描述
    3.现在,自定义链中已经有了一些规则,但是目前,这些规则无法匹配到任何报文,因为我们并没有在任何默认链中引用它。既然IN_WEB链是为了针对web服务的入站规则而创建的,那么这些规则应该去匹配入站的报文,所以,我们应该用INPUT链去引用它。当然,自定义链在哪里创建,应该被哪条默认链引用,取决于实际的工作场景,因为此处示例的规则是匹配入站报文,所以在INPUT链中引用自定义链。
    在这里插入图片描述前文提到过,自定义链可以作为target进行跳转
    这种自定义链的做法在K8s的网络模型中,以及service的实现方式上都有一定的体现。

    配置NAT

    nat表的target: SNAT MASQUERADE DNAT REDIRECT

    SNAT:一般用于固定IP

    --to-source [ipaddr[-ipaddr]][:port[-port]] 
    --random 
    #示例:
    iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j SNAT --to-source 172.18.100.6-172.18.100.9
    

    MASQUERADE:用于动态ip环境中,如拨号网络

    --to-ports port[-port] 
    --random 
    #示例:
    iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j MASQUERADE 
    

    DNAT:

    --to-destination [ipaddr[-ipaddr]][:port[-port]] 
    
    #示例
    iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
    

    REDIRECT
    使用REDIRECT动作可以在本机上进行端口映射,REDIRECT规则只能定义在PREROUTING链或者OUTPUT链中。

    --to-ports port[-port] 
    
    #示例:
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
    #当别的机器访问本机的80端口时,报文会被重定向到本机的8080端口上。
    

    iptables规则查看

    iptables -L
    #这种命令输出的
    iptables-save
    #该条命令会将iptables规则输出到标准输出,其输出的形式和当初添加的形式是一样的,这样就让熟悉iptables命令的人很好识别出来。
    

    参考文献

    展开全文
  • iptables -A INPUT -p tcp –dport 22 -j ACCEPT iptables -A INPUT -p tcp –dport 22 -j ACCEPT iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT #保存 sudo /etc/rc.d/init.d/iptables save 或 sudo service ...
  • iptables详解及docker的iptables规则

    千次阅读 2020-10-31 20:14:32
    iptables详解及docker的iptables规则iptables处理流程iptables命令ipset的使用ftp服务规则SNAT与DNATfirewall-cmd命令docker的iptables规则docker网络类型数据包处理流程 iptables 处理流程 iptables命令 ipset的...

    iptables

    处理流程

    iptables是Linux中网络钩子,有四表五链。

    • filter表即防火墙规则,允许、阻止或丢弃进出的数据包,使用是最多的
    • nat表,网络地址转换,内网的数据包收发室,有多种类型,常见的有SNAT,PNAT,DNAT,是第二常用的
    • mangle表,修改数据包的TTL,给数据包做不同的标记,策略路由等
    • raw表,一般用于跟踪状态,调试,用的较少

    优先级:raw,mangle,nat,filter

    五链:

    • PREROUTING,到达本机前的路由规则
    • INPUT,进入本机的规则
    • FORWARD,转发的规则
    • OUTPUT,本机发出的规则
    • POSTROUTING,发出后的路由规则

    在这里插入图片描述

    命令与扩展

    清空表上的所有规则,默认为filter表:
    iptables -F

    链上操作规则,A追加,I前面插入,D删除,R替换,N新建一个自定义链,例如:
    在第5条规则前插入禁止非192.168.1.0/24访问80端口
    iptables -I INPUT 5 -p tcp --dport 80 ! -s 192.168.1.0/24 -j DROP

    查看某个表的所有链上的规则:
    iptables -t nat -L -n -v --line-numbers

    filter表,常将lo网卡和已建立连接的规则放在最前面,降低系统负担:
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    允许ping:
    iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

    允许连续范围端口:
    iptables -A INPUT -p udp --sport 1000:2000 -j ACCEPT

    每个链都有默认规则,禁止时可以设置白名单,允许时可以设置黑名单
    INPUT链默认禁止连接:
    iptables -P INPUT DROP

    iptables有很多扩展,不同的扩展有不同的功能,查看文档,man iptables-extensions常用的:

    • 多端口扩展,-m multiport --dports 80,443
    • recent扩展,每30秒最多10个连接:
      iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
      iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 -j DROP
    • connlimit扩展,限制并发连接数:
      iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
    • string扩展,字符串匹配禁止:
      iptables -I INPUT -p tcp --sport 443 -m string --string "xunlei" --algo kmp -j DROP

    iptables规则都是保存在内存中的,重启规则会丢失,可以使用iptables-saveiptables-restore保存,还可以使用iptables-services

    # 禁用firewalld
    #systemctl stop firewalld
    #systemctl disable firewalld
    yum -y install iptables-services
    service iptables save
    service iptables reload
    

    系统默认规则

    安装iptables-services后,/etc/sysconfig/iptables文件中有默认规则:

    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p icmp -j ACCEPT
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
    iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    

    第四个是允许ssh登录
    第五个是禁止其他连接通过INPUT,并返回icmp-host-prohibited错误
    第六个是禁止FORWARD

    ipset的使用

    可与iptables结合,实现动态的白名单,并且可以设置过期时间
    ipset create ssh-allow hash:ip timeout 0
    ipset add ssh-allow 192.168.47.1 timeout 86400
    ipset list ssh-allow
    iptables -A INPUT -p tcp --dport 22 -m set --match-set ssh-allow src -j ACCEPT

    SNAT与DNAT

    SNAT常用于内部无法上网的机器通过网关上网,需要调整安全组和解除网关MAC与IP绑定。

    # 网关打开核心转发
    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
    sysctl -p
    
    # 数据包离开前将源地址改为网关地址,动态上网时,常用-j MASQUERADE
    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 172.16.8.1
    
    # 不能上网的机器,修改网关
    route add default gw 192.168.1.1
    

    DNAT常用于将内部机器暴漏给外部用户使用。
    iptables -t nat -A PREROUTING -d 172.16.8.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.20:8080

    ftp规则

    ftp分为主动模式和被动模式。

    主动模式数据流是server主动连接client的随机端口,一般客户端都工作在NAT网络中,客户端端口须层层路由开放,所以这种模式很少使用。

    被动模式,server告知client数据连接端口,客户端连接server的数据连接端口,这个端口一般是随机的,需要服务端开放,使用iptables的连接追踪功能,可以很好的解决这个问题

    加载ftp专用的追踪模块,modprobe nf_conntrack_ftp

    开启ftp追踪模块后,仅需开放21端口即可(INPUT默认DROP,OUTPUT默认ACCEPT)
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    RELATED指明ftp关联的数据端口允许连接

    firewall-cmd命令

    iptables分为ipv4和ipv6,两者是独立的,firewalld是iptables的python脚本,已经整合了ipv4和ipv6

    与iptables不同的是,firewalld使用zone来管理防火墙
    zone可以根据source,mac,ipset,interface等匹配,匹配不上的进入默认的public

    查询默认zone:
    firewall-cmd --get-default-zone
    修改了规则需要重新加载才能生效:
    firewall-cmd --reload
    列出zone的所有规则:
    firewall-cmd --list-all --zone=public
    开放80端口:
    firewall-cmd --zone=public --add-port=80/tcp --permanent

    进行复杂的控制,需要rich规则,命令比较复杂,不推荐使用

    docker的iptables规则

    docker网络类型

    • none:顾名思义,不使用网络,只使用lo
    • host:使用主机的网络
    • bridge:桥接,相当于nat,通过docker0分配一个172.17.0.x的地址使用
    • container:使用指定容器的网络

    数据包处理流程

    为便于测试,启动两个容器:
    docker run -d --rm --name nginx -p 80:80 nginx:1.16.1
    docker run -it --name busybox --rm busybox sh

    filter表规则

    iptables -N DOCKER
    iptables -N DOCKER-ISOLATION-STAGE-1
    iptables -N DOCKER-ISOLATION-STAGE-2
    iptables -N DOCKER-USER
    iptables -A FORWARD -j DOCKER-USER
    iptables -A FORWARD -j DOCKER-ISOLATION-STAGE-1
    iptables -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -o docker0 -j DOCKER
    iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
    iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT
    iptables -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
    iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN
    iptables -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
    iptables -A DOCKER-ISOLATION-STAGE-2 -j RETURN
    iptables -A DOCKER-USER -j RETURN
    

    主要是转发规则,默认FORWARD为DROP,DOCKER链处理到docker0的IP数据包,即容器对外的规则,例如:

    iptables -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
    允许非docker0访问80端口

    为了搞清楚DOCKER-ISOLATION-STAGE-2,需要创建一个bridge,开启一个nginx,并安装telnet

    docker network create docker1
    docker run -d --rm --name nginx1 -p 8080:80 --net docker1 nginx:1.16.1
    docker exec -it nginx /bin/bash
    # 在nginx中安装telnet
    #apt update
    #apt install telnet
    #telnet 172.18.0.2 80
    

    可以看到telnet 172.18.0.2 80并不通,怎么实现的呢?
    DOCKER-ISOLATION-STAGE-1规则是源网卡是docker0,而目的地不是docker0就进入DOCKER-ISOLATION-STAGE-2

    而DOCKER-ISOLATION-STAGE-2中,有一条规则,iptables -A DOCKER-ISOLATION-STAGE-2 -o br-afba712bfb32 -j DROP,即不允许不同的网卡互相访问,这对于docker-compose非常有用,设计非常精妙

    DOCKER-USER链用于自定义转发规则,优先级最高,可以限制进入容器的源IP地址:
    iptables -I DOCKER-USER ! -s 192.168.47.1 -p tcp --dport 80 -j DROP
    以上规则禁止非192.168.47.1的IP地址访问容器的80端口

    nat表规则

    iptables -t nat -N DOCKER
    iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
    iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
    iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    iptables -t nat -A DOCKER -i docker0 -j RETURN
    

    DOCKER链方便container自定义规则
    POSTROUTING规则,使得container使用宿主机docker0的IP作为网关,便于接收外部返回的数据

    有如下规则:
    iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
    通过PREROUTING链和DOCKER链将主机的80端口流量转发给172.17.0.2,并通过filter表的FORWARD链返回给客户端

    宿主机通过nat表的OUTPUT链是可以访问container的80端口的

    nat表的POSTROUTING规则使得container可以访问外网

    很奇怪的一条规则:
    iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
    使得容器通过自己的IP172.17.0.2也可以访问80端口

    最后网上的一张流程图:
    在这里插入图片描述

    展开全文
  • iptables设置

    2013-12-02 16:07:19
    iptables的安全方面,高级的iptables 设置
  • iptables防火墙

    2011-08-10 12:45:41
    iptables防火墙iptables防火墙iptables防火墙
  • iptables指令

    2011-05-23 12:25:58
    iptables指令 iptables指令 iptables指令
  • linux iptables 源码

    2018-09-30 10:41:18
    linux iptables 源码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 219,626
精华内容 87,850
关键字:

iptables