码迷,mamicode.com
首页 > 其他好文 > 详细

防火墙的配置与备份----iptables的四条链

时间:2017-10-12 10:14:16      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:防火墙   iptables   nat   filter   input   forward   

一、基本知识

    在现在的网络环境当中,我们使用的主机或者服务器很容易受到攻击,所以人们不断的针对各种攻击研究相应的对策,像杀毒软件这些,但是这些都是治标不治本,只能在受到攻击的之后再做出相应的处理,那么为了能够从根源上应对这种攻击,人们开发出了防火墙,将不安全的因素挡在主机外部,这样避免了主机和网络的直接接触就使主机的安全提升了很多。但是哪些才能算作不安全的因素呢?这就要考验防火墙规则的编写人员了。

    在linux系统中使用的防火墙管理软件叫做“iptables”,这个软件仅仅是一款面向我们使用者的客户端软件,真正起作用的是一个叫做“netfilter”的软件,这个软件存在于内核当中,人们在“iptables”中编写规则,然后这些规则被“netfilter”读取,接下来“netfilter”就根据这些规则进行过滤,只有规则中允许的网络访问才放行。这样就将一些未知的危险避免掉了。

    在防火墙中定义了五条规则链(chain),分别是:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,但是这样不好理解,所以人们又定义出了四张表来对五条规则链进行描述,四张表分别如下:

    filter:进行过滤,防火墙

    nat:用于修改报文的源地址或目的地址,以及端口号,负责地址转换和地址伪装

    mangle:拆解报文并对封装格式进行修改,然后再重新封装报文,负责流量控制和数据标签

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


    这四张表的优先级是:raw --> mangle --> nat --> filter,就是当防火墙进行过滤的时候按照这个顺序来进行读取。这四张表分别包含了以下链:

    raw:PREROUTING,OUTPUT

    mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    nat:PREROUTING,OUTPUT,POSTROUTING,INPUT

    filter:INPUT,FORWARD,OUTPUT

    注意:在CentOS 7中的nat表包含INPUT链,在此之前的其他发行版本的iptables中,nat表则不包含INPUT链

    注意:每一个表中包含的链和其他表中的链是不同的,即在别的表中向链里添加的规则在本表中的链是无法找到的

    这样划分表的好处是将不同的功能进行区分,四个表分别对应不同的功能,而且有一个执行的先后顺序,如果一个数据包仅仅需要转发的功能,而不需要到本机来,那么它就不需要去匹配到本机来的那些规则。这样不仅提升了过滤的速度还省下了不少的资源。下面这张是网上找的图片:

技术分享

    根据上面定义的表,在匹配规则的时候就有了一定的顺序:

        流入本机访问某进程的数据报文:

            PREROUTING --> INPUT

        由本机某进程发送出去的数据报文:

            PREROUTING --> OUTPUT --> POSTROUTING

        经由本机转发的数据报文:

            PREROUTING --> FORWARD --> POSTROUTING

    netfilter的规则匹配顺序:首项匹配,即如果匹配成功了第一条,那么后头的都不匹配

        netfilter的规则一般是:匹配的条件 + 处理的动作,意思就是当匹配成功了这条规则,那么就执行后面的指定的动作。匹配的条件分为两种,一种是基本的匹配条件,这种匹配条件仅仅能够简单的检测IP、TCP、UDP等报文的首部中某特定属性并进行匹配的机制;第二种是扩展的匹配条件,这种匹配条件需要借助于扩展的功能模块进行匹配的机制。处理的动作也是分为两种,第一种是基本的处理,分成了三个,分别是:ACCEPT(接受),DROP(收到直接丢弃,无回复),REJECT(收到之后回复拒绝信息,带有挑衅色彩,尽量不用);第二种是扩展动作,需要借助于扩展模块才能进行的处理动作。

    在添加规则之前我们要先考虑三件事,分别是:

1.报文的流经路径,以判断将规则添加至哪个链上

2.确定此次规则匹配实现的功能,以判断将规则添加至哪个表

3.要确定匹配条件,以用于匹配数据报文

二、管理规则

 iptables命令

    规则的通用编写格式

iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-match-options]

    -t table:指定选择功能表,可以选择的有raw,mangle,nat,filter,默认的是filter,默认的是filter表

    COMMAND:

      链的操作命令:

-P:policy,策略,定义指定链的默认策略;一般有两种选择,即ACCEPT或DROP(当所有的规则都不能匹配的时候所采取的操作)

-N:new chain,新建一条自定义的规则链(默认是没有意义的),只有被内建链上的规则调用才能使自定义规则链上的规则生效; -j chain_name

-X:drop chain,删除被内建链引用次数为零的自定义链

-F:flush,清除指定链上的所有规则(里边的所有规则都会被废弃),如果没有指定链则清空整个表上的所有链的所有规则

-E:重命名被内建链引用次数为零的自定义链

      规则的操作命令:

-A:append,追加,在指定的链的尾部追加一条规则

-I [#]:insert,插入成为第#条,如果省略了这个数字则表示插入到链的第一条

例如: -I 3:将此条规则插入链中成为第三条

-D [#]:delete,删除,删除指定的规则

-R:reolace,替换,用指定的规则去替换目标链中的原有规则;不能仅修改规则中的某一部分,而是整条规则完全替换

例如:要想替换其中的一部分,也要将其他部分原封不动的再写一遍

      查看规则的命令:

-L:list,列出指定表指定链上的所有规则

-n:numeric,将规则中的信息数字化显示,主要指:主机名和端口号

-v:verbose,显示详细格式的信息,还有-vv,-vvv

-x:exactly,精确的显示计数器的结果

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

      每一条规则都有两个计数器

1.匹配的报文的个数

2.匹配的报文的总的字节数

        重置规则计数器(将计数器计数归零)

   -Z:zero,将指定表指定链上的规则的计数器置零

    CHAIN:

        这里的链可以是内建的五条链:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,在写命令的时候内建链必须全部大写

        还可以是自建链,名字大小写均可以

    

    匹配条件(大部分的命令内容都是匹配条件):

     基本匹配条件

默认情况下多个条件之间是逻辑“与”的关系

!:指对匹配的条件取反;有除了...之意

[!] -s, --source address[/mask][,...]

检查报文中的源IP地址是否符合此条件指定的地址或范围

[!] -d, --destination address[/mask][,...]

检查报文中的目标IP地址是否符合此条件指定的地址或范围

[!] -p, --protocol protocol

检查封装报文的协议是否符合此条件指定的协议

protocol:tcp,udp,ip,icmp,arp,...

只要是TCP/IP协议栈中,传输层和网络层的协议均可

[!] -i, --in-interface name

检查数据报文入站的接口是否对应此条件中指定的接口

[!] -o, --out-interface name

检查数据报文出站的接口是否对应此条件中指定的接口

    注意:在INPUT链上指定出站接口没有意义;在OUTPUT链上指定入站接口没有意义

      在规则定义的时候要注意以下事项:

1.规则的匹配按照顺序由上至下,规则的编写顺序:

   1)同一类规则,匹配范围最小的放在最前面;

   2)非同一类规则,匹配频率越高的放在最前面;

   3)设置最后一条规则或默认策略为拒绝所有主机访问;

2.尽可能减少规则的数量,能不写的就不写,能合并的就合并;规则精简;

3.定时对规则进行备份,避免失误无法挽回的情况;


        基本匹配条件示例:

    允许来自IP:172.16.0.0/16访问目标主机:172.16.72.1和172.16.72.101(可以是同一块网卡上的两个IP,也可以是一台主机上的两块网卡分别的两个IP)(如果没指定表,默认是filter表,下同)

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.1,172.16.72.101 -j ACCEPT

    将INPUT链的默认策略修改为“DROP”,即当所有匹配条件都没匹配成功时执行“DROP”拒绝

iptables -P INPUT DROP (注意:最好是在链最后添加"拒绝所有主机访问"的规则)

    将允许来自172.16.0.0/16网段访问172.16.72.101 IP的规则插入到INPUT链的第二条

iptables -I 2 INPUT -s 172.16.0.0/16 -d 172.16.72.101 -j ACCEPT

    将允许172.16.0.1访问172.16.72.1的TCP 22号端口规则插入到INPUT链第一条(在-I选项后如果没表明数字,默认是插入到第一条,下同)

iptables -I INPUT -s 172.16.0.1 -d 172.16.72.1 -p tcp --dport 22 -j ACCEPT

    拒绝别的主机ping本机(0类型叫做回显应答(ping应答),8类型叫做回显请求(ping请求))

iptables -I INPUT 2 -s 172.16.69.1 -p icmp --icmp-type 8 -j ACCEPT

    阻止本机ping别的主机(一般将此条放到OUTPUT链上,icmp-type改为8,实现的功能类似(如果没改,那么功能是阻止别的主机ping本机)(规律就是在INPUT链上8进,0出;在OUTPUT链上反过来))

iptables -I INPUT 3 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
iptables -I OUTPUT 3 -d 172.16.0.0/16 -p icmp --icmp-type 8 -j ACCEPT

    扩展匹配条件:

        隐式扩展

            -p {tcp|udp|icmp|ip...} [-m tcp|udp|icmp](可写可不写,称为隐式扩展)

   tcp:--sport,--dport,--tcp-flags,--syn(相当于--tcp-flags SYN,RST,ACK,FIN SYN   这样写的意思是前半部分为必检查部分,后头为必为1的部分,即除了后头这个标志之外,其他都要为0。例如上面的--tcp-flags SYN,RST,ACK,FIN SYN,SYN必为1,RST,ACK,FIN必为0)

   udp:--sport,--dport

   icmp:--icmp-type {8|0}

        显示扩展:


1.multiport扩展(多端口扩展);

 以离散或连续的方式定义多个端口匹配条件:

 [!] --source-ports,--sports port[,port|,port:port]...(多个源端口)

 [!] --destination-ports,--dports port[,port|,port:port]...(多个目的端口)

 [!] --ports port[,port|,port:port]...(多个源或目的端口,源、目的端口同时匹配)

例如:21,22,23,80,1000:2000

        示例:

~]# iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT


2.iprange扩展:

   以连续的IP地址范围指明连续的多个地址的匹配条件:

   [!] --src-range from[-to]

   [!] --dst-range from[-to]

  例如:172.16.50.1-172.16.72.254

  示例:

~]# iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT


3.string扩展:

   对报文中的应用层数据做字符串匹配检测;

   --algo {bm|kmp}:选择处理字符串的算法;

   [!] --string pattern:指明要检查匹配的字符串;

示例:

~]# iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP


4.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 -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT


5.connlimit扩展:

  根据每个客户端IP做并发连接数的匹配

  --connlimit-upto n:连接数数量小于等于n,此时规则应设置为允许

  --connlimit-above n:连接数数量大于n,此时规则应设置为拒绝

示例:

~]# iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT


6.limit扩展:

  基于收发报文的速率进行匹配

  --limit rate[/second|/minute|/hour|/day]

  --limit-burst number

示例:

~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT


7.states扩展:

   状态检测:基于连接追踪机制实现:conntrack

   状态:

INVALID:无法识别的状态;无效状态

ESTABLISHED:已建立连接的状态;连接态

NEW:尚未建立连接的状态,新连接态

RELATED:与其他已建立的连接相关联的状态;关联态或衍生态(如果允许了一个,那么它所衍生的均放行)

UNTRACKED:未追踪的连接

   追踪到的连接所保存的位置

/proc/net/nf_conntrack

   能够被追踪的最大连接数的定义:

/proc/sys/net/nf_conntrack_max

(lsmod:查看模块(卸载模块))

(modprobe nf_conntrack_ftp:加载模块)

(modprobe -r:移除模块)

注意:此最大连接数的数值,建议必要时可以调整到足够大

   不同协议的连接追踪的超时时间:

/proc/sys/net/netfilter/*timeout

示例:

~]# iptables -I INPUT -d 172.16.72.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
`]# iptables -I INPUT 2 -d 172.16.72.1 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP

注意:默认的规则或最后一条规则拒绝所有主机访问;

~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP

    FORWARD链:

    以上的操作如果没有指明特定的表的话,都是在filter表中进行的修改,那么我们如果有一个数据包不需要进入本主机,而是直接转发出去,就可以使用nat表的FORWARD链进行设置,但是在进行设置之前,如果我们是在一台主机上进行实验,那么就要先将这台主机的转发功能开启,开启转发的三种方法:

1.echo 1 > /proc/sys/net/ipv4/ip_forward
2.sysctl -w net.ipv4.ip_forward=1
3.echo "net.ipv4.ip_forward = 1" >> vim /etc/sysctl.conf
  sysctl -p

    以上这三种方法实现的功能都是一样的。接下来就开始做转发的实验,首先我们要准备至少两台主机,现在我准备了三台主机,IP分别是:172.16.7.100/16、(172.16.6.3、172.61.6.3)、172.61.7.1,在括号中的两个IP是同一台主机上的两个不同IP:

技术分享

技术分享

    此时,只有同网段的IP可以互相ping通,例如,172.16.7.100可以ping通172.16.6.3,但是不能ping通172.61.6.3,在IP为172.16.6.3的主机上可以通过IP172.61.6.3 ping通172.61.7.1,172.16.7.100 ping 172.61.6.3不通的原因是因为我们没有进行默认网关指定:

技术分享

技术分享

技术分享

    所以我们需要在IP为172.16.7.100的主机上设置默认网关,使用命令:

~]# route add default gw 172.16.6.3

技术分享

    但是还是不能ping 172.61.7.1,这是因为没有在IP为172.16.6.3的主机上设置转发,在我准备的这三台主机中,IP为172.16.6.3的这台主机相当于一台防火墙,172.61/16网段相当于内网,而172.16/16网段相当于外网。使用下面这条命令(上面提到的三种方法都可以)开启相当于防火墙的这台主机的转发功能:

~]# sysctl -w net.ipv4.ip_forward=1

    然后将作为内部IP为172.61.7.1的主机的默认网关也设置为172.61.6.3这台主机:

~]# route add default gw 172.61.6.3

    上面的操作可以用下面这张图来概括(箭头代表数据流向,比如ping主机3,则是数据包先到主机2,然后再到主机3):

技术分享

    此时,主机1就可以ping通主机3了:

技术分享

    此时我们就可以在主机2上添加一条规则来检验FORWARD链是否有效:

~]# iptables -I FORWARD -s 172.16.7.100 -d 172.61.7.1 -j ACCEPT

    还可以使用“watch”命令动态查看规则匹配到的数量:

~]# watch iptables -vnL

    然后在主机1上ping主机3,“ping 172.61.7.1”就可以在watch命令中看到不断增长的匹配到的数目:

技术分享

    这样,就说明FORWARD链已经工作起来了,然后我们就可以写自己的规则:

~]# iptables -A FORWARD -j DROP 
    拒绝所有的转发,这一条写在最后,就可以避免一些未知的访问
~]# iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    这一条是允许状态为ESTABLISHED或者RELATED的数据包通过
~]# iptables -I FORWARD 2 -d 172.61.7.1 -p tcp -m multiport --dports 21:23,80,3306 -m state --state NEW -j ACCEPT
    这一条是允许访问目标IP为172.61.7.1且端口为21到23,和80、3306的状态为新建立连接的TCP数据包通过
~]# iptables -I FORWARD 3 -d 172.61.7.1 -p udp --dport 53 -m state --state NEW -j ACCEPT
    这一条是允许目标IP为172.61.7.1端口为UDP的53号,状态为新建的数据包通过
~]# iptables -I FORWARD 4 -s 172.61.7.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
    这一条是允许外部主机ping内部网段为172.61.7.0/24的主机

    建立自定义链:

    在一台配置了很多的规则的主机上想要对规则进行管理是一件很麻烦的事情,所以我们可以通过自定义链的方式来对规则进行更好的管理。

    自定义链的配置方法:

~]# iptables -N udp_match
    首先要建立一条自定义链,并为其命名
~]# iptables -A udp_match -j RETURN
    然后在自定义链中最好添加一条这个规则,目的是当执行完自定义链之后返回调用此链的主链(后头会再说)
~]# iptables -I udp_match -d 172.61.7.1 -p udp --dport 53 -j ACCEPT
    最后就可以在自定义链中添加规则了

    但是定义好的自定义链是无法使用的,因为防火墙是不管这种自定义链的,所以我们要将自定义链挂到五条主链上,使用命令:

~]# iptables -I FORWARD 4 -p udp -j udp_match
    这条规则的作用是当在FORWARD链中匹配到udp协议的数据包时就跳转到自定义链中

    由此我们可以发现自定义链的优点是不仅能够对规则进行分类,更好的作用是对匹配的内容进行分类,例如上面这个例子,如果一个数据包不是udp协议,那么就可以直接跳过很多的规则,这样大大的增快了匹配的速度。

    有的时候我们需要更改自定义链的名称:

注意:要改名的自定义链不能被其他链引用

~]# iptables -E old_chain_name(原来的名字) new_chain_name(新的名字)

示例:

~]# iptables -E udp_match udp


    还有可能需要删除自定义链:

~]# iptables -X udp

注意:

  1.要删除的自定义链必须是引用计数为0的链;即不能被任何其他链引用链接;

  2.要删除的自定义链上必须为空,即没有任何规则;



    NAT表:

    NAT英文全称是“Network Address Translation”

    从网络上查到的一句话很简单的概括了这个表的作用:顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题,想知道更多,可以到这个网址看看:http://blog.jobbole.com/90005/

http://blog.csdn.net/jk110333/article/details/8229828

    NAT的主要功能有两个,分别是:

      1.NAT,网络地址转换

1) SNAT:让内部网络中的主机访问外部网络;在路由之后完成地址转换,将此类规则配置在POSTROUTING链上

  a.静态地址转换

  b.地址伪装(动态地址转换)

2) DNAT:让外部网络中的主机访问内部网络中的服务器上的各服务;在路由之前完成地址转换,将此类规则配置在PREROUTING链上

  地址转换+端口映射

      2.NAPT,端口转换或端口映射


SNAT的静态地址转换帮助我们将内网的IP转化为外网的IP:

--to-source [ipaddr[-ipaddr]][:port[-port]]

注意:在REHL系或CentOS系操作系统上,SNAT中指定ipaddr必须为当前主机已经配置的IP地址;

示例:

~]# iptables -t nat -R POSTROUTING 1 -s 172.16.0.0/16 -j SNAT --to-source 172.61.100.100

    接下来我们开始做网络地址转换的实验,首先还是上面的那三台主机,分别如图所示:

技术分享

    此时我们将主机1当作内部网络,主机2当作防火墙,主机3当作外部网络,因为是外部网络,所以不可能有指向防火墙的默认网关,所以我们仅仅在主机3上设置默认网关:

~]# route add default gw 172.16.6.3

    因为没有默认网关,所以172.16.7.100到172.61.7.1的数据包是可以到达的,但是却不能返回,所以表现出来的结果就是无法ping通:

技术分享

    在主机3上可以使用下面这个命令查看到本机网络接口的数据包(要保持ping不中断)(使用CTRL+C终止):

 ~]# tcpdump -i eth0 icmp

技术分享

    此时我们可以使用下面这条命令来转化源IP地址:

~]# iptables -t nat -I POSTROUTING -s 172.16.7.100 -j SNAT --to-source 172.61.6.3

    注意:转化后的目标地址必须是在当前主机上存在的地址,比如说我现在是在主机2上写的这条规则,那么主机2上就必须有172.61.6.3这个IP。

    在写入这条规则之后,再重新进行ping操作,即可发现可以ping通了:

技术分享

 

MASQUERADE:这个也属于SNAT地址转换,但是不同于上头的在于它不用指定转换的目标IP,它会根据当前的网卡信息自动选择IP,格式为:

    --to-ports port[-port]

示例:

~]# iptables -t nat -I POSTROUTING 1 -s 172.16.0.0/16 -j MASQUERADE

    以上就是类似于从局域网内穿透出去访问外网的防火墙设置方法,那么接下来就来说一说从外部访问内部的配置方法:DNAT

    格式为:--to-destination [ipaddr[-ipaddr]][:port[-port]]

    它的作用在于隐藏内部主机的IP,而当外部主机有需要访问内部主机的时候,只能访问防火墙,在通过防火墙来将IP转换为内部主机,避免了外部主机和内部主机的直接接触。

    例如,我们还是在刚才的三个主机中当作防火墙的主机2中写入如下规则:

~]# iptables -t nat -A PREROUTING -d 172.61.6.5 -j DNAT --to-destination 172.61.7.1

    这样就将指向防火墙的IP指向了内部的主机,我们可以通过ssh命令连接172..61.6.5,发现登陆上去的IP是172.61.7.1:

技术分享

    这样就实现了隐藏内部主机IP或者说从外网访问内网的功能,除此之外,我们还可以专门针对某一个服务来做端口的转换,这样我们就可以将不同的服务部署在不同的主机上。实验使用到的环境还可以是上面的三个主机,不过,我们要将刚才的那条规则删掉,使用下面这条命令:

~]# iptables -t nat -F PREROUTING

    然后,我们在主机3上使用下面这条命令建立一个网页(首先要确保httpd已经安装并开启,安装方法参考之前的博文):

~]# echo "Hello, This 172.61.7.1" > /var/www/html/index.html

    同时修改主机3上监听的端口号(默认是80),改为8090(通过配置文件修改,找到Listen 80这一行,在后边加上90):

~]# vim /etc/httpd/conf/httpd.conf
    或者sed命令:
~]# sed -in /^Lis*/c"Listen 8090" ~]# systemctl restart httpd.service

    再在主机2上同样也建立一个网页(这个网页没有用处,只是为了验证访问的不是这个网址):

]# echo "Hello, This 172.61.7.1" > /var/www/html/index.html

    最后,我们在作为防火墙的主机2上编写下面这条规则:

~]# iptables -t nat -A PREROUTING -d 172.16.6.6 -p tcp --dport 80 -j DNAT --to-destination 172.61.7.1:8090

    此时就可以使用下面这个命令来获取网页了(发现,虽然访问的是172.61.6.6,但是返回的是172.61.7.1的网页):

~]# curl http://172.61.6.6

    或者我们还可以再添加一条命令:

~]# iptables -t nat -A PREROUTING -d 172.16.6.3 -p tcp --dport 80 -j DNAT --to-destination 172.61.7.1:8090

    这样将172.16.6.3的80端口也转移到172.61.7.1的8090端口上:

技术分享

REDIRECT:当然,还可以在主机3上直接进行端口重定向

格式:--to-ports port[-port]

    首先先将刚才的地址转换删除:

~]# iptables -t nat -F PREROUTING

    这样虽然不能地址转换了,但是因为POSTROUTING链的规则还在,所以我们可以直接访问172.61.7.1的8090端口,但是不接端口还是不行,因为默认的是80端口:

~]# curl http://172.61.7.1:8090

技术分享

    接下来在主机3上使用下面这个命令,即可发现此时再执行刚才的命令,就可以发现通了:

~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8090

技术分享

三、规则的备份和恢复

    上面就是配置规则的方法了,但是有的时候不可避免的会出现规则丢失,所以我们要对防火墙的规则定时的备份。使用命令:

iptables-save > /PATH/TO/SOME_RULE_FILE(保存到一个不会丢失的路径下) -- 备份
iptables-restore < /PATH/FROM/SOME_RULE_FILE    -- 恢复
    也可以直接使用命令:
        service iptables save (CentOS 6 中)
            默认会将当前生效的所有规则直接送往/etc/sysconfig/iptables文件中保存;



防火墙的配置与备份----iptables的四条链

标签:防火墙   iptables   nat   filter   input   forward   

原文地址:http://11142243.blog.51cto.com/11132243/1971546

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!