网络知识之认识IPtables,然后给数据包化化妆!

各位,还记得之前提到的隧道咩?在集群环境中,后端服务器均为内网互联,但是始终要把数据交到访客啊。数据在穿过隧道的时候,会出现只有内网IP而失去了链接外网的情况。这时候必需有一台来负责把这些数据包引导到外网,关于如何引导我就不用多说,但是在路由表那一节我已经提到直接引导数据包走向外网不可取,那么这时候就需要用IPtables来给数据包的报头化化妆。也许有的人开始吐槽了:“小新呐,你也太坑爹了,修改数据包怎么能叫化妆呢?”你还别说,真的是化妆,命令里要执行的动作名为MASQUERADE,也就是伪装,不过把它叫化妆也是对的嘛。◕‿◕。

在说起命令之前呢,我想还是有必要聊聊关于IPtables的一点基础知识。之前在自学的时候资料用了整整5页来介绍原理呢!不过对我比较熟悉的朋友都知道,俺这人最喜欢就是精简精简精简,那么我就试着用几段话简单说说吧。以下内容只是本人的观点,如有误导请指正。

很多资料都把IPtables称为防火墙,虽然说IPtables主要用来当防火墙,但是防火墙只是它其中一点小伎俩。在很久很久以前,Linux2.0内核时代它首次出现,名字是ipfw,顾名思义就是IP Firewall,就是一个防火墙。接下来取而代之的是ipchains,基于Linux2.2内核,这时候它就开始慢慢进化了。到IPtables的时候Linux已经是2.4内核,那么这个新名字又有什么含义呢?IP Tables?IP表?没错,IPtables一共有3个表。这3个表格的用途是不一样的分别是最常用的Filter、Nat、Mangle。

Filter表顾名思义一般用于数据包过滤,这个表有3种链(Chain),我不知道当初谁把它直译为链,应该翻译为数据包走向,这样大家就好理解了。分别是INPUT、OUTPUT、FORWARD,对应传入、传出、从外部转发到内部三种数据包走向(Chain)。

Nat表主要用于网络地址转换,也就是Network Address Translation的缩写。大家用脚趾头都能想出来了我们等会用的就是这货来给数据包化妆的。它也有3个链,分别是PREROUTING、POSTROUTING、OUTPUT。PREROUTING是数据包刚到达IPtables改变它目标地址实现重定向,有点像路由表嗯。POSTROUTING是在包要离开IPtables之前改变源地址,嘿嘿。OUTPUT是改变本地产生包的目的地址。

还有Mangle表在这里就不多说了,这里不会用到,大家也应该不会用到,是一些用于标记高级路由信息报的规则,可以改变不同包和报头内容,比如TTL、TOS、MARK之类的,这货我估计只有Geek们用于某些不可告人目的才需要的吧,嘻嘻。不能说太多~

好了基本上能进入实战内容了,俺到实战部分最讨厌啰啰嗦嗦的,速战速决嘛!

IPtables的参数各种强大,默认如果不带-t就是操作Filter表,如果带-t nat就是操作Nat表,这里要记住如果执行-F要清空Nat的话,一定要写全像这样iptables -t nat -F否则就只清空Filter表!很多资料没有提到这点,让偶实际调试的时候吃了不少苦头,呜呜~~~~(>_<)~~~~好了继续~

在新增的时候,可以使用-A Chain格式添加到表最末尾,如果想在最前就使用-I chain。为啥会有顺序呢?因为是按顺序从上到下执行,遇到符合的规则就执行了。因此顺序很重要!知道了顺序还得知道怎么看啊,如果要看就用-L,看不到IP?加上-n就好了。

在这里先说点实用的过滤表,想学化妆的童鞋等等哈。-i和-o是指定入、出的网卡,比如-i eth0和-o eth0这样用。-s用来指定来源的IP,比如-s 192.168.1.2,当然来指定IP段也是可以的就像这样192.168.1.0/24,当然如果你蛋疼一些可以写成192.168.1.0/255.255.255.0。而如果你被人搞的蛋碎了想禁止某些IP的话只需要中间加个感叹号就像这样-s ! 192.168.1.0/24即可。然后还有个-P指定协议,比如-P tcp或者-P icmp酱紫,如果你是懒虫想挡了全部就-P all搞定。最后也是最重要的参数是-j跟上动作名,比如ACCEPT是接受交往请求。(大雾...)DROP就狠心了,拒绝就算了还不给人家回个消息!REJECT比较有礼貌,发好人卡后还给对方回个消息。

学完了如何处理告白(喂喂喂小新你够了!)接下来是重头戏哈,NAT表。大家不用担心,这个只是个媒人,不需要处理惊心动魄的场景,只需要转发一下写着情书的数据包之类的就足够了。不过数据的传递是双向的,PREROUTING通常就跟着POSTROUTING。以下假设情景是外网x.x.x.x端口90与IPtables服务器外网8.8.8.8内网192.168.0.1通讯,然后由这厮和内网192.168.0.5:90通讯。

大家看起来会感觉比较乱,先给几个示例吧~

iptables -A PREROUTING -p tcp --dport 90 -d 192.168.0.1 -j DNAT --to-dest 192.168.0.5:90
iptables -A POSTROUTING -d 192.168.0.1 -p tcp --sport 90 -j MASQUERADE

先说说PREROUTING这个,-p tcp指定协议,然后--dport 90表示来自90端口,这厮是负责收到数据后转告的,因此这时候包是给到IPtables服务器的-d 192.168.0.1然后配合-j DNAT来把外网请求转发给内网,最后呢还需要指定把数据交给--to-dest 192.168.0.5:90就完成任务~因为对方比较害羞,而你在内网的身份又是媒人,只好化个装代替对方告白啦~(小新你太坑爹了吧这可是更惊心动魄的场景啊-,-"...)

那么我们这里假设会回信吧,否则真的要回信了找不到合适的Chain数据包可就送不出去啦!从内部出去的Chain是-A POSTROUTING,因为是内部的嘛IP肯定是内网,就像在家里面叫某人小名,在外头没人知道他小名嘛,所以-d 192.168.0.1记住这个IP是这个IPtables服务器的IP!因为这时候内网是把数据包交给你啊!所以接受方肯定是你啊!协议-p tcp和端口--dport 90就不多说了,最终-j MASQUERADE化个装才能把内网的数据包报头变成外网。

外面好像没有人整理出IPtables各个参数的内容,我就集合在这吧:

  • -A 新增规则在Chain最后面
  • -I 新增一条规则在Chain最前面,据说这货还能插在中间,不过没找到资料
  • -i 指定进数据包的网卡,比如eth0什么的,一般和INPUT Chain配合用
  • -o 指定出数据包的网卡
  • -p 指定协议,比如tcp/udp/icmp,如果你是懒虫可以用all
  • -s 指定来源的IP/IP段,上文已有示例不再解释格式
  • -d 指定目标IP/IP段,格式同上
  • -j 指定动作,比如filter表可以用ACCEPT(接受)/DROP(扔了)/REJECT(扔了然后告诉对方此路不通),再比如nat表可以用SNAT(改变源)/DNAT(改变目标)等等...
  • -t 指定用的表,没指定就默认filter
  • --sport 限制来源端口,可以连续的比如233:520表示从233号到520号端口,如果需要不连续的比如80,21,233,1096则需要配合-m multiport
  • --dport 限制目标端口,格式同上
  • -L 列出当前表的已有记录
  • -n 配合-L用,用IP显示记录

IPtables非常强大,建议啃得下E文而又需要完成一些特殊功能而本文没介绍到的可以移步官方文档看看:http://www.netfilter.org/documentation/index.html#documentation-faq
到这里,关于服务器集群所使用的后端通讯所需的基础也就介绍完了。其实Linux真的很强大,并不需要什么第三方的软件就能很轻松的完成服务器的集群架构方面的网络配置。

联动文章《1.隧道是架设旁路结构的好东西》《2.路由表的那点事

网络知识之认识IPtables,然后给数据包化化妆! 没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据