zoukankan      html  css  js  c++  java
  • linux下iptables命令应用及配置规则 Marathon

    本文内容从两个角度讲解iptables命令的应用,

    • 先梳理概念,
    • 理解后,我们从iptables的命令出发,讲解不同的应用,从而更好的理解iptables命令是什么有什么用怎么用

    一.概念梳理

    iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。在日常Linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全。

    以下对iptables的规则使用做了总结性梳理:

    iptables首先需要了解的:

    1)规则概念
    规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。
    当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept),拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作是添加,修改和删除等规则。
    其中:
    匹配(match):符合指定的条件,比如指定的 IP 地址和端口。
    丢弃(drop):当一个包到达时,简单地丢弃,不做其它任何处理。
    接受(accept):和丢弃相反,接受这个包,让这个包通过。
    拒绝(reject):和丢弃相似,但它还会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生。
    目标(target):指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
    跳转(jump):和目标类似,不过它指定的不是一个具体的动作,而是另一个链,表示要跳转到那个链上。
    规则(rule):一个或多个匹配及其对应的目标。

    2)iptables和netfilter的关系:
    Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。

    3)iptables的规则表和链
    表(tables):提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
    链(chains):是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

    “四表五链”其实是对用户设置规则的管理,是看待用户设置的规则的两个维度。举个例子,看图中深蓝色箭头的数据流向,数据包要到达用户层,需要经过PREROUTING链(路由前链),INPUT链(输入链),在这个链路中存放着用户设置的规则,这些规则根据功能不同又会被分组存放在RAW表、Mangle表和NAT表中。当数据包抵达PREROUTING链时,netfilter程序会依次从RAW表、Mangle表和NAT表中取出针对PREROUTING链的用户规则并执行相应操作;同理,INPUT链上的规则也会被分组存放在Mangle表和Filter表中,netfilter程序会依次从这两个表中取出针对INPUT链设置的用户规则并执行相应操作。(特别强调,转发的数据包不经过 OUTPUT 链)


    其他链同理。

    这里需要强调的一点是FORWARD链,它是转发链,也就是说只有在网卡个数>=2的系统中才具有的功能:开启系统转发功能后,当网络层发现数据包并非发给本机时会从另一网卡转发出去。中间经过FORWARD链,FORWARD链上的规则由Filter表、Mangle表读取操作。所以对于单网卡的系统中,上图应更改为:

    https://blog.csdn.net/qq_29344757/article/details/81128150

    Iptables采用“表”和“链”的分层结构,在Linux中现在是四张表五个链。下面罗列一下这四张表和五个链(注意一定要明白这些表和链的关系及作用)。

    规则表:
    1)filter表——三个链:INPUT、FORWARD、OUTPUT
    作用:过滤数据包 内核模块:iptables_filter.
    2)Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
    作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
    3)Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
    作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
    4)Raw表——两个链:OUTPUT、PREROUTING
    作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

    规则链:

    1)INPUT——进来的数据包应用此规则链中的策略
    2)OUTPUT——外出的数据包应用此规则链中的策略
    3)FORWARD——转发数据包时应用此规则链中的策略
    4)PREROUTING——对数据包作路由选择前应用此链中的规则
    (记住!所有的数据包进来的时侯都先由这个链处理)
    5)POSTROUTING——对数据包作路由选择后应用此链中的规则
    (所有的数据包出来的时侯都先由这个链处理)

    **管理和设置iptables规则: **


    4)iptables传输数据包的过程

    1)当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
    2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
    3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

    整理自: http://www.weixuecn.cn/article/11315.html

    二.iptables的增删改查

    iptables规则的修改可以类比于数据表的增删改查,-I-insert-A-append-D-delete-R-update -L-list or read-F-flush

    1.查看规则

    1.1 iptables -t 表名 -L

    查看对应表的所有规则,-t 指定操作的表, 可省略-t,默认操作filter-L表示列出规则

    1.2 iptables -t 表名 -L 链名

    查看指定表的指定链中的规则

    1.3 iptables -t 表名 -v -L

    查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出"计数器"的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL

    1.4 iptables -t 表名 -n -L

    表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址

    1.5 iptables --line-numbers -t 表名 -L

    表示查看表的所有规则,并且显示规则的序号,--line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为--line,注意,简写后仍然是两条横杠,仍然是长选项

    1.6 iptables -t 表名 -v -x -L

    表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。

    实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以filter表为例。

    iptables --line -t filter -nvxL

    当然,也可以只查看某张表中的某条链,此处以filter表的INPUT链为例

    iptables --line -t filter -nvxL INPUT

    2.增加规则

    2.1 iptables -t filter -I INPUT -s 192.168.1.146 -j DROP

    命令解析:

    • -t filter 操作filter表,也可以不指定,默认filter
    • -I INPUT 将规则插入到INPUT链中,-I 表示insert rule
    • -s 192.168.1.146 匹配源ip 192.168.1.146,-s 表示source
    • -j DROP 规则动作对应为DROP,即丢弃报文,不响应信息,-j target

    命令解读:操作filter表向INPUT链中插入规则,具体source 为192.168.1.146,动作为DROP.

    此时我们在自己的测试机限制了146主机的访问,在146上ping测试机,ping不通。

    接着我们看看通过append方式追加规则,是否生效。

    执行命令:

    #  iptables  -t  filter  -A  INPUT  -s  192.168.1.146  -j  ACCEPT
    
    # -A 表示追加,append
    

    可以在146的主机上对测试主机进行ping命令,发现ping不通,

    原因分析:

    1.进入 INPUT 链中的报文依次的规则处理中,由于刚开始我们用的 -I,即插入最前面的命令,而 -A 表示追加到后面,而匹配规则中,报文值匹配前面的规则,后面的就不再进行匹配,导致,追加 ACCEPT 并没有生效。
    

    此时,我们尝试再次通过 -I命令添加规则,看看效果怎样。

    执行命令:

    #  iptables  -t  filter  -I  INPUT  -s  192.168.1.146  -j  ACCEPT
    

    再次通过ping命令,146 ping 测试机成功。

    通过--line命令查看规则:

    # iptables  --line -vnL
    

    iptables详解(3):iptables规则管理

    我们也可以在添加规则时,指定新增规则的编号,这样我们就能在任意位置插入规则了,我们只要把刚才的命令稍作修改即可,如下。

    iptables详解(3):iptables规则管理

    仍然使用-I选项进行插入规则操作,-I INPUT 2表示在INPUT链中新增规则,新增的规则的编号为2。

    规则的顺序很重要。

    如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了,就以上图为例,报文先被第一条规则匹配到了,于是当前报文被"放行"了,因为报文已经被放行了,所以,即使上图中的第二条规则即使能够匹配到刚才"放行"的报文,也没有机会再对刚才的报文进行丢弃操作了。这就是iptables的工作机制。

    3.删除规则

    如果我们想要删除filter表中INPUT中的一条规则,该怎么做呢?

    有两种办法:

    • 方法一:根据规则的编号去删除规则
    • 方法二:根据具体的匹配条件与动作删除规则

    3.1 通过序号删除

    先看看方法一,先查看一下filter表中INPUT链中的规则

    iptables详解(3):iptables规则管理

    假如我们想要删除上图中的第3条规则,则可以使用如下命令。

    iptables详解(3):iptables规则管理

    上例中,使用了-t选项指定了要操作的表(没错,省略-t默认表示操作filter表),使用-D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则。

    3.2 通过具体规则删除

    我们也可以根据具体的匹配条件与动作去删除规则,比如,删除下图中源地址为192.168.1.146,动作为ACCEPT的规则,于是,删除规则的命令如下。

    iptables详解(3):iptables规则管理

    上图中,删除对应规则时,仍然使用-D选项,-D INPUT表示删除INPUT链中的规则,剩下的选项与我们添加规则时一毛一样,-s表示以对应的源地址作为匹配条件,-j ACCEPT表示对应的动作为接受,所以,上述命令表示删除INPUT链中源地址为192.168.1.146,动作为ACCEPT的规则。

    提示

    而删除指定表中某条链中的所有规则的命令,我们在一开始就使用到了,就是"iptables -t 表名 -F 链名"

    -F选项为flush之意,即冲刷指定的链,即删除指定链中的所有规则,但是注意,此操作相当于删除操作,在没有保存iptables规则的情况下,请慎用。

    其实,-F选项不仅仅能清空指定链上的规则,其实它还能清空整个表中所有链上的规则,不指定链名,只指定表名即可删除表中的所有规则,命令如下

    iptables -t 表名 -F

    不过再次强调,在没有保存iptables规则时,请勿随便清空链或者表中的规则,除非你明白你在干什么。

    4.更改规则

    怎样修改某条规则中的动作呢?比如,我想把如下规则中的动作从DROP改为REJECT,改怎么办呢?

    iptables详解(3):iptables规则管理

    我们可以使用-R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行),示例命令如下

    iptables详解(3):iptables规则管理

    上例中,-R选项表示修改指定的链,使用-R INPUT 1表示修改INPUT链的第1条规则,使用-j REJECT表示将INPUT链中的第一条规则的动作修改为REJECT,注意:上例中, -s选项以及对应的源地址不可省略,即使我们已经指定了规则对应的编号,但是在使用-R选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定)。

    如果上例中的命令没有使用-s指定对应规则中原本的源地址,那么在修改完成后,你修改的规则中的源地址会自动变为0.0.0.0/0(此IP表示匹配所有网段的IP地址),而此时,-j对应的动作又为REJECT,所以在执行上述命令时如果没有指明规则原本的源地址,那么所有IP的请求都被拒绝了(因为没有指定原本的源地址,当前规则的源地址自动变为0.0.0.0/0),如果你正在使用ssh远程到服务器上进行iptables设置,那么你的ssh请求也将会被阻断。

    既然使用-R选项修改规则时,必须指明规则原本的匹配条件,那么我们则可以理解为,只能通过-R选项修改规则对应的动作了,所以我觉得,如果你想要修改某条规则,还不如先将这条规则删除,然后在同样位置再插入一条新规则,这样更好,当然,如果你只是为了修改某条规则的动作,那么使用-R选项时,不要忘了指明规则原本对应的匹配条件。

    DROP vs REJECT

    好了,上例中,我们已经将规则中的动作从DROP改为了REJECT,那么DROP与REJECT有什么不同呢?从字面上理解,DROP表示丢弃,REJECT表示拒绝,REJECT表达的意思好像更坚决一点,我们再次从146主机上向156主机上发起ping请求,看看与之前动作为DROP时有什么不同。

    iptables详解(3):iptables规则管理

    如上图所示,当156主机中的iptables规则对应的动作为REJECT时,从146上进行ping操作时,直接就提示"目标不可达",并没有像之前那样卡在那里,看来,REJECT比DROP更加"干脆"。

    修改指定链的默认策略

    其实,我们还可以修改指定链的"默认策略",没错,就是下图中标注的默认策略。

    iptables详解(3):iptables规则管理

    每张表的每条链中,都有自己的默认策略,我们也可以理解为默认"动作"。

    当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动作处理报文,我们可以修改指定链的默认策略,使用如下命令即可。

    iptables详解(3):iptables规则管理

    使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP。

    更多case详点此链接

    5.保存规则

    用户修改iptables规则后,下次重启iptables或服务器,此次的修改并不会生效,所以想永久保存,得执行相关save持久化操作。

    ubuntu | centos iptables操作

    ubuntu

    安装iptables:

    sudo apt-get install iptables 
    

    首先,保存现有的规则:

    iptables-save > /etc/iptables.rules
    

    然后新建一个bash脚本,并保存到/etc/network/if-pre-up.d/目录下:

    #!/bin/bash
    iptables-restore < /etc/iptables.rules
    

    这样,每次系统重启后iptables规则都会被自动加载。
    注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。

    cent OS

    我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。

    从现在开始,最好养成及时保存规则的好习惯。

    centos7中,已经不再使用init风格的脚本启动服务,而是使用unit文件,所以,在centos7中已经不能再使用类似service iptables start这样的命令了,所以service iptables save也无法执行,同时,在centos7中,使用firewall替代了原来的iptables service,不过不用担心,我们只要通过yum源安装iptables与iptables-services即可(iptables一般会被默认安装,但是iptables-services在centos7中一般不会被默认安装),在centos7中安装完iptables-services后,即可像centos6中一样,通过service iptables save命令保存规则了,规则同样保存在/etc/sysconfig/iptables文件中。

    此处给出centos7中配置iptables-service的步骤

    #配置好yum源以后安装iptables-service
    # yum install -y iptables-services
    #停止firewalld
    # systemctl stop firewalld
    #禁止firewalld自动启动
    # systemctl disable firewalld
    #启动iptables
    # systemctl start iptables
    #将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
    # systemctl enable iptables
    

    上述配置过程只需一次,以后即可在centos7中愉快的使用service iptables save命令保存iptables规则了。

    其他通用方法

    还可以使用另一种方法保存iptables规则,就是使用iptables-save命令

    使用iptables-save并不能保存当前的iptables规则,但是可以将当前的iptables规则以"保存后的格式"输出到屏幕上。

    所以,我们可以使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。

    iptables-save > /etc/sysconfig/iptables

    我们也可以将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。

    使用iptables-restore命令可以从指定文件中重载规则,示例如下

    iptables-restore < /etc/sysconfig/iptables

    再次提醒:重载规则时,现有规则将会被覆盖。

    整理自:朱双印博客,www.zsythink.net

    三.帮助文档

    iptables v1.6.1
    
    Usage: iptables -[ACD] chain rule-specification [options]
           iptables -I chain [rulenum] rule-specification [options]
           iptables -R chain rulenum rule-specification [options]
           iptables -D chain rulenum [options]
           iptables -[LS] [chain [rulenum]] [options]
           iptables -[FZ] [chain] [options]
           iptables -[NX] chain
           iptables -E old-chain-name new-chain-name
           iptables -P chain target [options]
           iptables -h (print this help information)
    
    Commands:
    Either long or short options are allowed.
      --append  -A chain		Append to chain
      					# 追加规则
      
      --check   -C chain		Check for the existence of a rule
      --delete  -D chain		Delete matching rule from chain
      --delete  -D chain rulenum
    				Delete rule rulenum (1 = first) from chain
    				# 删除链中规则,通过序号删除
    				
      --insert  -I chain [rulenum]
    				Insert in chain as rulenum (default 1=first)
    				# insert new rule into specific chain
    				
      --replace -R chain rulenum
    				Replace rule rulenum (1 = first) in chain
    				# 更改规则,update rule
    				
      --list    -L [chain [rulenum]]
    				List the rules in a chain or all chains
    				# 列出规则 规则=匹配+动作
    				
      --list-rules -S [chain [rulenum]]
    				Print the rules in a chain or all chains
      --flush   -F [chain]		Delete all rules in  chain or all chains
      				# 删除规则
      				
      --zero    -Z [chain [rulenum]]
    				Zero counters in chain or all chains
      --new     -N chain		Create a new user-defined chain
      --delete-chain
                -X [chain]		Delete a user-defined chain
      --policy  -P chain target
    				Change policy on chain to target
    				# 指定链上规则,更改
    				
      --rename-chain
                -E old-chain new-chain
    				Change chain name, (moving any references)
    Options:
        --ipv4	-4		Nothing (line is ignored by ip6tables-restore)
        --ipv6	-6		Error (line is ignored by iptables-restore)
    [!] --protocol	-p proto	protocol: by number or name, eg. `tcp'
    				# 指定匹配协议
    [!] --source	-s address[/mask][...]
    				source specification
    				# 指定 source ip      如果有感叹号,表示除某IP之外的
    				
    [!] --destination -d address[/mask][...]
    				destination specification
    				# 指定 destination ip
    				
    	--sport		# 指定源端口
        
        --dport		# 指定目标端口
    				
    [!] --in-interface -i input name[+]
    				network interface name ([+] for wildcard)
     --jump	-j target
    				target for rule (may load target extension)
    				# 指定相应动作,ACCEPT DROP RETURN, ETC
    				
      --goto      -g chain
                                  jump to chain with no return
      --match	-m match
    				extended match (may load extension)
      --numeric	-n		numeric output of addresses and ports
      # source/dest 不解析成如anywhere,而是 ip/port, 或者网段
      
    [!] --out-interface -o output name[+]
    				network interface name ([+] for wildcard)
      --table	-t table	table to manipulate (default: `filter')
      # 指定操作的表,filter | nat | mangle | raw 
      
      --verbose	-v		verbose mode
      # 显示更多信息,如pkts,bytes,source,destination,etc
      
      --wait	-w [seconds]	maximum wait to acquire xtables lock before give up
      --wait-interval -W [usecs]	wait time to try to acquire xtables lock
    				default is 1 second
      --line-numbers		print line numbers when listing
      # 显示规则编号 1,2,3,4,直接--line ubuntu也可以识别
      
      --exact	-x		expand numbers (display exact values)
      # 显示为具体的bytes大小,扩展
      
    [!] --fragment	-f		match second or further fragments only
      --modprobe=<command>		try to insert modules using this command
      --set-counters PKTS BYTES	set the counter during insert/append
    
       -i 网卡名称     匹配从这块网卡流入的数据
    
       -o 网卡名称     匹配从这块网卡流出的数据
    
    [!] --version	-V		print package version.
    
    

    iptables详解:https://blog.csdn.net/u011537073/article/details/82685586

  • 相关阅读:
    以太坊客户端geth的基本操作命令
    以太坊虚拟机介绍5-比较操作指令
    以太坊虚拟机介绍4-按位运算指令
    浏览器内核
    javascript 几个易错点记录
    jq常用方法
    jq事件操作汇总
    js事件总汇
    margin 负边距 的知识点
    子div撑不开父div的几种解决办法:
  • 原文地址:https://www.cnblogs.com/davis12/p/14317620.html
Copyright © 2011-2022 走看看