iptables概述
iptables 并不是真正的防火墙,可以理解为一个客户端代理。用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”(netfilter).所以说,iptables其实是一个命令行工具,位于用户空间,我们用iptables操作整整的框架。
iptables是按照规则办事的,即rules,规则一般制订了源地址、目的地址、传输协议(tcp、udp)等。当数据包与规则匹配时,iptables就会根据定义的规则来处理数据包,如accept(接受)、reject(拒绝)、drop(丢弃)三种动作。
iptables具有filter、nat、mangle、raw四种内建表,各个表中又有内建链,有各自不同的功能。
iptables常用内建表与链
1、filter表:filter表示iptables的默认表,如果没有自定义表,则默认为filter表,具有三种内建链
INPUT:处理来自外部的数据;
OUTPUT:处理往外发送的数据;
FORWARD链:将数据转发至本机的其他网卡上。
2、nat表:nat表中有三种内建链:
PREROUTING:处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址、
POSTROUTING:处理即将离开本机的数据包。它会转换数据包中的源IP地址
OUTPUT:处理本机产生的数据包
3、mangle表:Mangle表用于指定如何处理数据包。具有五种内建链
PREROUTING、OUTPUT、POSTROUTING、FORWARD、INPUT
4、raw表:用于处理异常,具有两种内建链:PREROUTING、OUTPUT
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。
制定iptables表规则的语法
iptables的策略
制作防火墙规则通常有两种基本策略。一是黑名单策略;二是白名单策略。
黑名单策略指没有被拒绝的流量都可以通过,这种策略下管理员必须针对每一种新出现的攻击,制定新的规则,因此不推荐。
白名单策略指没有被允许的流量都要拒绝,这种策略比较保守,根据需要,逐渐开放,目前一般都采用白名单策略,推荐。
iptables详解http://www.zsythink.net/archives/1199
iptables的基本使用
实验准备:
[root@shareserver ~]# systemctl stop firewalld ##关闭firewalld服务,以免对此实验造成影响
[root@shareserver ~]# systemctl disable firewalld
[root@shareserver ~]# systemctl start iptables.service
查看管理命令 iptables -L
附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名
-v:显示详细信息
-t 后面接内建表的名称:显示该内建表的信息
链管理命令
iptables -P 修改默认规则
[root@shareserver ~]# iptables -P INPUT DROP
##默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
iptables -F: FLASH 刷新,清空规则链(注意每个链的管理权限)
iptables -N:NEW 增加自定义的链
[root@shareserver ~]# iptables -N mine ##在默认表filter中新建名为mine的链
iptables -E:修改链名称
[root@shareserver ~]# iptables -E mine redhat ##将链mine名称改为redhat
iptables -X: 删除用户自定义的链,使用该参数删除链时,链必须是空的,
[root@shareserver ~]# iptables -F redhat ##清空链
[root@shareserver ~]# iptables -X redhat ##删除链
规则管理命令
iptables -I num : 插入,把当前规则插入为第几条
[root@shareserver ~]# iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
iptables -A:追加,在当前链的最后新增一个规则
iptables -R num:Replays 替换/修改第几条规则
[root@shareserver ~]# iptables -R INPUT 3 -j DROP ##将原来编号为3的规则动作改为DROP
iptables -D num:删除,明确指定删除第几条规则
[root@shareserver ~]# iptables -D INPUT 3 ##删除第3条规则
iptables -D 规则内容:删除,明确指定内容的规则
[root@shareserver ~]# iptables -D INPUT -p tcp --dport 80 -j ACCEPT
匹配标准
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP IP | IP/MASK 而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据 流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据 流出一般在OUTPUT和POSTROUTING上
--dport:
匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
--sport:
匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
-j ACTION
常用的ACTION:
DROP:丢弃,不回应 一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
规则的读取顺序
规则是从上到下依次读取的,如果上面的满足了,就不读取下面的规则
如图,上述第一条规则显示拒绝所有服务,后又添加了172.25.254.81这台主机允许访问httpd服务;实际上生效的是第一条规则,第二条的规则不会被读取;所以172.25.254.81通过浏览器访问时,依然看不到内容
地址伪装
实验环境:
服务端主机:配置双网卡,ip地址分别为172.25.254.100与1.1.1.100
客户端:ip为1.1.1.200的主机,网关为1.1.1.100
服务端配置:
[root@shareserver ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100 ##在路由后,进行源地址转换SNAT
客户端测试:
[root@client Desktop]# ping 172.25.254.81 ##可以ping通
[root@client Desktop]# ssh [email protected] ##可以连接到不同网段的主机
利用w -i 查询真正登陆172.25.254.81主机的ip,可以看出实际上是172.25.254.100登陆172.25.254.81,而不是1.1.1.200登陆172.25.254.81;这里也就完成了地址伪装。
端口转发
服务端设置:
[root@shareserver ~]# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-dest 1.1.1.200 当ssh链接到172.25.254.100将会跳转到IP为1.1.1.200的主机
测试:
在ip为172.25.254.81主机上进行测试:
在该主机上利用ssh服务连接172.25.254.100这台主机,会发现这台主机将会自动跳转到1.1.1.200,输入的密码也是跳转到的主机的密码。效果如图所示: