iptables是6版本以下使用的防火墙工具,我觉得能够掌握器基本的包过滤和nat的内容就足够了。
iptables的基本包过滤和路由器上面ACL的配置类似。
1、源目的IP地址
2、源目的端口号
3、协议(但是这里仅支持icmp,tcp,udp三种协议的限制)
4、源目的接口
5、由路由转发的包,外部发往自身的包,自身发往外部的包
还有一些其他的过滤点,比如TCP的标志位,连接状态,mac地址还有连接的频率。
iptables主要的工作原理是根据三个表项filter,nat,mangle,filter表中记录着该如何对数据包进行过滤,nat表中记录着该如何对数据包进行nat操作,mangle记录着如何对数据包头或者数据包进行一些内容的修改。比较常用的是filter和nat表。
我们可以这么理解filter和nat表就是全部规则的集合。但是这么整合操作起来难免太过麻烦,于是就在各个表中对规则的定义范围进行了分类。也就是说针对某些数据流,我要将其定义到表中哪个模块。这些模块可以将其理解为我们在filter表,nat表或者mangle表上又划分出多个空间,每个空间,每个模块都有自己的功能,我们在这些模块上面进行内容的输入就是在定义规则,当我们输入多条规则之后,规则的匹配和路由器上的ACL相同,有对应的规则则匹对,没有就使用默认规则。范围定义的依据是数据的流向:
INPUT:代表流进本机的流量
OUTPUT:代表从本机流出的流量
FORWARD:代表经由本机进行路由的流量
PREROUTING:代表准备进行路由
POSTROUTING:代表已经确定路由
OUTPUT:代表准备要发送出去
iptables具有普通路由器中的低级ACL和高级ACL的功能,它可以仅仅根据源IP进行过滤,同时源IP可以是单个IP地址,也可以是IP网段和域名,下面是一个禁止某个源IP通过的例子:
iptables -A FORWARD -s 192.168.0.1 -d 192.168.0.2 -j DROP
从这个例子我们可以学到三个选项:
-A :因为这个例子我们没有指定我们要将这个命令的内容输入到哪个表中去,所以默认是修改filter表,而-A选项代表在FORWARD模块的尾部加上这条内容
-s:指代源IP的范围,-s后面还可以跟上网段,比如192.168.0.0/24,或者域名比如www.baidu.com
-d: 指代目标IP的范围,其可输入的内容和-s一致
-j :-j选项后面跟上动作,一般常用的动作就是DROP丢弃,REJECT拒绝和ACCEPT接受
如果要使用iptables去指定放行或者阻塞IP地址和端口的话,那么可以这么输入:
iptables -A FORWARD -s 192.168.0.1 -p tcp -sport 80 -d 192.168.0.2 -dport 21 -j REJECT
从这个例子我们可以学到的选项:
-p :这个是指定协议,可以指定tcp,udp,icmp以及/etc/protocals文件中的协议,但是好像都是运输层及其以下的协议
-sport:当我们使用了-p选项指定了对应的协议之后,我们可以指定源端口的范围,后面跟上0代表全部端口
-dport:当我们使用了-p选项指定了对应的协议之后,我们可以指定目的端口的范围,后面跟上-0代表全部端口
-j REJECT:代表遇到此种类型的数据流做出的回应是发送代表拒绝的数据包
上面两个例子阐述了iptables中与路由器上的源ACL和高级ACL相似的使用用法,但是iptables用法更加灵活因为一些选项可以不去输入,而在路由器上都是按照固定格式。
-P :选择某个模块的默认放行规则,比如我们可以设置filter表中的默认放行规则是丢弃,那就应该这么输入 iptables -t filter -P DROP,其中-t指定了我们要修改哪个表中的内容。
-t :如果我们不适用-t指明修改哪个表的内容,那么默认修改的是filter表,-t后面可以跟上filter,nat,mangle三个表其中一个。
-N :代表自定义一个模块
-X:代表删除自定义模块,要保证自定义模块里面没有东西才能删除
-F :清除,这个直接iptables -F,这就代表清除所有的规则,也可以跟上-t代表仅仅清除某个表的规则,还可以先使用-t指定表名,然后再-F后面指定对应的模块名,比如iptable -F INPUT -t filter
-D 模块名 number:这个表示删除模块上的某个序号的规则
例子:iptables -N newchain
这样就加入了一个新的模块,我们在使用-A选项加入新规则的时候可以选择加入到这个模块,比如
iptables -A newchain。但是规则加入之后还不能立即使用,还有在主模块上引用才行,如:
iptable -A FORWARD -s 192.168.0.1 -j newchain
这条命令的意思就是只要是源IP为192.168.0.1的数据包,就让它匹配newchain模块中的规则
filter中的过滤和可以结合多种方式,比如TCP的syn标志,TCP的flag位,接受某个包的频率,mac地址,状态。
看有关状态的过滤可以看这个博客:(103条消息) 关于iptables -m选项以及规则的理解_weixin_34268843的博客-CSDN博客
其他的过滤使用可以看这个:
(103条消息) Linux 如何将linux主机变为路由器&&iptables的基本用法_垃圾袋挺能藏啊的博客-CSDN博客
同样的iptables也提供了源SNAT,目的DNAT以及端口NAT
下面给出几个例子:
iptables -A POSTROUTING -t nat -s 192.168.0.1 -o ens33 -j SNAT --to 192.168.2.22
选项解释:
在上面的内容我们给出了nat表中的三个模块,POSTROUTING,PREROUTING以及OUTPUT。
从这三个模块我们就能看出其含义,分别是“确定路由,准备路由,确定发出”。所以我们要注意各个模块的使用场景。
在SNAT中只能将规则写入POSTROUTING中,其实我们可以这么理解在确定了路由,也就是确定了包的发送方向之后,我们就可以进行源地址的转换了。
-o 接口名 :指定output的端口去进行规则的响应
-SNAT --to 【ip地址|ip范围】:这个代表着进行SNAT时地址的转换依据
-t :因为默认是修改filter表中的内容,所以我们必须指明这条规则是写入nat表中的
DNAT的规则制定和SNAT相似,不过-j后面的动作修改位-DNAT ,同时指定的端口的符号变为-i,
比如iptables -A POSTROUTING -t nat -s 192.168.0.1 -i ens33 -j DNAT --to 192.168.2.22
这个命令的含义就是将从ens33接口过来且源头IP位192.168.0.1的数据包的目的IP修改位192.168.2.22
iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
其实就是-j后面指定的动作从SNAT换了成了MASQUERADE。
如果我们没有指定-o,也就是没有指定这条命令使能的接口,会出现一定的问题,所以我们在进行NAT的相关操作的时候一定要指定使能的接口。我们可以这么理解做NAT但是却没有指定进行NAT的接口,这不是无稽之谈吗。
service iptables save:该命令将内存中做过的操作保存在/etc/sysconf/iptables中
当然我们也可以直接编辑/etc/sysconf/iptables文件
这是我在做实验的时候遇到的坑。
我用使用三台linux,一台做路由器,其他两台做主机
现在情况是这样的有主机A 主机B 主机C,主机B就是做路由器的主机
作为主机B上面配置了SNAT。
现在情况是这样的,因为我之间在使用这三台主机上做了一些包过滤的实验。
当我在进行包过滤的时候,相关配置都是即时生效,也就是说我在主机B上进行配置后,主机A上的ping命令就会出现没有回复的情况。
但是当我进行NAT配置的时候,也就是在zhujiB上输入完命令之后并没有即时生效,然后我就不断地配置NAT的多个操作,然后都没有效果。我一度以为出了什么问题,然后我发现昨晚NAT的操作之后必须重启服务,不然NAT不会生效的。不仅如此,如果你的终端在配置NAT并重启iptables服务之前有不断发送ping包的进程,那么这个进程产生的流也是不会被进行NAT的转换的。
1、配置完NAT操作之后要重启iptables服务
2、同时使用NAT功能的客户机应该重新建立数据流,断开旧的数据流