目录
四表:
放行ssh,dns,dhcp,ntp,samba,nfs,http,https服务对应的端口
我们一听到“iptables”这个词会不会想到防火墙,其实这玩意并不是真正的防火墙,它只是一个命令行工具罢了,我们可以理解为一个客户端代理,用户通过iptables这个代理,将用户的设置的安全设定执行到对应的“安全框架”中,这个安全框架才是真正的防火墙,而这个框架的名字叫netfilter。
netfilter组件也称内核空间,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集
2.策略
防火墙的策略一般分为两种:
(1)通策略,默认门是关着的,必须要定义谁能进来谁才能进。
(2)堵策略,大门是打开的,但你必须要身份验证。
所以我们要定义,让进来的进来,让出去的出去。当我们要定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filrer过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,而制定了“表”这个定义,来定义,区分各种不同的工作功能和处理方式。
3.命令格式
语法:
iptables(选项)(参数)
iptables -t 表名 规则链名 [规则号] -p 协议名 --sport 源端口 --dport 目标端口 -j 动作
选项:
-t --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。 # 通用匹配:源地址目标地址的匹配
-p 指定要匹配的数据包协议类型 -s --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。 -d
--destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。 -i --in-interface [!] :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。 -o --out-interface [!] :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。 # 查看管理命令
-L --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。 # 规则管理命令
-A --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。 -I --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。 -D --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。 -R num Replays替换/修改第几条规则 # 链管理命令(这都是立即生效的)
P --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的 -F --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则 -N --new-chain chain 用指定的名字创建一个新的链。 -X --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。 -E --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响 -Z --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。 -j --jump target :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。 -h 显示帮助信息
参数:
参数 | 作用 |
-P | 设置默认策略:iptables -P INPUT (DROP |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I | num 在规则链的头部加入新规则 |
-D | num 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,udp,icmp |
--dport num | 匹配目标端口号 |
--sport num | 匹配来源端口号 |
4.工作机制
四表:
表的作用:容纳各种规则链
- raw :确定是否对该数据包进行状态跟踪
- mangle :修改数据包内容,用来做流量整形的,给数据包设置标记
- nat :负责网络地址转换,用来修改数据源包中的源、目标IP地址或端口
- filter :负责过滤数据包,确定是否放行该数据包(过滤)
规则表优先顺序(从左往右):
raw
五链:
规则链的作用:容纳各种防火墙规则
- INPUT链 :处理输入数据包,匹配目标IP为本机的数据包
- OUTPUT链 :处理输出数据包,一般不在此链上做配置
- FORWARD链 :处理转发数据包。
- PREROUTING链 :在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT,相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上
- POSTOUTING链 :在进行路由选择后处理数据包,用来修改源地址,用来做SNAT,相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网
入站顺序(从左往右):PREROUTING
出站顺序(从左往右):OUTPUT
转发顺序(从左往右):PREROUTING
PS:表里有链,链里有规则
5.保存和恢复
mkdir /etc/iptables.bak #创建一个保存iptables规则的文件
iptables-save > /etc/iptables.bak #将现有规则添加写入到备份文件中
iptables-restore < /etc/iptables.bak #将保存的规则配置写入到iptables进制中
6.扩展
iptables -L #列出所有规则
iptables -nvL #查看详细信息,ip和端口会以数据的形式显示
iptables -t nat -L #列出NAT表中的所有规则
iptables -F #清空规则
iptables -t nat -D INPUT 1 #删除 nat 表 INPUT 链下的第一条规则
7.案例
-
默认阻挡所有流量(以下实验都是以此规则上完成)
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P FORWARD DROP
oot@localhost ~]# iptables -F
-
允许被ping
PS:如果OUTPUT这个链在被关闭的清空下要记得数据包有来就有回
-
放行ssh,dns,dhcp,ntp,samba,nfs,http,https服务对应的端口
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 67 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 123 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 139 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 445 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p udp --dport 137:138 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p udp --dport 111 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p udp --dport 2049 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 111 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 2049 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
PS:可以使用ss -nltp | grep "服务名" 来查看服务开启了那个端口
基于MAC地址规则过滤
因为我这台主机有多张网卡,在不配置秘钥和控制远程设置文件(hosts.allow,hosts.deny)的同时让指定MAC地址才能通过ssh登录上我这台主机
环境:
server端:192.168.100.100
Client端:192.168.100.1 0 MAC:00:0c:29:ad:ea:XX
admin:192.168.100.1 MAC:00:50:56:C0:00:XX
要求:定义iptables规则,只允许admin登录到server端
[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.100.1/32 -m mac --mac=00:50:56:C0:00:XX --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I INPUT 2 -p tcp --dport 22 -j DROP
尝试使用client端进行登录查看是否被拒绝
PS:可以使用tcpdump命令或tail /var/log/messages来进行抓包分析
NAT
环境:
[root@localhost ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf #防火墙开启转发 [root@localhost ~]# sysctl -p net.ipv4.ip_forward = 1
SNAT:
[root@localhost ~]# iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 172.16.100.100
#将192.168.100.0这个网段的地址修改源地址为172.16.100.100
PS:但是我尝试使用192.168.100.10去ping172.16.100.200时还是ping不通,转发也是打开的状态,这是因为我的filter表中FOREWARD链是默认是关闭掉的,不能进行数据转发,我们只要在FOREWARD链中写入放行规则即可。
[root@localhost ~]# iptables -I FORWARD -p icmp -j ACCEPT
[root@localhost ~]# iptables -I FORWARD -s 192.168.100.0/24 -d 172.16.100.0/24 -j ACCEPT
如果我们防火墙的地址是动态获取的我们因为ip的频繁改变就要去添加对应规则,这样工作量就太大了而且容易出现故障
[root@localhost ~]# iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
#这一条表示我的内网地址变成多少它也会随机变化,以应变频繁改变的ip环境
DNAT:
内网的能出去了,让外网的也能访问到我们内网网段,在内网服务器上安装一台web服务,端口为默认状态,使我们的外网地址能访问到我内网的web服务。
内网:
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo neiwang > /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 127.0.0.1:80
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
防火墙: [root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -s 172.16.100.100 -j DNAT --to-dest 192.168.100.10:80
#所有访问我公网地址80端口时,转化为给内网的192.168.100.10:80
[root@localhost ~]# iptables -I FORWARD -p tcp -d 192.168.100.10/24 --dport 80 -j ACCEPT
#这个时候防火墙自身打不开web网站,因为防火墙自身不会给自己做DNAT,可以使用一下这个命令
[root@localhost ~]# iptables -t nat -I OUTPUT -p tcp --dport 80 -j DNAT --to-dest 192.168.100.10