iptables

目录

1.简介

2.策略

3.命令格式

选项:

参数:

4.工作机制

          四表:

 五链:

5.保存和恢复

6.扩展

7.案例

默认阻挡所有流量(以下实验都是以此规则上完成)

允许被ping

放行ssh,dns,dhcp,ntp,samba,nfs,http,https服务对应的端口

基于MAC地址规则过滤

NAT

SNAT:

DNAT:


我们一听到“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 numReplays替换/修改第几条规则

# 链管理命令(这都是立即生效的)

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值