Linux 防火墙
程序员文章站
2022-07-12 16:54:36
...
iptables的基本认识
Netfiler组件
- 内核空间,集成在linux内核中
- 扩展各种网络服务的结构化底层框架
- 内核中选取五个位置放了五个hook(勾子) function(INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING), 而这五个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中链和表的对应关系:
数据包过滤匹配流程
IPTABLES和路由
路由功能发生的时间点
报文进入本机后
- 判断目标主机是否是为本机
是: INPUT
否:FORWARD
报文离开本机之前
- 判断由哪个接口送往下一跳
内核中数据包的传输过程
内核中数据包的传输过程
- 当一个数据包进入网卡时,数据包首先进入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链
工作原理图
实验环境需要三台服务器:A,B,C
网络配置环境表格
实验步骤:
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
在C机中抓包:
[root@R1 ~]#tcpdump -i ens37 -nn icmp
结论发现:
当我们在局域网内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下Docker CE使用从包中安装的方式详解
-
Docker基础知识之Linux namespace图文详解
-
win2003 iiscolander 防火墙 安装教程
-
在Linux系统上部署Apache+Python+Django+MySQL环境
-
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
-
Linux下将Python的Django项目部署到Apache服务器
-
Linux下python与C++使用dlib实现人脸检测
-
二进制编辑器有哪些(linux二进制编辑器安装步骤())
-
linux查看实时日志命令(查看日志的三种命令分享)
-
linux上mysql安装详细教程