Linux 之 iptables基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 之 iptables基础相关的知识,希望对你有一定的参考价值。

 iptables基础(一)

===========================================================================

概述:




iptables介绍

1)Firewall

Firewall防火墙系统

  • 是一种隔离工具,Packets Filter Firewall (包过滤型防火墙);

  • 定义:工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件; 

  • 硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现; 

  • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;

防火墙范围分类:

  • 主机防火墙服务范围为当前主机;

  • 网络防火墙:服务范围为防火墙背后的局域网;

2)iptables/netfilter:

netfilter:防火墙框架,framework;位于内核空间;

hooks function(钩子函数)

  • prerouting:路由前

  • input :   入栈

  • forward : 转发

  • output :  出栈

  • postrouting:路由后

注意:钩子函数都是在内核中的TCP/IP协议栈上定义的。


iptables:命令行工具程序,位于用户空间;规则管理工具

CHAINS:链,在钩子上定义规则

  • PREROUTING

  • INPUT

  • FORWARD

  • OUTPUT

  • POSTROUTING

报文流向:

  • 到本机某进程的报文:PREROUTING --> INPUT 

  • 由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING

  • 由本机的某进程发出报文:OUTPUT --> POSTROUTING


3)tables 表

功能:

  • filter:过滤,防火墙;

  • nat:network address translation,网络地址转换;

  • mangle:拆解报文,做出修改,并重新封装;

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

优先级次序(由高而低):

  • raw --> mangle --> nat --> filter 

功能<-->钩子对应关系:很重要

  • raw:PREROUTING,OUTPUT

  • mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

  • nat:PREROUTING,INPUT,OUTPUT,POSTROUTING

  • filter:INPUT,FORWARD,OUTPUT

4)iptables规则的组成部分:

匹配条件:

  • 网络层首部:Source IP(源IP), Destination IP(目标IP)

  • 传输层首部:Source Port(源端口), Destination Port(目标端口)

  • 扩展检查机制:

处理动作:target 目标

  • ACCEPT:接受

  • DROP:丢弃

  • REJECT:驳回,拒绝

iptables命令使用基础

1)安装:

netfilter:位于内核中的tcp/ip协议栈报文处理框架;

iptables:

  • CentOS 5/6:iptables命令编写规则;

      # iptables -t filter -F

      # service iptables save

  • CentOS 7:firewalld,firewall-cmd, firewall-config

      # systemctl disable firewalld

程序包:iptables,iptstate

2)iptables命令的规则:

规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;

匹配条件:

  • 基本匹配条件:主要是ip层(源地址,目标地址),传输层协议;

  • 扩展匹配条件:需要借助于扩展模块进行指定的匹配条件;

       隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;

       显式扩展:隐式扩展之外的其它扩展匹配条件;

处理动作:

  • 基本动作:ACCEPT,DROP,...

  • 扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;


添加规则时需要考量的问题:

  • 报文流经的位置用于判断将规则添加至哪个链;

  • 实现的功能:用于判断将规则添加至哪个表;

  • 报文的方向:用于判断哪个为“源”,哪个为“目标”;

  • 匹配条件:用于编写能够正确匹配目标报文的规则;


2)iptables命令的使用格式:


规则使用格式

  • 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

  • rule-specification = [matches...] [target]

  • match = -m matchname [per-match-options] 扩展条件

  • target = -j targetname [per-target-options] 处理动作

规则管理格式:

     iptables [-t table] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]


-t table:指明要管理的表; 默认为filter;

COMMANDS:

  • 链管理:

      -P:iptables [-t table] -P chain target,

           定义链的默认策略;其target一般可使用ACCEPT或DROP;

      -N:iptables [-t table] -N chain,

           自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;

      -X:iptables [-t table] -X [chain]

           删除自定义的空的引用计数为0的链;

      -F:iptables [-t table] -F [chain [rulenum]] [options...],

           清空指定的链,或删除指定链上的规则 ;

      -E:iptables [-t table] -E old-chain-name new-chain-name,

           重命名自定义的引用计数为0的链;

      -Z:iptables [-t table] -Z  [chain [rulenum]] [options...]

          规则置零,置零计数器

  • 规则:

      -A:append, iptables [-t table] -A chain rule-specification,

         追加规则到指定的链尾部;

      -I:insert, iptables [-t table] -I chain [rulenum] rule-specification,      插入规则到指定的链中的指定位置,默认为链首;

      -D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,

         删除指定的链上的指定规则;

      -R:replace,iptables [-t table] -R chain rulenum rule-specification,

         将指定的链上的指定规则替换为新的规则;

  • 查看:

      -L:list, iptables [-t table] -L [chain [rulenum]] [options...]

          -n:数字格式,不要做反解;

          -v:verbose,详细格式信息;

              -vv, -vvv 

          --line-numbers:显示链上的规则的编号;

          -x:exactly,显示计数器的精确值; 


计数器:

  每条规则以及链的默认策略分别有各自的两个计数器:

  • 匹配到的报文的个数:pkts

  • 匹配到的所有报文的大小之和:bytes

命令演示:

 链管理

 1.-L 查看iptables的表和链

[[email protected] ~]# iptables -vnL # 查看表,默认指的是filter表,有三个链
Chain INPUT (policy ACCEPT 1020 packets, 92926 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 487 packets, 78021 bytes)
 pkts bytes target     prot opt in     out     source               destination         

 [[email protected] ~]# iptables -t nat -vnL # 查看nat表,有四个链
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

  2.-P 定义链的默认策略为DROP

[[email protected] ~]#  ping 192.168.1.12 # 定义之前是能ping同
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=2.56 ms
64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.499 ms
64 bytes from 192.168.1.12: icmp_seq=3 ttl=64 time=0.369 ms

[[email protected] ~]# iptables -t filter -P INPUT DROP # 定义默认策略为DROP

[[email protected] ~]#  ping 192.168.1.12
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.  # 定义之后ping不同了,链ssh远程登录都掉了

  3.-Z 自定义链

[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

[[email protected] ~]# iptables -N in_web # 定义一个in_web的链

[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain in_web (0 references) # 自定义的链,0次引用
target     prot opt source               destination

  4.-Z 删除自定义连

[[email protected] ~]# iptables -X

[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

 5.-E 重命名自定义的链

[[email protected] ~]# iptables -N in_web
[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain in_web (0 references)
target     prot opt source               destination         

[[email protected] ~]# iptables -t filter -E in_web web_input_packets # 重命名自定义链

[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain web_input_packets (0 references) # 重新定义完成
target     prot opt source               destination

  6.-Z,置零计数器,即规则置零

[[email protected] ~]# iptables -vnL
Chain INPUT (policy ACCEPT 52 packets, 5160 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 33 packets, 5558 bytes)
 pkts bytes target     prot opt in     out     source               destination         

[[email protected] ~]# iptables -Z INPUT  # 置零

[[email protected] ~]# iptables -vnL
Chain INPUT (policy ACCEPT 6 packets, 396 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 448 bytes)
 pkts bytes target     prot opt in     out     source               destination

iptables的匹配条件


匹配条件:

  • 基本匹配条件:主要是ip层(源地址,目标地址),传输层协议;

  • 扩展匹配条件:需要借助于扩展模块进行指定的匹配条件;

       隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;

       显式扩展:隐式扩展之外的其它扩展匹配条件;

注意:

  • 多重条件之间的隐含逻辑为“与”操作;

匹配规则:

  • 如果被第一条规则所匹配到,就会做处理,处理完之后就到达不了第二条规则了;

  • 不同类别服务的规则(比如控制web服务的,SSH服务的等),应该把访问比较频繁的服务所对应的规则放到前面,即:匹配机会更大的规则放到前面;

  • 同一类别的规则,要把匹配条件苛刻的,范围较小的放到前面,而范围较大的放到后面。

1.基本匹配条件

★参数:

  • [!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围;

  • [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围;

  • [!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp,  udplite, icmp,icmpv6,esp, ah, sctp, mh,或者 "all"表示所有协议;

  • [!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;只适应 INPUT, FORWARD  and  PREROUTING ;

  • [!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;

注意:这里的[!]为取反

  -m, --match match:显式指明要使用的扩展模块;

  -j, --jump target:跳转目标;

注意

   对于本地主机上的大多数的访问控制,如果只是本地作为服务器,那我们只需把INPUT链改为DROP,只放行合法的请求进来就可以;

   而对于控制本机请求别人的服务时,我们应该把OUTPUT链设为DROP,只放行认为合法的请求出去就可以;

   为了安全起见,建议INPUT和OUTUT链的默认策略应该均为DROP。

示例:

  1.添加一条规则,仅使192.168.1.0/24网络中的主机可以访问本机服务,使用-A和-s即可,如下:

# 因为是控制访问服务,所以,请求报文会首先经过INPUT链,所以,要把INPUT链的默认策略
  设置为DROP,然后只针对符合源地址要求的报文放行;

  [[email protected] ~]# iptables -t filter -P INPUT DROP 
[[email protected] ~]# ping 192.168.1.14
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. # 发现ping不同

# 添加规则,凡是来自于192.168.0.0/24网络的地址,统统放行
[ro[email protected] ~]# iptables -t filter -A -s 192.168.1.0/24 -j ACCEPT
[[email protected] ~]# ping 192.168.1.14 # 马上就可以ping 通了
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
64 bytes from 192.168.1.14: icmp_seq=120 ttl=64 time=0.919 ms
64 bytes from 192.168.1.14: icmp_seq=121 ttl=64 time=2.48 ms
64 bytes from 192.168.1.14: icmp_seq=122 ttl=64 time=2.64 ms
64 bytes from 192.168.1.14: icmp_seq=123 ttl=64 time=0.682 ms

[[email protected] ~]# iptables -vnL
Chain INPUT (policy DROP 16 packets, 1098 bytes)
# 报文 大小 处理动作   协议 选项               源地址                目标地址
 pkts bytes target     prot opt in     out     source               destination         
   74  7383 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 83 packets, 9411 bytes)
 pkts bytes target     prot opt in     out     source               destination

  1)在上题的基础上,我想禁止192.168.1.0/24 网络中ip为192.168.1.13这台主机的访问,那就需要在上题定义的规则中添加规则了,使用 -I 选项 如下:

[[email protected] ~]# iptables -I INPUT -s 192.168.1.13 -j REJECT # 插入规则
[[email protected] ~]# iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes) # 可以看到先后次序,同一类规则,范围小的放到前面
 pkts bytes target     prot opt in     out     source               destination         
    7   588 REJECT     all  --  *      *       192.168.1.13         0.0.0.0/0            reject-with icmp-port-unreachable
  235 21761 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 14 packets, 1564 bytes)
 pkts bytes target     prot opt in     out     source               destination   
 
 [[email protected] ~]# ping 192.168.1.14
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. # 每次 ping,都给你驳回了,这是REJECT 
From 192.168.1.14 icmp_seq=1 Destination Port Unreachable
From 192.168.1.14 icmp_seq=2 Destination Port Unreachable
From 192.168.1.14 icmp_seq=3 Destination Port Unreachable

  2)把规则上处理动作的REJECT换为DROP,使用-R 如下

[[email protected] ~]# iptables -R INPUT 1 -s 192.168.1.13 -j DROP # 规则替换
[[email protected] ~]# iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   336 DROP       all  --  *      *       192.168.1.13         0.0.0.0/0   # 新替换的规则        
  420 36377 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 5 packets, 700 bytes)
 pkts bytes target     prot opt in     out     source               destination    
 
[[email protected] ~]# ping 192.168.1.14 # 这是发现卡在这了,ping不同
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.

  3)删除对ip为192.168.1.13主机的限制,使用-D选项

[[email protected] ~]# iptables -vnL --line-numbers # 首先查看要删除规则的规则号
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        4   336 DROP       all  --  *      *       192.168.1.13         0.0.0.0/0           
2      439 38135 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 18 packets, 2396 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

[[email protected] ~]# iptables -D INPUT 1  # 删除指定规则的规则号码即可

# 注意:也可使用 # iptables -D INPUT 192.168.1.13 -j DROP 来指明确切的匹配条件,一定要写target

[[email protected] ~]# iptables -vnL  # 查看规则已经被删除
Chain INPUT (policy DROP 9 packets, 632 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  526 45355 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 43 packets, 5555 bytes)
 pkts bytes target     prot opt in     out     source               destination

   2.只允许指定网络192.168.1.0/24内的主机,对本机(目标地址为本机)上所有TCP协议的服务请求放行,添加一条规则,指明三重条件-s,-d,-p

[[email protected] ~]# iptables -F #首先清空所有的规则
[[email protected] ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p tcp -j ACCEPT
[[email protected] ~]# iptables -vnL
Chain INPUT (policy DROP 35 packets, 5862 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   31  2306 ACCEPT     tcp  --  *      *       192.168.1.0/24       192.168.1.14 # 新规则       

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 48 packets, 4259 bytes)
 pkts bytes target     prot opt in     out     source               destination   
 
 [[email protected] ~]# curl  #  访问web服务,可以
<html>
      <head>
           <title>Test Page</title>
      </head>
      <body>
           <h1>My Test Page</h1>
      </body>
</html>

[[email protected] ~]# ping 192.168.1.14  # 但是ping不通,因为只限制tcp协议可以访问
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
^C
--- 192.168.1.14 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2445ms


2.扩展匹配条件

  1)隐式扩展条件

定义:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;


-p tcp:可直接使用tcp协议对应的扩展选项;

  • [!] --source-port,--sport port[:port]

          匹配报文中的传输层的源端口;可给出多个连接的端口;

  • [!] --destination-port,--dport port[:port]:

          匹配报文中的传输层的目标端口;可给出多个连接的端口;

  • [!] --tcp-flags mask comp  标志位的检查机制

         标志位:SYN,ACK,FIN,RST,URG,PSH;

         mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST 

         comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;

              例如: --tcp-flags SYN,ACK,FIN,RST SYN 表示,要求只匹配tcp协议给定的这些标志位(SYN,ACK,FIN,RST)中SYN为1,而其余都为0的,这也就是tcp的第一次握手阶段。

  • [!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN  上面的简写格式


-p udp:可直接使用udp协议对应的扩展选项;

  • [!] --source-port,--sport port[:port]:

          匹配报文中的传输层的源端口;可给出多个连接的端口;

  • [!] --destination-port,--dport port[:port]:

          匹配报文中的传输层的目标端口;可给出多个连接的端口;


-p icmp(互联网控制报文协议)可直接使用icmp协议对应的扩展选项;

  • [!] --icmp-type {type[/code]|typename}

    例如:

        --icmp-type  0/0:匹配对ping请求的响应报文

        --icmp-type 8/0:匹配ping请求报文


示例:

  1.TCP协议扩展

   只开放本地的SSH服务的22号端口给本地网络(192.168.1.0/24)

分析:请求报文入栈(INPUT)时源IP和port为192.168.1.0/24网络中的任意主机ip和端口,不确定,但是
目标IP和port是确定的,都是本地服务器的ip和ssh服务tcp协议的22号端口,所以为如下规则:

[[email protected] ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p tcp --dport 22 -j ACCEPT

分析:请求报文出栈(OUTPUT)时源IP和port为本地服务器的ip(192.168.1.14)和ssh服务的22号端口,是确定,但是
目标IP和port是192.168.1.0/24网络中的任意主机ip和端口,是不确定的,所以为如下规则:

[[email protected] ~]# iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.14 -p tcp --sport 22 -j ACCEPT

然后修改本地服务器的INPUT和OUTPUT的默认策略为DROP
[[email protected] ~]# iptables -P INPUT DROP
[[email protected] ~]# iptables -P OUTPUT DROP

查看所有规则如下:
[[email protected] ~]# iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   16  1056 ACCEPT     tcp  --  *      *       192.168.1.0/24       192.168.1.14         tcp dpt:22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  107 11864 ACCEPT     tcp  --  *      *       192.168.1.14         192.168.1.0/24       tcp spt:22

 2.ICMP协议扩展

    在上题的基础上开放本机的ping请求,即允许其他人ping本机。

要想能够被别人ping到,即ping请求入栈,源ip是不确定的,目标ip是本地服务器确定,协议为icmp,其类型为8
[[email protected] ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p icmp --icmp-type 8/0 -j ACCEPT

此时虽然,ping请求可以接受,但是只能入栈却不能出栈,通过抓包可以看出,有来自192.168.1.13的请求,但本机却未作出回应
[[email protected] ~]# tcpdump -i eno16777736 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno16777736, link-type EN10MB (Ethernet), capture size 65535 bytes
00:35:43.436103 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 752, length 64
00:35:44.435252 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 753, length 64
00:35:45.435325 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 754, length 64
00:35:46.435659 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 755, length 64

开放本机的ping响应报文
[[email protected] ~]# iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.14 -p icmp --icmp-type 0/0 -j ACCEPT

[[email protected] ~]# ping 192.168.1.14 # 客户端已经可以ping通
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
64 bytes from 192.168.1.14: icmp_seq=1023 ttl=64 time=0.434 ms
64 bytes from 192.168.1.14: icmp_seq=1024 ttl=64 time=0.703 ms
64 bytes from 192.168.1.14: icmp_seq=1025 ttl=64 time=0.657 ms

  如果想让本地主机可以ping互联网上的任意主机

现在本地主机是ping不了其他主机的,因为本地主机发送不了ping的请求报文
[[email protected] ~]# ping 192.168.1.13
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted

要想能够ping其他主机要在OUTPUT上定义出栈的请求报文,如下:

[[email protected] ~]# iptables -A OUTPUT -s 192.168.1.14 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT

本地主机ping ip为192.168.1.13 的其他主机
[[email protected] ~]# ping 192.168.1.13
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.

在ip为 192.168.1.13 的主机抓包可见能够收到ip为192.168.1.13主机的请求报文,客户端主机也会发送响应报文,如下:

[[email protected] ~]# tcpdump -i eth0 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:51:09.454278 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 22, length 64
12:51:09.454311 IP 192.168.1.13 > 192.168.1.14: ICMP echo reply, id 3486, seq 22, length 64
12:51:10.454195 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 23, length 64
12:51:10.454228 IP 192.168.1.13 > 192.168.1.14: ICMP echo reply, id 3486, seq 23, length 64
12:51:11.454249 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 24, length 64


虽然本地主机的ping请求发送出去了,但是ping的其他主机的响应报文不能入栈,所以要定义其他主机
的响应报文入栈,如下:

[[email protected] ~]# iptables -A INPUT -d 192.168.1.14 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT

[[email protected] ~]# ping 192.168.1.13 # 可以ping通,也有回应了
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.
64 bytes from 192.168.1.13: icmp_seq=1 ttl=64 time=5.02 ms
64 bytes from 192.168.1.13: icmp_seq=2 ttl=64 time=0.512 ms


  2)显式扩展条件

定义:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;












































以上是关于Linux 之 iptables基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux基础优化之SElinux和iptables项

linux基础之iptables SNAT和DNAT

iptables系列之基础原理

第二十五天 IPtable基础框架扩展匹配及防火墙原理iptable入门

iptables基础知识

Linux防火墙之通俗易懂的iptables五表五链解释