iptables 实现地址转换与安全控制

2024-08-23 17:38

本文主要是介绍iptables 实现地址转换与安全控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 目标:模拟生产环境的基本拓扑,实现通过源地址转换内网多台主机公共一个IP地址访问互联网,并通过目标地址转换,把www等多个服务器放到互联中,并实现安全控制,基本拓扑结构如下:

在这个拓扑结构中来说,就是局域网中的机器都可以访问互联网中的Web1,局域网中的机器也可以访问Web2与内部FTP(电脑配置有限以www为例),外部的Web1看做客户端也可以访问Web2,并实现对访问进行一些控制,比如对FireA的ssh严格控制,以防攻破第一道墙。用两个防火墙的意义在于如果DMZ中的服务器被攻破而不会对内网造成影响,下面慢慢来说这个实验吧。

一,实验准备

1.1 用虚拟机模拟出4台安装了redhat5.8的机器,分别对应Web1,FireA,Web2,FireB,真实的物理主机作为局域网中的一台机器,其中Fire的机器需要两块网卡。

1.2 根据拓扑结构图我们来配置虚拟机网卡需要的连接方式。

Web1:eth0 桥接

FireA:eth0 桥接; eth1 Host-only

Web2:eth0 Host-only

FireB:eth0 Host-only;eth1 桥接

1.3 根据拓扑图设置他们的IP地址,网关,路由等

Web1:eth0 IP:1.1.1.2/8 Gateway: 1.1.1.1

FireA:eth0 IP:1.1.1.1/8 eth1 192.168.1.1 Gateway:192.168.1.254

Web2:eth0 IP:192.16.1.2/24 Gateway:192.168.1.1

FireB:eth0 IP:192.168.1.254/24 eth1:172.16.1.1/16 Gateway:192.168.1.1

 
  1. ifconfig eth0 1.1.1.2/8        ##设置IP 
  2. route add default gw 1.1.1.1   ##设置网关 

1.4 Web1,Web2配置一个简单的站点。

这个此处就不在赘述。

1.5 打开FireA,FireB的转发功能

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

到此网络已经连通,主机之间可以相互访问,但是这在现实网络中是行不通的,因为公网的地址是不能访问私网地址的,这就用到了地址转换。

二,源地址转换实现多台主机通过一个IP上网,同时隐藏局域网主机,增加安全性。

从拓扑中可知Lan1访问Web1得通过两个防火墙,这意思是说地址需要转换两次。

FireB中源地址转换:

 
  1. iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.1.254 

通过FireB后数据帧中的 源IP:172.16.1.2 目的IP:1.1.1.2 变为 源IP:192.168.1.254 目的IP:1.1.1.2 

FireA源地址转换:

 
  1. iptables -t nat -A POSTROUTING -s 192.168.1.254/24 -j SNAT --to-source 1.1.1.1 

通过FireB后数据帧中的 源IP:192.168.1.254 目的IP:1.1.1.2 变为 源IP:1.1.1.1 目的IP:1.1.1.2 数据到达Web1.Web1收到后对数据进行响应,源IP: 1.1.1.2 目的IP:1.1.1.1 经过FireA,FireA发现这个是转换过地址的封包,于是查询内部的表得知原来的IP地址,于是便还原回原来的地址这时 源IP:1.1.1.2 目的IP:192.168.1.254 当数据帧到达FireB后发现这个是转换过地址的封包,于是查询自己内部的表得知对应的IP地址,这时 源IP:1.1.1.2目的IP:172.16.1.2 整个过程到此为一个循环,会话正常建立。

访问Web1的站点,然后查询Web1的access日志,查看访问IP是否与分析的一致。

 

三.通过目标地址转换,多台服务器公用一个公网IP,并实现正常访问

由于我们只有一个公网IP,但是我们有多种服务提供,比如说WWW,如果说FTP等等,私网IP公网上的其它主机又访问不到,公网IP也只有一个,这个时候我们就用目标地址转换吧。以Web1访问Web2为例,先来操作,后来解释。

FireA目标地址转换:

 
  1. iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2 

这时Web1访问1.1.1.1的80 即可访问Web2的站点。Web1发出的数据帧 源IP:1.1.1.2 目标IP:1.1.1.1 经过FireA时,发现访问的是80端口,自己本身没有提供web服务,于是转换目的地址,源IP:1.1.1.2 目的IP:192.168.1.2 这时数据包就顺利到达了Web2,Web2作出响应,源IP:192.168.1.2 目的IP:1.1.1.2 经过FireA,FireA发现这个包曾地址转换过于是,便把地址还原回来,这时源IP:1.1.1.1 目的IP:1.1.1.2 数据包到达Web1,一个循环结束,会话建立。

内网访问Web不需要地址转换,因为大家都是私网嘛,所以很和谐的。

 

四.通过iptables来实现访问控制。

由于美帝国主义亡我之心不死,见从经济与军事无法战胜我大中华,于是便派这种怪客啊,黑客等从网络上对我国安全构成威胁,于是我们伟大 互联网专家、国家防火墙之父、集各种名誉为一身的科学家 方滨兴 大人首先举起了反抗的大旗,构筑了伟大的国家防火墙,很大程度上减少了对我们的攻击。但是我们也不能放松警惕,时刻提高自我的安全意识……扯太远了,继续说我们的iptables吧。

4.1 把所有的默认策略设置为DROP,然后针对性的放行。

 

 
  1. ##FireA设置 
  2. iptables -P INPUT DROP 
  3. iptables -P OUTPUT DROP 
  4. iptables -P FORWARD DROP 
  5. ##放行本机sshd以允许管理员远程 ##当然最好配合修改ssh端口号,禁止root登陆等
  6. iptables -A OUTPUT -m state --state established -j ACCEPT  ##凡是建立连接的都让出去
  7. iptables -A INPUT  -p tcp --dport 22  -m state --state NEW -m recent --set --name SSH 
  8. iptables -A INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --name SSH -j DROP 
  9. iptables -A INPUT  -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT    ##放行 ssh

4.2 放行外网对80的访问(以及对你已知端口的访问)

 
  1. ##所有建立的连接都予以转发 
  2. iptables -A FORWARD -m state --state established -j ACCEPT 
  3. ##对放松进来的端口为80的数据包 
  4. iptables -A FORWARD -d 192.168.1.2 -p tcp --dport 80 -m state --state new,established -j ACCEPT  

4.3 放行来自192.168.1.254 即来自内网需要出去的包,一般对内网出去的包设置稍微宽松点,针对不同的生产环境,设置不同的严厉程度。

 
  1. ##放行内网出去的所有包 ##也可以设置宽松点 
  2. iptables -A FORWARD -s 192.168.1.254 -j ACCEPT  

4.4 设置FireB,设置ssh的限制,允许已建立的连接通过转发,不允许所有new状态包通过

 
  1. ##这个防火墙稍微宽松些吧,默认政策就是允许吧 
  2. ##设置ssh与FireA的相同 
  3. ##禁止所有进入局域网为new状态的包 
  4. iptables -A FORWARD -m --state new -j DROP 

4.5 限制内网的某个捣乱机器连接外网,屏蔽其mac

 
  1. iptables -A FORWARD -s 172.16.0.0/16 -m mac --mac-source ##:##:##:##:##:## -j DROP

4.6 过滤内网中访问包含sex字符串的内容

 
  1. iptables -A FORWARD -s 172.16.0.0/16 -m string --algo kmp --string 'sex' -j DROP    
  2. ##当然也可以对第一道防火墙那也这么设置 

4.7 如果想对内网中某些软件的过滤需要重新编译内核与iptables,比如用L7layer来给内核打补丁,然后编译iptables,用来过滤qq,迅雷等,如果有需要访问http://kangjie.blog.51cto.com/1301530/288002 。

这篇关于iptables 实现地址转换与安全控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100055

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja