首页 > 系统相关 >Linux防火墙【SNAT、DNAT】

Linux防火墙【SNAT、DNAT】

时间:2024-05-30 15:22:21浏览次数:14  
标签:network SNAT 192.168 12.0 Linux node1 curl root DNAT

一、网络防火墙

iptables/netfilter 利用filter表的FORWARD链,可以充当网络防火墙

注意的问题:

  • (1)请求-响应报文均会经由FORWARD链,要注意规则的方向性;
  • (2)如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行。

示例一:实现内网和外网可以相互访问
1.内网机器安排httpd服务,启动服务,修改主机名,生成主页文件

点击查看代码
7-3 和 7-4 两台内网机器:
[root@node3 ~]#  yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname web1; echo web1 > /var/www/html/index.html
[root@node4 ~]#  yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname web1; echo web2 > /var/www/html/index.html

[root@node1 ~]#  curl  192.168.204.30    //用7-1验证,向7-3发起网络请求
web1
[root@node1 ~]#  curl  192.168.204.40    //用7-1验证,向7-4发起网络请求
web2

2.修改内网机器网关,指向网关机器的内网地址

点击查看代码
[root@node3 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33  //修改7-3网卡配置
  GATEWAY=192.168.204.20    //网关指向7-2
[root@node3 ~]#  systemctl restart network   //重启网络
[root@node3 ~]#  route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.204.20  0.0.0.0         UG    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
192.168.204.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

[root@node4 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33  //修改7-4网卡配置
  GATEWAY=192.168.204.20    //网关指向7-2
[root@node4 ~]#  systemctl restart network   //重启网络
[root@node4 ~]#  route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.204.20  0.0.0.0         UG    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
192.168.204.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

3.配置网关防火墙 服务器

点击查看代码
7-2添加外网网卡(仅主机模式)12.0.0.1
[root@node2 ~]#  cd /etc/sysconfig/network-scripts/
[root@node2 network-scripts]#  ls
[root@node2 network-scripts]#  cp ifcfg-ens33 ifcfg-ens36  //复制网卡配置文件
[root@node2 network-scripts]#  vim ifcfg-ens36             //修改配置
[root@node2 network-scripts]#  systemctl restart network   //重启网络
[root@node2 network-scripts]#  ip a

4.外网机器设置

点击查看代码
7-1 IP设置为12.0.0.100 :
[root@node1 ~]# systemctl enable --now httpd //注意要设置!!!不然后面无法开启httpd服务
[root@node1 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33 
  IPADDR=12.0.0.100      
  NETMASK=255.255.255.0
  GATEWAY=12.0.0.1
[root@node1 ~]#  systemctl restart network

然后在虚拟机中将7-1改为仅主机模式
[root@node1 ~]#  ping 12.0.0.1     //ping7-2看能否ping通
PING 12.0.0.1 (12.0.0.1) 56(84) bytes of data.
64 bytes from 12.0.0.1: icmp_seq=1 ttl=64 time=0.748 ms
64 bytes from 12.0.0.1: icmp_seq=2 ttl=64 time=0.426 ms
64 bytes from 12.0.0.1: icmp_seq=3 ttl=64 time=0.679 ms

5.网关机器添加路由转发功能

点击查看代码
[root@node1 ~]#  ping 192.168.204.30       //7-1设置为仅主机模式后,ping7-3不通,需要开启路由转发功能
PING 192.168.204.30 (192.168.204.30) 56(84) bytes of data.

7-2 添加路由转发功能:
[root@node2 network-scripts]#  sysctl -a   //查看所有内核参数
[root@node2 network-scripts]#  sysctl -a |grep ip_forward 
net.ipv4.ip_forward = 0   //参数
net.ipv4.ip_forward_use_pmtu = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens36.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
[root@node2 network-scripts]#  vim /etc/sysctl.conf   //修改内核参数
[root@node2 network-scripts]#  sysctl -p              //生效
net.ipv4.ip_forward = 1

[root@node1 ~]#  ping 192.168.204.30      //开启路由转发功能后7-1能够ping通7-3
PING 192.168.204.30 (192.168.204.30) 56(84) bytes of data.
64 bytes from 192.168.204.30: icmp_seq=1 ttl=63 time=1.20 ms
64 bytes from 192.168.204.30: icmp_seq=2 ttl=63 time=1.33 ms
64 bytes from 192.168.204.30: icmp_seq=3 ttl=63 time=1.00 ms

6.实现内外网互通

点击查看代码
[root@node1 ~]#  curl 192.168.204.30    //外网能够访问内网
web1
[root@node1 ~]#  curl 192.168.204.40
web2
[root@node1 ~]#  systemctl start httpd  //开启7-1的httpd服务
[root@node1 ~]#  echo "7-1 7-1" > /var/www/html/index.html  //网页内容为7-1 7-1

[root@node3 ~]#  curl 12.0.0.100    //7-3查看7-1的网页,内网可以访问外网
7-1 7-1
[root@node4 ~]#  curl 12.0.0.100    //7-3查看7-1的网页,内网可以访问外网
7-1 7-1

示例2:实现内网可以访问外网,外网不可以访问内网

添加规则,外网不能访问内网

点击查看代码
7-2网关机器添加规则:
[root@node2 ~]#  iptables -A FORWARD ! -s 192.168.204.0/24 -d 192.168.204.0/24 -m state --state NEW -j REJECT
//!取反

7-1:
[root@node1 ~]#  curl 192.168.204.30      //外网不能访问内网
curl: (7) Failed connect to 192.168.204.30:80; 拒绝连接
[root@node1 ~]#  curl 192.168.204.40
curl: (7) Failed connect to 192.168.204.40:80; 拒绝连接

示例3:针对特定的内网机器允许访问

添加规则,只允许-1访问7-3的80端口

点击查看代码
7-2网关机器添加规则:
[root@node2 network-scripts]#  iptables -I FORWARD ! -s 192.168.204.0/24 -d 192.168.204.30 -m state --state NEW -p tcp --dport 80 -j ACCEPT

[root@node1 ~]#  curl 192.168.204.30     //7-1能够访问7-3
web1
[root@node1 ~]#  curl 192.168.204.40     //7-1不能访问7-4
curl: (7) Failed connect to 192.168.204.40:80; 拒绝连接

二、NAT

NAT(network address translation)网络地址转换,支持PREROUTING,INPUT,POSTROUTING,OUTPUT四个链。

请求报文:修改源/目标IP,

响应报文:修改源/目标IP,根据跟踪机制自动实现

NAT的实现分为下面类型:

  • SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
  • DNAT:destination NAT 支持PREROUTING,OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
  • PNAT: port nat,端口和IP都进行修改

1.SNAT

1.1 SNAT原理与应用
SNAT原理:源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢
SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)
1.2 SNAT转换前提条件

局域网各主机已正确设置IP地址、子网掩码、默认网关地址
Linux网关开启IP路由转发
(linxu系统本身是没有转发功能,只有路由发送数据)

1.3 SNAT 实验

实验环境:

  • centos7-1 (外网服务器) ens33 IP地址(仅主机):12.0.0.100
  • centos7-2 (网关服务器) ens33 IP地址(nat):192.168.204.20 ;ens36 IP地址(仅主机):12.0.0.1
  • centos7-3 (内网服务器) ens33 IP地址(nat):192.168.204.30

实验效果:

  • 7-3可以访问7-1,并且7-1的日志当中客户端是12.0.0.1

实验步骤:

1.7-3 内网服务器设置

点击查看代码
7-3安装httpd服务,启动服务,修改主机名,生成主页文件:
[root@node3 ~]#  systemctl stop firewalld
[root@node3 ~]#  setenforce 0
[root@node3 ~]#  yum install httpd -y; systemctl enable --now httpd; hostnamectl set-hostname web1 ; echo "7-3 7-3" > /var/www/html/index.html
[root@web1 ~]#  curl 127.0.0.1    //访问自己
7-3 7-3

[root@web1 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33  //修改配置文件
   GATEWAY=192.168.204.20   //网关指向7-2
[root@web1 ~]#  systemctl restart network   //重启服务

2.7-2 网关服务器设置

点击查看代码
7-2网关服务器添加一块网卡(仅主机)

[root@node2 ~]#  cd /etc/sysconfig/network-scripts/
[root@node2 network-scripts]#  ls
[root@node2 network-scripts]#  cp ifcfg-ens33 ifcfg-ens36  //复制网卡配置文件
[root@node2 network-scripts]#  vim ifcfg-ens36             //修改配置文件
[root@node2 network-scripts]#  systemctl restart network   //重启服务


7-2开启`路由转发`:
[root@node2 network-scripts]#  sysctl -a |grep ip_forward  //查看内核参数
  net.ipv4.ip_forward = 0   
  .......................
[root@node2 network-scripts]#  vim /etc/sysctl.conf   //修改内核参数
[root@node2 network-scripts]#  sysctl -p              //生效
  net.ipv4.ip_forward = 1

3.7-1 外网服务器设置

点击查看代码
7-1安装httpd服务,启动服务,修改主机名,生成主页文件:
[root@node1 ~]#  yum install httpd -y;systemctl enable --now httpd;  echo "7-1 7-1" > /var/www/html/index.html
[root@node1 ~]#  curl 127.0.0.1          //可以访问自己
7-1 7-1
[root@node1 ~]#  curl 192.168.204.30     //可以访问7-3
7-3 7-3

7-1改为仅主机模式
[root@node1 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33  //修改网卡配置文件
[root@node1 ~]#  systemctl restart network

4.测试内外网能否相关访问

点击查看代码
测试一下7-1和7-3能否互相访问:
[root@node1 ~]#  curl 192.168.204.30
7-3 7-3

[root@web1 ~]#  curl 12.0.0.100
7-1 7-1

注意:只是模拟环境中能够相互访问,外网机器的访问日志中出现的是内网地址,实际不可能存在。
所以要做SNAT,将内网机器的源地址由内网转换为公网。

5.7-2 网关服务器添加防火墙策略

点击查看代码
7-2添加防火墙策略
写法1:固定的公网IP地址
[root@node2 ~]# iptables -t nat -A POSTROUTING -s 192.168.204.0/24 -o ens36 -j SNAT --to 12.0.0.1
//将源地址为192.168.204.0段的私网地址 全部转化为网关地址

写法2:公网IP地址不固定
[root@node2 ~]# iptables -t nat -A POSTROUTING -s 192.168.204.0/24 -o ens36 -j MASQUERADE
//如果地址不固定可以设置 伪装

6.验证日志

点击查看代码
验证:
[root@web1 ~]#  curl 12.0.0.100   //7-3访问7-1
7-1 7-1

[root@node1 ~]#  tail -f /var/log/httpd/access_log   //此时7-1的日志中新增一条12.0.0.1的访问记录
127.0.0.1 - - [23/May/2024:10:31:16 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.204.30 - - [23/May/2024:10:56:57 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
12.0.0.1 - - [23/May/2024:11:11:41 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
//最后一行出现的是公网地址,SANT实验成功

2.DNAT

2.1 DNAT原理与应用
DNAT原理:目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映谢。
DNAT应用环境:在Internet中发布位于局域网内的服务器
2.2 DNAT转换前提条件

  • 局域网的服务器能够访问Internet
  • 网关的外网地址有正确的DNS解析记录
  • Linux网关开启IP路由转发

2.3 DNAT 实验

实验环境:

  • centos7-1 (外网服务器) ens33 IP地址(仅主机):12.0.0.100
  • centos7-2 (网关服务器) ens33 IP地址(nat):192.168.204.20 ;ens36 IP地址(仅主机):12.0.0.1
  • centos7-3 (内网服务器) ens33 IP地址(nat):192.168.204.30

实验效果:

  • 7-1能访问公网地址12.0.0.1,访问12.0.0.1等于访问192.168.204.30

实验步骤:

点击查看代码
添加规则前:
[root@node1 ~]#  curl 12.0.0.1            //外网无法访问公网
curl: (7) Failed connect to 12.0.0.1:80; 拒绝连接

添加规则:
[root@node2 ~]# iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.204.30
//从 ens36 网卡进入的流量,目的地址是12.0.0.1的并且访问tcp的 目的端口是80的流量,就跳转到 192.168.204.30

添加规则后:
[root@node1 ~]#  curl 12.0.0.1     //可以访问
7-3 7-3

标签:network,SNAT,192.168,12.0,Linux,node1,curl,root,DNAT
From: https://www.cnblogs.com/leikj/p/18222444

相关文章

  • linux + 裸核
     关键在于代码存放地址和启动方式 1.代码装载:可以利用ld文件和BOOT.bin重载也可以利用u-boot搬运  2.linux内存区域划分设备树,亲测linux,usable-memory可以分隔u-boot和kernel的空间分布 3.启动,u-boot正常启动cpu0(设备树需要maxcpus=1)另调用sev启动CPU1......
  • Notes: Understanding the linux kernel Chapter 9 Process Address Space
    ProcessAddressSpaceWhenaUserModeprocessasksfordynamicmemory,itdoesn’tgetadditionalpageframes;instead,itgetstherighttouseanewrangeoflinearaddresses,whichbecomepartofitsaddressspace.Thisintervaliscalleda“memoryre......
  • Linux防火墙基础
    一、安全技术和防火墙1.安全技术入侵检测系统(lntrusionDetectionSystems)入侵防御系统(lntrusionPreventionSystem)防火墙(Firewalld)防水墙(Waterwall)2.防火墙分类按保护范围划分:主机防火墙:服务范围为当前一台主机网络防火墙:服务范围为防火墙一侧的局域网按实现方式......
  • linux零拷贝
    什么是零拷贝零拷贝(Zero-Copy)就是一种避免CPU将数据从一块存储拷贝到另外一块存储的技术,是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝的好处避免操作系统内核缓冲区之间进行数据拷贝操作避免操作系统内核和用户应用程序地址空间这两者之间进......
  • mac,linux 查看文件编码
    查看文件编码可以通过以下几种方式:在类unix编程时,在读取文本的时候会遇到文本的编码问题,这时候就要查看文件内容的编码了,下面是查看编码的几种方式1.在Vim中可以直接查看文件编码:setfileencoding即可显示文件编码格式。如果你只是想查看其它编码格式的文件或者想解决用Vim......
  • Linux 内核启动流程
    链接脚本vmlinux.lds示例代码36.1.1vmlinux.lds链接脚本492OUTPUT_ARCH(arm)493ENTRY(stext)494jiffies=jiffies_64;495SECTIONS496{497/*498*XXX:Thelinkerdoesnotdefinehowoutputsectionsare499*assignedtoinputsectionswhentherearem......
  • linux磁盘分区
    磁盘分区在Linux中,磁盘是通过分区来使用的。分区是将一个硬盘划分成几个逻辑部分来使用,在每个分区中可以使用不同的文件系统。因此,在挂载磁盘之前,我们需要先对磁盘进行分区。磁盘分区的过程可以通过命令行工具或图形界面工具来完成。常用的磁盘分区工具有:cfdisk:命令行工具,适用......
  • 三、Linux系统收发网络包
    学习自[小林coding]学习自小林coding仅用来学习。网络模型OSI网络模型:开放式系统互联通信参考模型使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题。TCP/IP模型更为常见。应用层:负责向用户提供一组应用程序,如HTTP\DNS\FTP传输层:负责端到端......
  • Red Hat Enterprise Linux (RHEL) 8.10 发布 - 红帽企业 Linux 8 完美终结版
    RedHatEnterpriseLinux(RHEL)8.10(x86_64,aarch64)-红帽企业Linux红帽企业Linux8完美终结版请访问原文链接:RedHatEnterpriseLinux(RHEL)8.10(x86_64,aarch64)-红帽企业Linux,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2024年5月......
  • Qt window和Linux通过进程名称判断是否有进程存在
    boolCommFunction::isProcessRunning(constQString&processName){QProcessprocess;#ifdefWIN32process.start("tasklist",QStringList()<<"/FI"<<"IMAGENAMEeq"+processName);process.waitForF......