INPUT/OUTPUT/FORWARD只用于-t filter

  • INPUT    如果包的目标就是本机,则包直接进入INPUT链,再被本地正在等待该包的进程接
  • OUTPUT   两类包走OUTPUT,一类是INPUT入的包,一类是主机本身产生的包
  • FORWARD    如果包的目标不是本机,而是穿过本机的包,则进入FORWARD链,FORWARD既不走INPUT,也不走OUTPUT


 

     

POSTROUTING/PREROUTING只用于-t nat


  • PREROUTING    进入路由之前进行,最先进行,DNAT
  • POSTROUTING    进入路由之后进行,最后进行,SNAT
–t nat –A POSTROUTING –s 192.168.1.0 –j SNAT

     SNAT是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址,可能有人觉得奇怪,好好的为什么要进行ip地址转换啊,为了弄懂这个问题,我们要看一下局域网用户上公网的原理,假设内网主机A(192.168.2.8)要和外网主机B(61.132.62.131)通信,A向B发出IP数据包,如果没有SNAT对A主机进行源地址转换,A与B主机的通讯会不正常中断,因为当路由器将内网的数据包发到公网IP后,公网IP会给你的私网IP回数据包,这时,公网IP根本就无法知道你的私网IP应该如何走了。所以问它上一级路由器,当然这是肯定的,因为从公网上根本就无法看到私网IP,因此你无法给他通信。为了实现数据包的正确发送及返回,网关必须将A的址转换为一个合法的公网地址,同时为了以后B主机能将数据包发送给A,这个合法的公网地址必须是网关的外网地址,如果是其它公网地址的话,B会把数据包发送到其它网关,而不是A主机所在的网关,A将收不到B发过来的数据包,所以内网主机要上公网就必须要有合法的公网地址,而得到这个地址的方法就是让网关进行SNAT(源地址转换),将内网地址转换成公网址(一般是网关的外部地址),所以大家经常会看到为了让内网用户上公网,我们必须在routeros的firewall中设置snat,俗称IP地址欺骗或伪装(masquerade)。



DNAT 的全称为Destination Network Address Translation目的 地址转换,常用于防火墙中。


DNAT:目的 地址转换的作用是将一组本地内部的 地址映射到一组全球地址。通常来说,合法地址的数量比起本地内部的地址数量来要少得多。RFC1918中的地址保留可以用地址重叠的方式来达到。当一个内部主机第一次放出的数据包通过 防火墙时,动态NAT的实现方式与静态NAT相同,然后这次NAT就以表的形式保留在防火墙中。除非由于某种个原因会引起这次NAT的结束,否则这次NAT就一直保留在 防火墙中。引起NAT结束最常见的原因就是发出连接的主机在预定的时间内一直没有响应,这时空闲计时器就会从表中删除该主机的NAT。


如何区分SNAT 和 DNAT?




从定义来讲它们一个是 源地址转换,一个是目标地址转换。都是 地址转换的功能,将私有地址转换为公网地址。


要区分这两个功能可以简单的由连接发起者是谁来区分:


内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由 路由器或者防火墙上的网关对内部地址做个 地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。


当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由 路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做 地址转换,此转换称为DNAT,主要用于内部服务对外发布。


在配置防火墙或者 路由acl策略时要注意这两个NAT一定不能混淆。

INPUT里是否包括FORWARD的,还是只针对以防火墙为目标的 ? 

INPUT不包括FORWARD 

就是针对防火墙为目标的 


  
  
  
  
INPUT是否是缺省?因为有的iptables -A条目没有INPUT/OUTPUT/FORWARD,如iptables -L? 

no,没有,则代表所有,INPUT/OUTPUT/FORWARD/POSTROUTING/PREROUTING 

比如iptables –F,表示刷新-t filter 的INPUT/OUTPUT/FORWARD 

  
FOWARD是基于两个接口的,不象INPUT,OUTPUT都是基于单一接口的 

    
 /sbin/iptables -A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

 /sbin/iptables -A FORWARD -o eth0 -p all -j ACCEPT
为什么没有eth1的两条? 

 /sbin/iptables -A FORWARD -i eth1 -p all -j ACCEPT
 /sbin/iptables -A FORWARD -o eth1 -p all -j ACCEPT
因为FORWARD不是基于接口的,或者说他是基于两个接口的 

FORWARD -o eth0 ACCEPT就已经包括从其他任意接口(eth1)入的了 

FORWARD -i eth0 ACCEPT就已经包括从其他任意接口(eth1)出的了 


  
  
 或者说, 
以后建议FORWARD都尽量用-i –o 双接口参数 

i eth0 –o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
 /sbin/iptables -A FORWARD -i eth1 -o eth0


====================================match==================================== 



  
  
  
  
-s, --src, --source,匹配数据包的源地址 

  
  
  
  
-d, --dst, –destination匹配数据包的目的地址


-s 192.168.1.1

但还是建议都写成网络形式192.168.1.1/32

单个地址形式

-s 192.168.1.0/24

-s 192.168.1.0/255.255.255.0 

网络形式

(正掩码)

-s all

-s 0.0.0.0/0

所有地址

缺省就是-s all

即条目中没有-s,就表示所有地址


 

 


缺省(无--sport),表示匹配所有端口

--sport 135

单端口

--sport TELNET

单个服务名,服务名必须在/etc/services 文件中进行标注

--sport 135:139

连续端口

匹配源端口从135到139

--sport 1024:

匹配源端口从1024到65535

--sport !1032

表示除了该端口以为的其他所有端口


 

匹配一段地址range(又无法用掩码表示的) 

[!]--src-range ip-ip  
  
  

[!]--dst-range ip-ip  
  
  



  
  
  
-i, --in-interface            

  
  
  
 -i只适用于INPUT、FORWARD、PREROUTING链中, 
而用在OUTPUT POSTROUTING都会出错 
。 

  
  
  
 -i  
 eth+:可以用通配符,表示匹配从所有的以太接口进入的数据包 

  
  
  
 可以用去反符号 
“!”来标示”除了” 
被列出的接口的所有接口。 


  
  
  
  
-o, --out-interface          

  
  
  
 -o 适用于OUTPUT、FORWARD,POSTROUTING, 
而用来INPUT,PREROUTING会出错 


  
  
  
  
-i -o     

#iptables –A FORWORD –i eth0 –o eth1 –p tcp –j ACCEPT 

凡是从eth0接口进入,从eth1接口流出的tcp数据流被允许通过 



  
  
  
  
-p, --protocol [!] protocol两种方式 

•    -p name, 
•   
-p all只表示tcp、udp、icmp这三种协议,而不包括RFC1340(/etc/protocol)中的所有协议。其他协议,要用数字
 缺省是-p all,即:不写-p时, 
•   
 -A INPUT -p 50 -j ACCEPT
 -A INPUT -p 51 -j ACCEPT 
-p 0相当于-p all


  
  
  
-p tcp --sport,-p tcp --source-port 

  
  
  
-p tcp --dport,-p tcp --destination-port


 

     

注意--sport,--dport可以单个端口,可以连续端口,但不支持逗号枚举端口,逗号枚举必须加-m multiport参数 

 -p tcp -m multiport --sport/--dport
 iptables -A FORWARD –i eth0 –p tcp –m multiport --dports 25,80,110,443,1863 –j ACCEPT


  
  
  
  
--ports用于源、目的端口相同时 



  
  
  
-p tcp下的子参数—tcp-flags       


-p tcp --tcp-flags SYN,ACK,FIN,RST SYN

  
[!]  
–syn 

  
  
  
 It is equivalent to  
--tcp-flags SYN,RST,ACK SYN.    

主要用于匹配和连接有关的数据包 

  


  
  
  
  
-p icmp --icmp-type ... 

icmp-type类型的指定可以取数字或名字: 

•    数字   
   -p icmp –icmp-type:0
 icmp echo-request   
•    name  
 [root@demo1 ~]# /sbin/iptables -p icmp -h
 iptables v1.2.11

 ICMP v1.2.11 options:
  --icmp-type [!] typename       match icmp type
                                 (or numeric type or type/code)

 Valid ICMP Types:
 any
echo-reply (pong)
destination-unreachable
 
 
 
 
    fragmentation-needed
    network-unknown
    host-unknown
    network-prohibited
    host-prohibited
    TOS-network-unreachable
    TOS-host-unreachable
    communication-prohibited
    host-precedence-violation
    precedence-cutoff
 source-quench
 redirect
    network-redirect
    host-redirect
    TOS-network-redirect
    TOS-host-redirect
echo-request (ping)
 router-advertisement
 router-solicitation
time-exceeded (ttl-exceeded)
    ttl-zero-during-transit
    ttl-zero-during-reassembly
 parameter-problem
    ip-header-bad
    required-option-missing
 timestamp-request
 timestamp-reply
 address-mask-request
 address-mask-reply

  
  
  
  
对PING的处理 

•   
 iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
  这是FW对外PING包的回包
• echo request
 iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second --limit-burst 10 -j ACCEPT
 iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
 对icmp echo-request限制,防止ping flood,也可以直接对所有icmp包限制