THB

新人刚开始写博客,本博客记录学习内容,如果有问题欢迎提出,会及时更改,由于很多资料是在网上查询的,会有些相同或类似的部分,由于当时没有记录是来源于哪里,所以没有指出,以后会注意这点的。在OpenStack和hadoop方面是纯粹的菜鸟,欢迎大家指点...

iptables

iptables的表

  • filter:实现数据报过滤

  • nat:网络地址转换 (NAT:Network Address Translator)

  • Mangle:  数据报处理

iptables的链

  • INPUT:位于 filter 表,匹配目的 IP 是本机的数据包

  • FORWARD:位于 filter 表,匹配穿过本机的数据包

  • PREROUTING:位于 nat 表,用于修改目的地址(DNAT)

  • POSTROUTING:位于 nat 表,用于修改源地址  (SNAT)

iptables如何操作链(命令)
对链的操作就那么几种

  • -I <链名> [规则号码]      (插入) 

  • -A <链名>    (追加) 

  • -R <链名> <规则号码> <具体规则内容>    (替换) 

  • -D <链名> [规则号码 | 具体规则内容]   (删除) 

  • -P <链名> <动作>    (设置某个链的默认规则)

  • -F [链名]    (清空规则)

  • -L    (列表显示)

这里要说明的就是-I 将会把规则放在第一行,-A将会放在最后一行。
iptables中的匹配参数
我们在这里就介绍几种常用的参数,详细地用法可以man iptables看它的联机文档,你会有意外的收获。
-s    匹配源地址

-d    匹配目的地址

-p    协议匹配

-i    入接口匹配

-o    出接口匹配

--sport,--dport     源和目的端口匹配

-j    跳转,也就是包的方向

其中还有一个!参数,使用!就是取反的意思

iptables的动作(处理方式)-j

  • ACCEPT    -j ACCEPT    通过,允许数据包通过本链而不拦截它,类似 Cisco 中 ACL 里面的 permit

  • DROP    -j DROP    丢弃,阻止数据包通过本链而丢弃它,类似 Cisco 中 ACL 里的 deny

  • SNAT    -j SNAT --to IP[-IP][:端口-端口]    (nat 表的 POSTROUTING 链)源地址转换,SNAT 支持转换为单 IP,也支持转换到 IP 地址池(一组连续的 IP 地址)

  • DNAT    -j DNAT --to IP[-IP][:端口-端口]    (nat 表的 PREROUTING 链)目的地址转换,DNAT 支持转换为单 IP,也支持转换到 IP 地址池(一组连续的 IP 地址)

  • MASQUERADE    -j MASQUERADE    动态源地址转换(动态 IP 的情况下使用)

iptables的附加模块 -m

  • 按包状态匹配   (state)    -m state --state 状态

  • 状态:NEW、RELATED、ESTABLISHED、INVALID NEW:有别于 tcp 的 syn
    ESTABLISHED:连接态 
    RELATED:衍生态,与 conntrack 关联(FTP) 
    INVALID:不能被识别属于哪个连接或没有任何状态  

  • 按来源 MAC 匹配(mac)    -m mac --mac-source MAC    匹配某个 MAC 地址(报文经过路由后,数据包中原有的 mac 信息会被替换,所以在路由后的 iptables 中使用 mac 模块是没有意义的)

  • 按包速率匹配   (limit)    -m limit --limit 匹配速率 [--burst 缓冲数量]    用一定速率去匹配数据包(limit 英语上看是限制的意思,但实际上只是按一定速率去匹配而已,要想限制的话后面要再跟一条 DROP)

  • 多端口匹配     (multiport)    -m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]    一次性匹配多个端口,可以区分源端口,目的端口或不指定端口(必须与 -p 参数一起使用)

iptiptables使用规则

  • 所有链名必须大写    INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING

  • 所有表名必须小写    filter/nat/mangle

  • 所有动作必须大写    ACCEPT/DROP/SNAT/DNAT/MASQUERADE

  • 所有匹配必须小写    -s/-d/-m <module_name>/-p

常用的命令iptables -L -n
这样的列表会跳过 linux的domain lookup,有的时候使用iptables -L会比较慢,因为linux会尝试解析ip的域名,真是罗嗦,如果你的 dns server比较不爽的话,iptables -L就会让你很不爽,加一个-n参数就好了。列表刷的就出来。当然了,如果你的linux就是做防火墙,建议把nameserver去掉,在 /etc/resolve.conf里面,因为有时候使用route命令也会比较慢列出来,很是不爽。
iptables -L -v
这个命令会显示链中规则的包和流量计数,嘿嘿,看看哪些小子用的流量那么多,用tc限了他。
cat /proc/net/ip_conntrack
查看目前的 conntrack,可能会比较多哦,最好加一个|grep "关键字",看看你感兴趣的链接跟踪
wc -l /proc/net/ip_conntrack
看看总链接有多少条。
iptables-save >/etc/iptables
把当前的所有链备份一下,之所以放到/etc下面叫iptables,因为这样重起机器的时候会自动加载所有的链,经常地备份一下吧,否则如果链多,万一掉电重启,你还是会比较痛苦。

input —对进入本机的数据进行过滤
output —-对从本机出去的数据进行处理
forward—– 对本网段的数据进行处理
prerouting —— dnat 和 ports redirect
postrouting ——-snat 和 masquerade

  • iptables 其实 只有两条chains 是对本机有用的 input 和 output

  • 而 forwad 其实是用来处理局域网中的数据包的(因为linux一般是用来充当网关或者是路由器的)

  • prerouting 和 postrouting 属于nat 表,这个 —其实是iptables的附加功能,主要是用来做翻译的。

DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映谢。

SNAT(Source Network Address Translation,源地址转换)通常被叫做源映谢。

在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。

数据包发出时,iptables所经过的步骤:


图中正菱形的区域是对数据包进行判定转发的地方。(nat表)

  • 在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址,数据将会被转交给INPUT链。如果不是本机地址,则交给FORWARD链检测。

  • 这也就是说,我们要做的DNAT要在进入这个菱形转发区域之前,也就是在PREROUTING链中做。

比如我们要把访问202.103.96.112的访问转发到192.168.0.112上:iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112这个转换过程当中,其实就是将已经达到这台Linux网关(防火墙)上的数据包上的destination ip address从202.103.96.112修改为192.168.0.112然后交给系统路由进行转发。

  • 而SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66这个语句就是告诉系统把即将要流出本机的数据的source ip address修改成为58.20.51.66。这样,数据包在达到目的机器以后,目的机器会将包返回到58.20.51.66也就是本机。如果不做这个操作,那么你的数据包在传递的过程中,reply的包肯定会丢失。

数据包接收时,iptables所经过的步骤:

  • 首先进入mangle表的prerouting链,进行某些预路由的修改(也可能不改);

  • 然后数据包进入nat表的 prerouting链,进行dnat之类(改变数据包的目的地址,比如我们所说的网关,比如从外网返回的数据包并不知道是内网的哪台机器需要这个数据包,都发给了网关的外网地址,而网关就要把这些数据包的目的地址改为正确的目的地址,而不是自己)的事情;

  • 然后进行判断这个数据包是发给这台计算机自身的还是仅仅需要转发的。

  • 如果是转发,就发送给mangle表的FORWARD链,进行一些参数修改(比如tos什么的参数)或者不修改;

  • 然后送给 filter表的forward链进行过滤(就是通常所说的转发过滤规则);

  • 然后送给mangle表的postrouting链进行进一步的参数修改(或者不修改);

  • 然后发给nat表的postrouting链修改(或者不修改)源地址(比如网关这个时候会把本来发自内网ip的数据包的源地址改为自己的外网IP,这样发送出去后,外面的主机就会以为这是网关发出的数据包了);

  • 然后发给网卡设备发送到网上。

MASQUERADE的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。

与SNAT相比:

  • SNAT可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip。

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5

  • MASQUERADE不用指定SNAT的目标ip,不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样实现了很好的动态SNAT地址转换。

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

iptables表的分析和iptables的执行过程

iptables操作的是2.4以上内核的netfilter.netfilter内部分为三个表,分别是 filter,nat,mangle,每个表又有不同的操作链(Chains)。

在filter(过滤)表中,也就是他的防火墙功能的这个表,定义了三个 Chain。分别是INPUT , FORWARD , OUTPUT。也就是对包的入、转发、出进行定义的三个过滤链。对于这个filter表的操作和控制也是我们实现防火墙功能的一个重要手段。

在nat(Network Address Translation、网络地址翻译)表中,也就是我们用以实现地址转换和端口转发功能的这个表,定义了PREROUTING, POSTROUTING,OUTPUT三个链,下面我们会对这三个链作详细的说明。

而 netfilter的mangle表则是一个自定义表,里面包括上面的filter以及nat表中的各种chains,它可以让我们进行一些自定义的操作,同时这个mangle表中的chains在netfilter对包的处理流程中处在一个比较优先的位置,下面有一张图清晰的描绘了netfilter 对包的处理流程,一般情况下,我们用不到这个mangle表,在这里我们就不做介绍了。


FORWARD:当linux收到了一个目的ip地址不是本地的包,Linux会把这个包丢弃,因为默认情况下,Linux的三层包转发功能是关闭的,如果要让我们的linux实现转发,则需要打开这个转发功能,可以改变它的一个系统参数,使用 sysctl net.ipv4.ip_forward=1或者echo "1" > /proc/sys/net/ipv4 /ip_forward命令打开转发功能。

在 FORWARD链里面,我们就可以定义详细的规则,也就是是否允许他通过,或者对这个包的方向流程进行一些改变,这也是我们实现访问控制的地方,这里同样也是Mangle_FORWARD然后filter_FORWARD,我们操作任何一个链都会影响到这个包的命运。

当有多条规则在一条链中时,iptables选择的情况:

在Chain中,所有的规则都是从上向下来执行的,也就是说,如果匹配了第一行,那么就按照第一行的规则执行,一行一行的往下找,直到找到符合这个类型的包的规则为止。如果找了一遍没有找到符合这个包的规则怎么办呢?itpables里面有一个概念,就是Policy,也就是策略。这个策略就是chain中的最后一条规则,也就是说如果找了一遍找不到符合处理这个包的规则,就按照policy来办。iptables 使用-P来设置Chain的策略。

iptables -P FORWARD DROP

FORWARD策略是DROP,那么也就是说,没有符合规则的包将被丢弃,不管内到外还是外到内。

如果想要让包正常通过,需要加入规则:

iptables -A FORWARD -d <ip地址号> -p <protocol协议> --dport <port端口号> -j ACCEPT

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

加入确认包和关联包的允许通过。


netfilter的状态机制

当一个lan用户通过这个linux访问外网的时候,它发送了一个请求包,这个包的状态是new,当外网回包的时候他的状态就是established,所以,linux知道,哦,这个包是我的内网的一台机器发出去的应答包,他就放行了。而外网试图对内发起一个新的连接的时候,他的状态是new,所以linux压根不去理会它。这就是我们为什么要加这一句的原因。还有那个 related,他是一个关联状态,什么会用到呢?tftp,ftp都会用到,因为他们的传输机制决定了,它不像http访问那样,Client_IP: port-->server:80  然后server:80-->Client_IP:port,ftp使用 tcp21建立连接,使用20端口发送数据,其中又有两种方式,一种主动 active mode,一种被动passive mode,主动模式下,client使用port命令告诉server我用哪一个端口接受数据,然后server主动发起对这个端口的请求。被动模式下, server使用 port命令告诉客户端,它用那个端口监听,然后客户端发起对他的数据传输,所以这对于一个防火墙来说就是比较麻烦的事情,因为有可能会有new状态的数据包,但是它又是合理的请求,这个时候就用到这个related状态了,他就是一种关联,在linux中,有个叫 ftp_conntrack的模块,它能识别port命令,然后对相应的端口进行放行。

在变换的过程中,会把变换的过程记录在linux的ip_conntrack中,linux在收到返回包之后,会根据他的ip_conntrack 中的条目进行两次变换,返回真正的internet用户,于是完成这一次的访问。

NAT转换需要加载的模块

/sbin/modprobe ip_tables   

/sbin/modprobe iptable_filter

/sbin/modprobe iptable_nat

/sbin/modprobe ip_conntrack            #IP连线追踪模块

/sbin/modprobe ip_conntrack_ftp     #FTP连线追踪模块

/sbin/modprobe ip_nat_ftp                #允许private side的主机使用ftp服务

NAT网关配置的步骤

1.开启转发  

    sysctl net.ipv4.ip_forward=1或者echo "1" > /proc/sys/net/ipv4 /ip_forward

2.加载必要模块

    /sbin/modprobe ip_tables   

    /sbin/modprobe iptable_filter

    /sbin/modprobe iptable_nat

    /sbin/modprobe ip_conntrack            #IP连线追踪模块

    /sbin/modprobe ip_conntrack_ftp     #FTP连线追踪模块

    /sbin/modprobe ip_nat_ftp                #允许private side的主机使用ftp服务

3.源地址伪装    #############Define nat ############

    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE  #伪装

4.FORWARD的默认策略    #############FORWARD DEFAULT POLICY############

    iptables -P FORWARD DROP

5.定义允许转发的数据包    ###############Define packets################

    iptables -A FORWARD -p tcp  -i eth0 -j ACCEPT

    iptables -A FORWARD -p udp  -i eth0 -j ACCEPT

    iptables -A FORWARD -p tcp  -i eth1 -j ACCEPT

    iptables -A FORWARD -p udp  -i eth1 -j ACCEPT

6.定义fregment规则    ################Define fregment rule###########

    iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

7.定义ICMP规则    ###############Define icmp rule##############

    iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT


评论
热度(1)