iptables

本人网络小白,前一阵子读师兄的代码,对看见里面有iptables这个东西,所以就从网上查找资料,最近看到了朱双印写的iptables日志博客,对于小白非常的友好,这里相当于我自己记录的一些笔记。	朱大师父主要写了14篇日志关于这个,我也按照这个的顺序记录一下吧!

iptables日志

中介绍了规则、链、表。
规则:讲的就是链中的具体的动作,
比如说指定了哪些动作,像:
ACCEPT(允许数据包通过)、
DROP(直接把接收的数据包丢掉,不反馈信息直到发送方超时)、
REJECT(拒绝数据包的通过,不过告诉发送方)、
SNAT(源地址转换,解决内网用户用同一个公网地址上网的问题)、
MASQUERADE(是SNAT的一种特殊形式,适用于动态的、临时会变的ip上)、
DNAT(目标地址转换)、
REDIRECT(在本机做端口映射)、
LOG(只在/var/log/messages文件中记录日志信息,啥也不干,直接处理链上)
还有就是你的匹配条件,也就是源或者目的端口(方便处理从哪里来或者到哪里去的消息)。
正如这个字的本意,链表知道吧,糖葫芦—一根棍子上挂了一堆。那么这个棍子呢就是“”,糖葫芦上面的食物就是“规则”,有的糖葫芦是什锦的吧,那么上面不一样的食物种类就是“”。iptables上面也归定了,哪些链里面可以包含哪几个表的属性,可能说到这有点糊涂,往下继续看吧。
先上点儿概念,五种链(参照图理解):
PREROUTING:对数据包作路由选择前应用此链中的规则
INPUT:进来的数据包应用此规则链中的策略
FORWARD:转发数据包时应用此规则链中的策略
OUTPUT:外出的数据包应用此规则链中的策略
POSTROUTING:数据包作路由选择后应用此链中的规则
回归到“”这个东西,朱大师父形容的很好,他呢就是网络中消息接受、发送、转发处理的经过的一些关卡,上图吧直接:在这里插入图片描述
从图中可以看到如果想要:
接收消息,那就是需要经过:PREROUTING、INPUT两条链。
发送消息,那就是需要经过:POSTROUTING、OUTPUT两条链。
转发消息,那就是需要经过:PREROUTING、FORWARD、POSTROUTING三条链。

图片中还有一个细节你会发现不是每个链上都包含所有的表,那么这个东西决定的是什么呢?
表就是告诉你,我要实现什么功能
那么4个表都是代表的什么功能呢?上概念吧:
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw。

刚刚不是说了”不是每个链上都包含所有的表“,那么这几个表都各有什么链呢:
raw表:PREROUTINGOUTPUT
mangle表:PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
nat表 :PREROUTINGOUTPUTPOSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表:INPUTFORWARDOUTPUT

举个例子:如果你想接受消息数据,那么就会涉及到PREROUTING、INPUT两条链:
确定一下功能:1.你想接受数据。2.你只用到上述的两条链。3.你只能在这两条链中设定规则。
你会发现filter表满足要求,应该在PREROUTING、INPUT两条链中设定规则,规则中就会写道我该对接受到的IP,进行哪种动作来处理。干干巴巴的来段代码吧
推荐linux操作系统,下载个ubuntu啥的都行

iptables -t filter -I INPUT -s 192.168.0.23 -j ACCEPT 

上面啥意思呢:就是我对于来自192.169.0.23,发来的消息,规则上接收。链是INPUT,表是filter表(默认)。

(Linux)Iptables相关的命令参数

在这里插入图片描述

1.iptables -t 表名 -L
查看对应表的所有规则,-t选项指定要操作的表,省略”-t 表名”时,默认表示操作filter表,-L表示列出规则,即查看规则。
2.iptables -t 表名 -L 链名
查看指定表的指定链中的规则。
3.iptables -t 表名 -v -L
查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出”计数器”的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL
4.iptables -t 表名 -n -L
表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址
5.iptables --line-numbers -t 表名 -L
表示查看表的所有规则,并且显示规则的序号,–line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为–line,注意,简写后仍然是两条横杠,仍然是长选项。
6.iptables -t 表名 -v -x -L
表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。
7.Iptables -t filter -I INPUT ‘n’ -s 202.199.13.163 -j DROP ‘n’默认在第一行,表示在第几行插入
使用**-I选项,指明将”规则”插入至哪个链中,-I表示insert,即插入的意思,所以-I INPUT表示将规则插入于INPUT链中,即添加规则之意。
Iptables -t filter -A INPUT -s 202.199.13.163 -j DROP
使用
-s选项,指明”匹配条件”中的”源地址”,即如果报文的源地址属于-s对应的地址,那么报文则满足匹配条件,-s为source之意,表示源地址。
Iptables -t filter -A INPUT -s 202.199.13.163 -j DROP
使用-j选项,指明当”匹配条件”被满足时,所对应的动作,上例中指定的动作为DROP,在上例中,当报文的源地址为192.168.1.146时,报文则被DROP(丢弃)。
Iptables -t filter -A INPUT -s 202.199.13.163 -j DROP
使用
-A**选项,表示在对应的链中”追加规则”,-A为append之意,所以,-A INPUT则表示在INPUT链中追加规则,而之前示例中使用的-I选项则表示在链中”插入规则”,聪明如你一定明白了,它们的本意都是添加一条规则,只是-A表示在链的尾部追加规则,-I表示在链的首部插入规则而已。

Iptables -t filter -D INPUT 3/iptables -t filter -D INPUT -s 202.199.13.163 -j ACCEPT
使用了-t选项指定了要操作的表(没错,省略-t默认表示操作filter表),使用**-D**选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则

Iptables -t filter -F
-F选项为flush之意,即冲刷指定的链,即删除指定链中的所有规则。

Iptables -t filter -R INPUT 1 -s 202.199.13.163 -j REJCET
-R选项表示修改指定的链,使用-R INPUT 1表示修改INPUT链的第1条规则,使用-j REJECT表示将INPUT链中的第一条规则的动作修改为REJECT,注意:上例中, -s选项以及对应的源地址不可省略,即使我们已经指定了规则对应的编号,但是在使用-R选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定)

Iptables -t filter -P FORWRD DROP
使用-t指定要操作的表,使用**-P**选项指定要修改的链,上例中,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP。

我们也可以在指定源地址时,一次指定多个,用”逗号”隔开即可,示例如下:
-s 192.168.34.176,192.168.34.123(注意,上例中的”逗号”两侧均不能包含空格,多个IP之间必须与逗号相连)

除了能指定具体的IP地址,还能指定某个网段,示例如下:
-s 10.6.0.0/16

其实,我们还可以对匹配条件取反,先看示例,如下:
! -s 192.168.1.146″表示对 -s 192.168.1.146这个匹配条件取反.

-d 表示目标地址,当一条规则中存在多个匹配条件时,报文必须同时满足这些条件,才算做被规则匹配

-p选项,指定需要匹配的报文的协议类型(tcp, udp, udplite, icmp, esp, ah, sctp等),当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到。

当本机有多个网卡时(ifconfig查),我们可以使用 -i 选项去匹配报文是通过哪块网卡流入本机的。-i选项只能用于上图中的PREROUTING链、INPUT链、FORWARD链,这是**-i**选项的特殊性,因为它只是用于判断报文是从哪个网卡流入的,所以只能在上图中”数据流入流向”的链中与FORWARD链中存在,

-o选项,匹配报文将由哪块网卡流出,没错,-o选项与-i选项是相对的,-i选项用于匹配报文从哪个网卡流入,-o选项用于匹配报文将从哪个网卡流出。
-i选项只能用于PREROUTING链、INPUT链、FORWARD链,那么-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链
–dport可以匹配报文的目标端口,–dport意为destination-port,即表示目标端口,必须事先指定了使用哪种协议,即必须先使用-p选项。我们使用-m选项,指定了对应的扩展模块为tcp,也就是说,如果想要使用–dport这个扩展匹配条件,则必须依靠某个扩展模块完成
–sport 可以判断报文是否从指定的端口发出,即匹配报文的源端口是否与指定的端口一致,–sport表示source-port,即表示源端口之意
第一条规则表示匹配0号到22号之间的所有端口,下图中的第二条规则表示匹配80号端口以及其以后的所有端口(直到65535):20端口到25端口
:20、80:、20:25.
我们可以使用multiport模块的–dports扩展条件同时指定多个离散的目标端口。
-m multiport --dport 23,43,65 or -m multiport --dport 23,43:65
9.iprange扩展模块可以指定”一段连续的IP地址范围”,用于匹配报文的源地址或者目标地址。iprange扩展模块中有两个扩展匹配条件可以使用
–src-range | --dst-range
iptables -t filter -m iprange --src-range192.168.98.45-192.168.98.145 -j DROP

10.string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件,如果报文中包含字符”OOXX”,我们就丢弃当前报文.
–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但是我们必须指定一个。
–string:用于指定需要匹配的字符串。
例如:iptables -t filter -I INPUT -m string --algo bm --string “OOXX” -j REJECT
’-m string’表示使用string模块,’–algo bm’表示使用bm算法去匹配指定的字符串,’ –string “OOXX” ‘则表示我们想要匹配的字符串为”OOXX”
设置完上图中的规则后,由于index.html中包含”OOXX”字符串,报文无法通过126的INPUT链,所以无法获取到页面对应的内容。

11**.time扩展模块**,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件.”
比如:我想要自我约束,每天早上9点到下午6点不能看网页。
Iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
也可以–weekdays 6,7周六周天,–monthdays

12.connlimit扩展模块,可以限制每个IP地址同时链接到server端的链接数量,即对单IP的并发连接数限制.
Iptables -I INPUT -p tcp --dport 22 -m connlimit --conmlimit-above 2 -j REJECT

–connlimit-mask 24″表示某个C类网段,没错,mask为掩码之意,所以将24转换成点分十进制就表示255.255.255.0.

13**.limit模块**是对”报文到达速率”进行限制的,果我想要限制单位时间内流入的包的数量,就能用limit模块.
比如:iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
”–limit”选项就是用于指定”多长时间生成一个新令牌的”,”–limit-burst”选项就是用于指定”木桶中最多存放几个令牌的”.

14.–sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围。
例如:
Iptables -t filter -I OUTPUT -d 192.168.1.146 -p tco -m tcp --sport 22 -j REJECT

15.–dport 用于匹配TCP协议报文的目标端口,可以使用冒号指定一个练习一的端口范围。
例如:
Iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22 -j REJECT

16.–tcp-flags 用于匹配报文的tcp头的标志位,例如:
Iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT

17.–syn 用于匹配tcp新建连接的请求报文,相当于使用“–tcp-flags SYN,RST,ACK,FIN”, 例如:
Iptables -t filter -I INPUT -o tcp -m tcp --dport 22 --syn -j REJECT
同时为了方便,还可以这么写!
Iptables -t filter -I INPUT -o ALL SYN -j REJECT

udp扩展与icmp扩展

18.udp扩展模块,只有两个,就是–sport和–dport,即匹配报文的源端口和目的端口。例如:
Iptables -t filter -I INPUT -p udp -m udp --dport/–sport 22 -j ACCEPT

19.我们想要禁止所有的icmp报文进入本机,那么我们可以进行如下设置:
Iptables -t filter -I INPUT -p icmp -j REJECT(匹配了所有的icmp报文)

20.如果我们想要ping通别人,但是不想让别人ping通我们:
Iptables -t -filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
也可以用具体的描述名称去匹配。例如:
Iptables -t -filter -I INPUT -p icmp -m icmp --icmp-type “echo-request” -j REJECT

state模块

21.对于state模块的连接而言,“连接”其中的报文状态可以分为NEW、ESRABLISHED、RELATED、INVALID、UNTRACKED。
在这里插入图片描述

NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。
ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
RELATED:从字面上理解RELATED译为关系.

INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。
UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。
只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙,示例如下:
Iptables -t filter -I INPUT -m state --state RELATE,ESTABLISHED -j ACCEPT

#####iptables 自定义链####

自定义链

需要注意的是,自定义链并不能直接使用,而是需要被默认链引用才能够使用
可以理解为要想使用需要嵌套在原有的5个链下面,不可以直接用

-N选项可以创建自定义链:
Iptables -t filter -N IN_WEB(“-N IN_WEB”表示创建一个自定义链,自定义链的名称为”IN_WEB”)

创建自定义链
#示例:在filter表中创建IN_WEB自定义链
iptables -t filter -N IN_WEB

其中自定义链的规则,和正常链的规则很像,比如(以IN_WEB)为例:

Iptables -t filter -I IN_WEB -s 192.168.1.139 -j REJECT
Iptables -t filter -I IN_WEB -s 192.168.1.188 -j ACCEPT

引用自定义链(如何生效)
#示例:在INPUT链中引用刚才创建的自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

重命名自定义链
#示例:将IN_WEB自定义链重命名为WEB
iptables -E IN_WEB WEB

删除自定义链
删除自定义链需要满足两个条件
1、自定义链没有被引用
2、自定义链中没有任何规则
#示例:删除引用计数为0并且不包含任何规则的WEB链
iptables -X WEB

iptables 网络防火墙

在这里插入图片描述

由于B主机现在的角色是10.1.0.0中的”网络防火墙”,那么,我们直接将C主机的网关指向B主机的内部网络IP,如下图所示
在这里插入图片描述

同时,为了尽量简化路由设置,我们直接将A主机访问10.1网络时的网关指向B主机的网卡2上的IP,如下图所示。
注:route命令配置的路由条目在网络重启后将会失效
在这里插入图片描述

现在A主机通往10.1网络的网关已经指向了B主机,那么,现在A主机能够达到10.1.0.0/16网络吗?我们来试试
如下图所示,我们直接在A主机上向C主机发起ping请求,并没有得到任何回应。
在这里插入图片描述

那么,我们再来试试B主机上的内部网IP,如下图所示,直接在A主机上向B主机的内部网IP发起ping请求,发现是可以ping通的,这是为什么呢?
在这里插入图片描述

按照道理来说,10.1.0.1与10.1.0.3都属于10.1.0.0/16网段,为什么B主机上的IP就能通,C主机上的IP却不通呢?

咱们先来聊聊为什么10.1.0.1没有回应。
A主机通过路由表得知,发往10.1.0.0/16网段的报文的网关为B主机,当报文达到B主机时,B主机发现A的目标为10.1.0.1,而自己的IP是10.1.0.3,这时,B主机则需要将这个报文转发给10.1.0.1(也就是C主机),但是,Linux主机在默认情况下,并不会转发报文,如果想要让Linux主机能够转发报文,需要额外的设置,这就是为什么10.1.0.1没有回应的原因,因为B主机压根就没有将A主机的ping请求转发给C主机,C主机压根就没有收到A的ping请求,所以A自然得不到回应。
!!!!重点!!!!
我们应该怎样设置,才能让Linux主机转发报文呢?我们一起来设置一遍就好了。
首先,我们可以查看/proc/sys/net/ipv4/ip_forward文件中的内容,如果文件内容为0,则表示当前主机不支持转发。
所以说,就要首先开启转发功能,有两种方法:
1.
在这里插入图片描述

在这里插入图片描述

只应用于临时生效,如果想永久更改就要在系统配置文件中修改

NAT动作:

在这里插入图片描述

刚才描述的过程中,”IP地址的转换”一共发生了两次。
内部网络的报文发送出去时,报文的源IP会被修改,也就是源地址转换:Source Network Address Translation,缩写为SNAT。
外部网络的报文响应时,响应报文的目标IP会再次被修改,也就是目标地址转换:Destinationnetwork address translation,缩写为DNAT。

我们只要在路由器上配置公网IP,在私网主机访问公网服务时,报文经过路由器,路由器将报文中的私网IP与端口号进行修改和映射,将其映射为公网IP与端口号,这时,内网主机即可共享公网IP访问互联网上的服务了。
NAT种类有好几种,这个自己可以查一查,反正就是一顿映射呗。

在这里插入图片描述

模拟上述流程:(

SNAT

)

在这里插入图片描述

如上图所示,上图中的规则表示将来自于10.1.0.0/16网段的报文的源地址改为公司的公网IP地址。
Iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
-t nat”表示操作nat表,我们之前一直在灌输一个概念,就是不同的表有不同的功能,filter表的功能是过滤,nat表的功能就是地址转换,所以我们需要在nat表中定义nat规则。
-A POSTROUTING”表示将SNAT规则添加到POSTROUTING链的末尾,在centos7中,SNAT规则只能存在于POSTROUTING链与INPUT链中,在centos6中,SNAT规则只能存在于POSTROUTING链中。
你可能会问,为什么SNAT规则必须定义在POSTROUTING链中,我们可以这样认为,POSTROUTING链是iptables中报文发出的最后一个”关卡”,我们应该在报文马上发出之前,修改报文的源地址,否则就再也没有机会修改报文的源地址了,在centos7中,SNAT规则也可以定义在INPUT链中,我们可以这样理解,发往本机的报文经过INPUT链以后报文就到达了本机,如果再不修改报文的源地址,就没有机会修改了。
-s 10.1.0.0/16″表示报文来自于10.1.0.0/16网段,前文中一直在使用这个匹配条件,我想此处应该不用赘述了。
-j SNAT”表示使用SNAT动作,对匹配到的报文进行处理,对匹配到的报文进行源地址转换。
–to-source 192.168.1.146″表示将匹配到的报文的源IP修改为192.168.1.146,前文中,我们已经总结过,某些动作会有自己的选项,”–to-source”就是SNAT动作的常用选项,用于指定SNAT需要将报文的源IP修改为哪个IP地址。

下面的流程(

DNAT

):
在这里插入图片描述

Iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389
如上图所示,我们先将nat表中的规则清空了,从头来过,清空nat表规则后,定义了一条DNAT规则。
-t nat -I PREROUTING”表示在nat表中的PREROUTING链中配置DNAT规则,DNAT规则只配置在PREROUTING链与OUTPUT链中。
-d 192.168.1.146 -p tcp –dport 3389″表示报文的目标地址为公司的公网IP地址,目标端口为tcp的3389号端口,而我们知道,windows远程桌面使用的默认端口号就是3389,当外部主机访问公司公网IP的3389号端口时,报文则符合匹配条件。
-j DNAT –to-destination 10.1.0.6:3389″表示将符合条件的报文进行DNAT,也就是目标地址转换,将符合条件的报文的目标地址与目标端口修改为10.1.0.6:3389,”–to-destination”就是动作DNAT的常用选项。
那么综上所述,上图中定义的规则的含义为,当外网主机访问公司公网IP的3389时,其报文的目标地址与端口将会被映射到10.1.0.6:3389上。

动作MASQUERADE

上文中,我们已经描述了SNAT,也就是源地址转换,那么我们现在来认识一个与SNAT类似的动作:MASQUERADE
当我们拨号网上时,每次分配的IP地址往往不同,不会长期分给我们一个固定的IP地址,如果这时,我们想要让内网主机共享公网IP上网,就会很麻烦,因为每次IP地址发生变化以后,我们都要重新配置SNAT规则,这样显示不是很人性化,我们通过MASQUERADE即可解决这个问题,MASQUERADE会动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址,示例如下:
在这里插入图片描述

如上图所示,我们指定,通过外网网卡出去的报文在经过POSTROUTING链时,会自动将报文的源地址修改为外网网卡上可用的IP地址,这时,即使外网网卡中的公网IP地址发生了改变,也能够正常的、动态的将内部主机的报文的源IP映射为对应的公网IP。
可以把MASQUERADE理解为动态的、自动化的SNAT,如果没有动态SNAT的需求,没有必要使用MASQUERADE,因为SNAT更加高效。

动作REDIRECT

使用REDIRECT动作可以在本机上进行端口映射
比如,将本机的80端口映射到本机的8080端口上
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
经过上述规则映射后,当别的机器访问本机的80端口时,报文会被重定向到本机的8080端口上。
REDIRECT规则只能定义在PREROUTING链或者OUTPUT链中。、

差不多就这些了,用法有很多,大家查一查iptables命令里面有很多linux下“man iptables”

我啥也不是,勿喷!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值