欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux 防火墙

程序员文章站 2022-07-12 16:54:36
...

iptables的基本认识

Netfiler组件

  • 内核空间,集成在linux内核中
  • 扩展各种网络服务的结构化底层框架
  • 内核中选取五个位置放了五个hook(勾子) function(INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING), 而这五个hook function向用户开放,用户可以通过一个命令工 具(iptables)向其写入规则
  • 由信息过滤表(table)组成,包含控制IP包处理的规则集( rules),规则被分组放在链(chain)上

三种报文流向:

  • 流入本机:PREROUTING –> INPUT–>用户空间进程
  • 流出本机:用户空间进程 –>OUTPUT–> POSTROUTING
  • 转发:PREROUTING –> FORWARD –> POSTROUTING

防火墙工具

iptables

  • 命令行工具,工作在用户空间
  • 用来编辑规则,写好的规则被送往netfilter告诉内核如何去处理信息包

firewalld

  • centos 7 引入了新的前端管理工具
  • 管理工具:
    firewall-cmd 命令行
    firewall-config 图形

iptables的组成

iptables由四个表和五个链以及一些规则组成

四个表table:filter、nat、mangle、raw

  • filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
  • nat表:network address translation 地址转换规则表
  • mangle:修改数据标记位规则表
  • Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
  • 优先级由高到低的顺序为:raw–>mangle–>nat–>filter

五个内置链chain

  • INPUT
  • OUTPUT
  • FORWARD
  • PREROUTING
  • POSTROUTING

当我们创建一条规则的时候,我们首先要明确我们需要在哪条链上执行动作,根据不同的功能选择合适的链,同样,我们也需要通过不同的功能选择不同的表。下图就是iptables中链和表的对应关系:

Linux 防火墙

数据包过滤匹配流程

Linux 防火墙

IPTABLES和路由

路由功能发生的时间点
报文进入本机后

  • 判断目标主机是否是为本机
    是: INPUT
    否:FORWARD

报文离开本机之前

  • 判断由哪个接口送往下一跳
    Linux 防火墙

内核中数据包的传输过程

内核中数据包的传输过程

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链, 内核根据数据包目的IP判断是否需要转送出去
  • 如果数据包就是进入本机的,数据包就会沿着图向下移动,到达 INPUT链。数据包到达INPUT链后,任何进程都会收到它。本 机上运行的程序可以发送数据包,这些数据包经过OUTPUT链 ,然后到达POSTROUTING链输出
  • 如果数据包是要转发出去的,且内核允许转发,数据包就会向右 移动,经过FORWARD链,然后到达POSTROUTING链输出

iptables命令

  • 规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]
  • -t table:
    raw, mangle, nat, [filter]默认

SUBCOMMAND:
1、链管理:

  • -N:new, 自定义一条新的规则链
  • -X:delete,删除自定义的空的规则链
  • -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有: ACCEPT:接受
    DROP:丢弃
  • -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名, 也不能被删除

2、查看

  • -L:list, 列出指定鏈上的所有规则,本选项须置后
  • -n:numberic,以数字格式显示地址和端口号
  • -v:verbose,详细信息
  • -vv 更详细
  • -x:exactly,显示计数器结果的精确值,而非单位转换后的 易读值
  • –line-numbers:显示规则的序号 常用组合:
    –vnL –vvnxL –line-numbers
  • -S selected,以iptables-save 命令格式显示链上规则

3、规则管理

  • -A:append,追加
  • -I:insert, 插入,要指明插入至的规则编号,默认为第一条
  • -D:delete,删除 (1) 指明规则序号 (2) 指明规则本身
  • -R:replace,替换指定链上的指定规则编号
  • -F:flush,清空指定的规则链
  • -Z:zero,置零 iptables的每条规则都有两个计数器
    (1) 匹配到的报文的个数
    (2) 匹配到的所有报文的大小之和
  • chain:PREROUTING,INPUT,FORWARD,OUTPUT, POSTROUTING

匹配条件

  • 基本:通用的,PARAMETERS
  • 扩展:需加载模块,MATCH EXTENTIONS
    1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
  • [!] -s, –source address[/mask][,…]:源IP地址或范围
  • [!] -d, –destination address[/mask][,…]:目标IP地址或范围
  • [!] -p, –protocol protocol:指定协议,可使用数字如0(all) protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or “all“ 参看:/etc/protocols
  • [!] -i, –in-interface name:报文流入的接口;只能应用于数据 报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
  • [!] -o, –out-interface name:报文流出的接口;只能应用于数 据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链

NAT

  • NAT: network address translation
    PREROUTING,INPUT,OUTPUT,POSTROUTING
    请求报文:修改源/目标IP,由定义如何修改
    响应报文:修改源/目标IP,根据跟踪机制自动实现
  • SNAT:source NAT POSTROUTING, INPUT
    让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
    请求报文:修改源IP
  • DNAT:destination NAT PREROUTING , OUTPUT
    把本地网络中的主机上的某服务开放给外部网络访问(发 布服务和端口映射),但隐藏真实IP
    请求报文:修改目标IP

实验

SNAT实现
SNAT:改postrouting链
工作原理图
Linux 防火墙
实验环境需要三台服务器:A,B,C
网络配置环境表格
Linux 防火墙
实验步骤:
1.首先在A机中添加一条路由,网关指向192.168.243.7

 route add default gw 192.168.243.7 

2.打开网关服务器的路由转发:

echo 1 > /proc/sys/net/ipv4/ip_forward     

3.在网关服务器上添加SNAT策略

iptables -t nat -A POSTROUTING -s 192.168.243.0/24 -j SNAT --to-source 172.18.41.7  

如果是动态IP上网,则改动下SNAT策略如下

iptables -t nat -A POSTROUTING -s 192.168.243.0/24 -j MASQUERADE  

验证:
在A机种ping C机IP
Linux 防火墙

在C机中抓包:

[root@R1 ~]#tcpdump -i ens37 -nn icmp

Linux 防火墙
结论发现:
当我们在局域网内A机(192.168.243.6)发出请求IP时,发现在互联网服务器端请求IP来源地址是是网关服务器IP,Internet中的服务器并不知道局域网PC机的实际IP地址,中间的转换完全由网关主机完成,起到了保护内部网络的作用。


实验 DNAT实现

互联网访问局域网内网时安全设置
SNAT:改postrouting链

iptables -t nat -A PREROUTING  -d 172.18.41.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.243.6

验证:
在C机中通过访问 ping 172.18.41.7
观察A机中 httpd 日志

tail -f /var/log/httpd/access_log 

观察到是访问IP是172.18.41.8
Linux 防火墙

上一篇: Linux防火墙

下一篇: linux防火墙