INPUT/OUTPUT/FORWARD只用于-t filter
POSTROUTING/PREROUTING只用于-t 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都是基于单一接口的
为什么没有eth1的两条?
因为FORWARD不是基于接口的,或者说他是基于两个接口的
FORWARD -o eth0 ACCEPT就已经包括从其他任意接口(eth1)入的了
FORWARD -i eth0 ACCEPT就已经包括从其他任意接口(eth1)出的了
或者说,
以后建议FORWARD都尽量用-i –o 双接口参数
====================================match====================================
-s, --src, --source,匹配数据包的源地址
-d, --dst, –destination匹配数据包的目的地址
匹配一段地址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 同时匹配入口和出口的,只有非NAT的FORWARD链
#iptables –A FORWORD –i eth0 –o eth1 –p tcp –j ACCEPT
凡是从eth0接口进入,从eth1接口流出的tcp数据流被允许通过
-p, --protocol [!] protocol两种方式
-p tcp --sport,-p tcp --source-port
-p tcp --dport,-p tcp --destination-port
注意--sport,--dport可以单个端口,可以连续端口,但不支持逗号枚举端口,逗号枚举必须加-m multiport参数
--ports用于源、目的端口相同时
-p tcp下的子参数—tcp-flags --syn
[!]
–syn
It is equivalent to
--tcp-flags SYN,RST,ACK SYN.
主要用于匹配和连接有关的数据包
-p icmp --icmp-type ...
icmp-type类型的指定可以取数字或名字:
对PING的处理
- INPUT
如果包的目标就是本机,则包直接进入INPUT链,再被本地正在等待该包的进程接 - OUTPUT
两类包走OUTPUT,一类是INPUT入的包,一类是主机本身产生的包 - FORWARD
如果包的目标不是本机,而是穿过本机的包,则进入FORWARD链,FORWARD既不走INPUT,也不走OUTPUT
- PREROUTING
进入路由之前进行,最先进行,DNAT - POSTROUTING
进入路由之后进行,最后进行,SNAT
iptables –t nat –A POSTROUTING –s 192.168.1.0 –j SNAT --to-source 219.142.217.161 |
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
就是针对防火墙为目标的
no,没有,则代表所有,INPUT/OUTPUT/FORWARD/POSTROUTING/PREROUTING
比如iptables –F,表示刷新-t filter 的INPUT/OUTPUT/FORWARD
FOWARD是基于两个接口的,不象INPUT,OUTPUT都是基于单一接口的
/sbin/iptables -P FORWARD DROP /sbin/iptables -A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT /sbin/iptables -A FORWARD -o eth0 -p all -j ACCEPT |
/sbin/iptables -A FORWARD -i eth1 -p all -j ACCEPT /sbin/iptables -A FORWARD -o eth1 -p all -j ACCEPT |
FORWARD -o eth0 ACCEPT就已经包括从其他任意接口(eth1)入的了
FORWARD -i eth0 ACCEPT就已经包括从其他任意接口(eth1)出的了
/sbin/iptables -A FORWARD -i eth0 –o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT /sbin/iptables -A FORWARD -i eth1 -o eth0 -p all -j ACCEPT |
====================================match====================================
-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,就表示所有地址 |
[!]--src-range ip-ip
[!]--dst-range ip-ip
#iptables –A FORWORD –i eth0 –o eth1 –p tcp –j ACCEPT
凡是从eth0接口进入,从eth1接口流出的tcp数据流被允许通过
-
-p name, 可以是tcp, udp, icmp, or all -
-p all
-p all只表示tcp、udp、icmp这三种协议,而不包括RFC1340(/etc/protocol)中的所有协议。其他协议,要用数字 缺省是-p all,即:不写-p时, |
-
-p 数字 ,必须符合RFC1340(/etc/protocol)
-A INPUT -p 50 -j ACCEPT -A INPUT -p 51 -j ACCEPT -p 0相当于-p all |
| 缺省(无--sport),表示匹配所有端口 |
--sport 135 | 单端口 |
--sport TELNET | 单个服务名,服务名必须在/etc/services 文件中进行标注 |
--sport 135:139 | 连续端口 匹配源端口从135到139 |
| 匹配源端口从1024到65535 |
--sport !1032 | 表示除了该端口以为的其他所有端口 |
--sport,--dport不支持逗号枚举端口 |
-p tcp -m multiport --sport/--dport |
iptables -A FORWARD –i eth0 –p tcp –m multiport --dports 25,80,110,443,1863 –j ACCEPT |
-p tcp --tcp-flags [!] flag |
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN |
主要用于匹配和连接有关的数据包
icmp-type类型的指定可以取数字或名字:
-
数字 数字在RFC792中有定义
icmp echo-reply icmp echo-request |
-
name name 可以用iptables --p icmp --help 查看
[root@demo1 ~]# /sbin/iptables -p icmp -h iptables v1.2.11 ICMP v1.2.11 options: Valid ICMP Types: any echo-reply (pong) destination-unreachable source-quench redirect echo-request (ping) router-advertisement router-solicitation time-exceeded (ttl-exceeded) parameter-problem timestamp-request timestamp-reply address-mask-request address-mask-reply |
-
接口echo-reply,
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT |
- 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包限制 |