iptables

iptables

防火墙概念

  • 逻辑上

    • 主机防火墙

    个人防火墙 针对单个主机进行防护

    • 网络防火墙

    集体防火墙 针对于网络入口进行防护,服务于防火墙背后的本地局域网

  • 物理上

    • 硬件防火墙

    在硬件级别实现防火墙功能,另一部分功能基于软件实现,性能高,成本高

    • 软件防火墙

    应用软件上用逻辑规则在逻辑上实现一个防火墙 ,性能低,成本低


iptables和netfilter

iptables概念

单单Linux的iptables还算不上防火墙,iptables本质上是一个命令行工具(位于用户空间),使用iptables能够操作netfilter(位于Linux内核的安全框架)

netfilter和iptables组成了Linux的包过滤防火墙,能够完成封包过滤封包重定向网络地址转换(NAT)等功能。

netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换
  • 数据包内容修改
  • 数据包过滤

netfilter组件实现Linux包过滤防火墙的功能 iptables命令行工具实现操作netfilter来具体实现防火墙功能

tip: iptables只是一个命令行工具 所以就不存在systemctl start iptables.service这种命令了 调用iptables命令即可


iptables规则概念

iptables在netfilter中添加、修改和删除规则(rules),这就是iptables配置防火墙的实质了

相同功能的规则存储在内核空间的信息包过滤表中(四个表中分别是 filter、nat、mangle、raw表)

规则可以指定源地址目的地址传输协议(TCP、UDP、ICMP)服务类型(HTTP、FTP和SMTP)等

当数据包里面的种种信息(上面提到的)被规则匹配到时 iptables设定的处理办法就会执行 如放行(accept)、拒绝(reject)、丢弃(drop)等

匹配过程是顺序匹配,匹配即停止。


表的概念

我们通过iptables自定义的规则,都存在四个表中

  • 表功能
    • filter表

      负责过滤功能,防火墙; 内核模块:iptables_filter

    • nat表

      网络地址转换功能;内核模块:iptable_nat

    • mangle表

      拆解报文,做出修改,并重新封装的功能;内核模块:iptable_mangle

    • raw表

      关闭nat表上启用的连接追踪机制; 内核模块:iptable_raw

链的概念

规则根据不同的作用被保存在不同的表中。组合不同表中的规则,组成一个Linux内部的关卡

的概念就有了

在这里插入图片描述

五条链

  • input 发往用户空间
  • output 发往内核空间
  • prerouting 路由前
  • forward 转发
  • postrouting 路由后

iptables流程

在这里插入图片描述

图中一个数据报文从客户端出发,经过网卡进入Linux内核空间中的prerouting链(关卡),匹配该关卡的所有规则,根据匹配规则决定报文能不能通过(丢弃?放行?修改数据包信息?)方向由报文目的地决定

报文流向:

到本机某进程的报文:PREROUTING链 ------> INPUT链

由本机转发的报文:PREROUTING -----> FORWARD -----> POSTROUTING

由本机的某进程发出报文(通常为响应报文):OUTPUT -------> POSTROUTING

链表关系

每个链能够使用的表规则

raw表mangle表nat表filter表
PREROUTING链
INPUT链√(centos7有)
OUTPUT链
FORWARD链
POSTROUTING链

在同一个链中 表规则的优先级顺序为 raw---->mangle----->nat----->filter

我们可以在某个表中创建自定义链,但是不能直接应用,只能由五条默认的链通过动作调用

数据经过防火墙的流程图

在这里插入图片描述


匹配条件
  • 基本匹配条件

    源地址,目标地址

  • 扩展匹配条件

    源端口,目标端口等 由扩展模块提供功能


处理动作

当规则被匹配之后 就会执行触发预先设定的动作,可以是基本动作和扩展动作

常用动作:

  • ACCEPT:运行数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息,直到本地超时
  • REJECT:拒绝数据包通过,会给一个拒绝的响应信息
  • SNAT:源地址转换,内网用户共用一个公网IP
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
  • DNAT:目标地址转换 转发
  • REDIRECT: 在本机做端口映射
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配

以上概念参考自http://www.zsythink.net/archives/1199 https://www.cnblogs.com/liang2580/articles/8400140.html


案例测试

理清了粗略的过程 就可以操作一波了 四表五链

iptables命令
  • iptables [-t 表名] 选项 [-I 链名] [-p 条件] [-j 目标操作]

    iptables -t filter -I INPUT -p icmp -j REJECT
    #拒绝icmp协议
    
    iptables -t filter -I INPUT -p icmp -j ACCEPT
    #允许icmp协议
    
    iptables -I INPUT -p icmp -j REJECT   #默认是filter表  可以缺省
    
    
    #不指定表 默认为filter表
    #不指定链  默认为该表的所有链
    #按顺序匹配,匹配即停止(有例外执行LOG动作可以继续匹配),如果没有匹配条件,就执行防火墙默认规则
    #选项/链名/目标操作都用大写
    
  • -F 清空所有规则

  • -A 追加一条防火墙规则至链的末尾位置

  • -I 插入一条防火墙规则至链的开头

  • -nL 查看iptables所有规则 以数字形式显示地址、端口等信息 n必须在前面

  • –line-numbers 查看规则时,显示规则的行号

  • -D 删除链内指定序号(或内容)的一条规则

  • -P 为指定的链设置默认规则

iptables过滤条件

类别选项用法
通用匹配协议匹配-p 协议名称
通用匹配地址匹配-s 源地址、-d 目标地址
通用匹配接口匹配-i 接受数据的网卡、-o 发送数据的网卡
隐含匹配端口匹配–sport 源端口号、–dport 目标端口号
隐含匹配ICMP类型匹配–icmp-type ICMP类型

命令使用
iptables -F  #清空所有规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
#追加规则至filter表中的INPUT链的末尾,允许任何人使用TCP协议访问本机
iptables -I INPUT -p udp -j ACCEPT
#插入规则至filter表中的INPUT链的开头,允许任何人使用UDP协议访问本机
iptables -I INPUT 2 -p icmp -j ACCEPT
#插入规则至filter表中的INPUT链的第2行,允许任何人使用ICMP协议访问本机

iptables -nL INPUT  #查看INPUT链的规则
Chain INPUT (policy ACCEPT)  #默认规则动作是ACCEPT
target     prot opt source               destination
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0

iptables -L INPUT --line-numbers #查看INPUT链规则 显示行号
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  anywhere             anywhere          #没加n选项所以不是数字显示IP
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     tcp  --  anywhere             anywhere


#删除操作
iptables -D INPUT 3   #删除filter表中INPUT链的第三条规则
iptables -nL INPUT   #查看以西 确认第三条被删除了
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0

#清空四个表中的所有规则
iptables -F   #默认是filter表
iptables -t nat -F
iptables -t mangle -F 
iptables -t raw -F

#修改默认规则动作
iptables -t filter -P INPUT DROP    #设置INPUT链默认规则为DROP   用ssh控制 敲完就断了。。。
iptables -nL INPUT #查看下
Chain INPUT (policy DROP)
target     prot opt source               destination

#记得改回ACCEPT

filter过滤和转发测试案例
条件命令

iptables过滤条件

类别选项用法
通用匹配协议匹配-p 协议名称
通用匹配地址匹配-s 源地址、-d 目标地址
通用匹配接口匹配-i 接受数据的网卡、-o 发送数据的网卡
隐含匹配端口匹配–sport 源端口号、–dport 目标端口号
隐含匹配ICMP类型匹配–icmp-type ICMP类型
前置准备
主机名配置
clientens33:192.168.4.10 网关:192.168.4.5
proxyens33:192.168.2.5 ens37:192.168.4.5
web1ens33:192.168.2.100 网关:192.168.2.5
主机型防火墙测试
#proxy主机型防火墙测试    守护的是自己这台机子
iptables -I INPUT -p tcp --dport 80 -j REJECT
iptables -I INPUT -s 192.168.2.100 -j REJECT
iptables -I INPUT -d 192.168.2.5 -p tcp --dport 80 -j REJECT
iptables -I INPUT -i ens33 -p tcp --dport 80 -j REJECT
iptables -A INPUT -s 192.168.2.0/24 -j DROP   #丢弃所有2.0网段的主机数据包
iptables -A INPUT -s 114.212.33.12 -p tcp --dport 22 -j REJECT #拒绝114.212.33.12使用tcp协议远程ssh目标22端口(本机)
网络型防火墙测试
#完成前置准备
echo 1 > /proc/sys/net/ipv4/ip_forward  #开启路由转发 临时的   实现软路由功能
#or
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf  #实现永久有效规则

#web1
yum -y install httpd
echo "test page" > /var/www/html/index.html
systemctl restart httpd

#client
curl http://192.168.2.100    #4.10访问2.100的http服务
test page                     #成功访问到了

#proxy  禁止访问
iptables -I FORWARD -s 192.168.4.10 -p tcp --dport 80 -j DROP
#在FORWARD链中添加规则   丢弃来自4.10的tcp协议访问目标机子80端口的数据包

#client
curl http://192.168.2.100  #再次访问
#漫长的等待  没有回应    数据包被DROP丢弃了   响应消息都不给~ 如果是REJECT就会有回应
禁ping的策略
iptables -I INPUT -p icmp -j DROP #禁止ping  别人的ping丢弃  自己ping别人把回应的也丢弃了

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP #禁止入站的Ping请求 不拒绝入站的ping回应包 就能够组织别人ping自己  自己可以ping别人了

iptables -p icmp --help  #查看更多操作
防火墙扩展规则

-m指定扩展模块 --具体扩展条件 -j 动作

根据MAC地址过滤测试
#client
ip link show ens33 #查看client的MAC地址
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:e9:31:9b brd ff:ff:ff:ff:ff:ff
    
#proxy
iptables -F
iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 00:0c:29:e9:31:9b -j DROP
#                                     mac模块    参数指定MAC地址
#针对client的MAC地址丢弃数据包     client改IP都没有用
基于多端口设置过滤规则
iptables -A INPUT -p tcp -m multiport --dports 20,25,80,110,143,16501:16800 -j ACCEPT
#允许20,25,80,110,143,16501~16800所有端口tcp协议访问 一般多端口模块只用来作用目标端口,不用来作用源端口(--sports),因为源端口不固定 没有限制的意义
根据IP地址范围设置规则
iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEPT
#本命令允许源地址IP为4.10~20的通过  目标地址ip参数(--dst-range)

iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
#禁止4.0网段ssh登录本机  不需要扩展模块

SNAT实现共享上网

沿用filter过滤和转发测试案例

设定2.0网段是外部网络 4.0网段是内部网络

实现client(4.10)访问web1(2.100),查看web1日志是2.5访问的web1,达到伪装的效果

#proxy
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.2.5
#规则是在proxy的POSTROUTING链上,源地址是4.0网段的 访问目标80端口 触发SNAT动作 修改数据包的源地址为192.168.2.5

#client
curl http://192.168.2.100  #访问
test page             #成功通过proxy访问到


#web1
tail -n 1 /var/log/httpd/access_log  #查看httpd日志最后一行  看看是谁访问了网页
192.168.2.5 - - [13/Jan/2021:12:47:25 -0500] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
#可以发现是2.5访问的 说明伪装成功了



iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j MASQUERADE
#对于外网IP不固定的情况,可以执行MASQUERADE动作  达到动态伪装IP的效果
#要问为什么  因为租一个固定公网IP太贵了 T.T

永久设置iptables
#通过iptables命令设置的规则都是临时的   永久的需要使用iptables-services工具并开机自动启动服务
yum -y install iptables-services
systemctl enable --now iptables.service  #开机自启服务 将保存的规则执行
service iptables save         #保存当前临时配置的iptables规则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值