计算机网络 day9 DNAT实验

目录

DNAT

DNAT策略的典型应用环境

DNAT策略的原理

在网关中使用DNAT策略发布内网服务器

DNAT实验:

实验环境:

DNAT网络规划拓扑图:

步骤:

1、创建linux客户端Web网站(go语言),实现Web服务器

1.1、下载go语言Web端代码

1.2、下载代码后传输到你的linux客户机上去

1.3、解压apiserver.tar.gz文件,并执行Web程序

1.4、测试Web服务器的效果(通过网关服务器来进行)

​编辑2、配置DNAT策略

2.1、准备工作

2.2、修改firewall网关服务器的姓名:

2.3、写DNS脚本

2.4、执行脚本

3、测试效果

4、使用dokcer上的nginx服务替代go语言程序

[4.1、docker安装下载,制作docker镜像:(120条消息) docker容器的介绍和安装 - 镜像安装_docket容器_Claylpf的博客-CSDN博客](#4.1、docker安装下载,制作docker镜像:(120条消息) docker容器的介绍和安装 - 镜像安装_docket容器_Claylpf的博客-CSDN博客)

4.1、访问nginx镜像

如何当我们访问firewall网关服务器的其他端口(假设是80端口)也能映射访问到我们的linux客户机的8000端口


DNAT

DNAT(Destination Network Address Translation)是一种NAT的实现方式 ,也被称为目的地址转换(Destination NAT) 。它在传输层对IP数据包进行修改,将目的IP地址改为内部网络中的设备IP地址,从而实现外部网络可以通过公共IP地址访问内部网络中的设备。 DNAT通常用于实现服务器对外提供服务的功能,例如将公共IP地址映射到内部网络中的Web服务器上,从而外部用户可以通过公共IP地址访问Web服务器。

DNAT策略的典型应用环境

在Internet中发布位于企业局域网内的服务器

DNAT策略的原理

目标地址转换,Destination Network Address Translation

修改数据包的目标IP地址

在网关中使用DNAT策略发布内网服务器

DNAT实验:

实验环境:

准备2台集群:一台做局域网里的客户机(Web服务器)(1个网卡),一台做firewall网关服务器(路由器)

所有的虚拟机的网卡模式选择桥接模式(客户机可以选择仅主机模式)

DNAT网络规划拓扑图:

步骤:

1、创建linux客户端Web网站(go语言),实现Web服务器

1.1、下载go语言Web端代码

go语言网站代码提取:

链接:https://pan.baidu.com/s/1QSulTw3P_lrp7RCHbHjhow?pwd=byp5
提取码:byp5

1.2、下载代码后传输到你的linux客户机上去

方式一(假设你的linux服务器没有联网,但是你的firewall网关服务器联网了)

先传输到网关服务器上去,再在网关服务器上使用scp命令传输给linux客户机

[root@nginx-lb1 ~]# scp apiserver.tar.gz 192.168.80.1:/root
The authenticity of host '192.168.80.1 (192.168.80.1)' can't be established.
ECDSA key fingerprint is SHA256:qFVcuGn/dPQWyNfiYIe376RJ2CZIyFnKFobW/2VQljo.
ECDSA key fingerprint is MD5:59:df:c1:dd:8d:c0:0a:a8:50:e5:15:b0:9f:2a:16:ff.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.80.1' (ECDSA) to the list of known hosts.
root@192.168.80.1's password: 
apiserver.tar.gz                                                                                                                                           100% 5121KB  73.9MB/s   00:00    
[root@nginx-lb1 ~]# 

方式二(联网的情况下)

使用xftp上传apiserver.tar.gz到linux服务器里 或者 使用lrzsz传输

yum  install lrzsz  -y

rz : 接收从windows机器里上传文件到linux机器 receive
sz: 接收从linux系统里发送文件到windows sent/send

[root@goweb ~]# rz     
然后选择需要上传的文件的路径

1.3、解压apiserver.tar.gz文件,并执行Web程序

[root@goweb ~]# mkdir /myweb
[root@goweb ~]# mv apiserver.tar.gz /myweb/
[root@goweb ~]# cd /myweb/
[root@goweb myweb]# ls
apiserver.tar.gz
[root@goweb myweb]# 
[root@goweb myweb]# tar xf  apiserver.tar.gz  解压
[root@goweb myweb]# ls
apiserver  apiserver.tar.gz
[root@goweb myweb]# cd apiserver 进入解压后的文件夹
[root@goweb apiserver]# ls
go.mod  go.sum  handler  main.go  router  scweb
[root@goweb apiserver]# 

#scweb 是使用go语言编写的简单的web服务器软件

[root@goweb apiserver]# ./scweb   执行scweb二进制程序
vim-go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> apiserver/router.home (3 handlers)
[GIN-debug] GET    /sd/health                --> apiserver/handler/sd.HealthCheck (3 handlers)
[GIN-debug] GET    /sd/disk                  --> apiserver/handler/sd.DiskCheck (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on 0.0.0.0:8000

scweb服务器会监听8000端口

1.4、测试Web服务器的效果(通过网关服务器来进行)

[root@nginx-lb1 ~]# curl 192.168.80.1:8000
hello,三创人 nice 2022[root@nginx-lb1 ~]# 

#curl  是linux系统里的字符界面的浏览器
#也可以使用其他图形界面的浏览器去访问

2、配置DNAT策略

2.1、准备工作

1、局域网的Web服务器正确设置了IP地址/子网掩码/DNS服务器

2、局域网的Web服务器正确设置了默认网关地址

3、创建Web框架,并确保Web服务已经在Web服务器上运行了

在linux网关服务器(防火墙)上操作

2.2、修改firewall网关服务器的姓名:

[root@prom-server ~]# hostnamectl  set-hostname  router
[root@prom-server ~]# su - root
su - root
上一次登录:一 7月 17 11:53:14 CST 2023从 192.168.2.134pts/0 上
[root@router ~]# 

2.3、写DNS脚本

[root@nginx-lb1 nat]# cat snat_dnat.sh 
#!/bin/bash

#开启路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward

#清除防火墙规则
iptables -F
iptables -F -t nat

#添加SNAT策略的防火墙规则
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 192.168.2.77

#添加DNAT策略的防火墙规则
iptables -t nat  -A PREROUTING   -d 192.168.2.77 -i ens33  -p tcp  --dport 8000  -j DNAT  --to-destination 192.168.80.1
[root@nginx-lb1 nat]# 

2.4、执行脚本

[root@router nat]# bash snat_dnat.sh 
Redirecting to /bin/systemctl stop firewalld.service
[root@router nat]# 

查看iptables是否生效

[root@nginx-lb1 nat]# iptables -L -t nat -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            192.168.2.77         tcp dpt:8000 to:192.168.80.1

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.80.0/24      0.0.0.0/0            to:192.168.2.77
[root@nginx-lb1 nat]# 

3、测试效果

使用浏览器访问linux网关服务器wan口的地址和8000端口
http://192.168.2.77:8000

4、使用dokcer上的nginx服务替代go语言程序

4.1、docker安装下载,制作docker镜像:(120条消息) docker容器的介绍和安装 - 镜像安装_docket容器_Claylpf的博客-CSDN博客

[root@claylpf apiserver]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
faef57eae888: Pull complete 
76579e9ed380: Pull complete 
cf707e233955: Pull complete 
91bb7937700d: Pull complete 
4b962717ba55: Pull complete 
f46d7b05649a: Pull complete 
103501419a0a: Pull complete 
Digest: sha256:08bc36ad52474e528cc1ea3426b5e3f4bad8a130318e3140d6cfe29c8892c7ef
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@claylpf apiserver]# dokcer images
bash: dokcer: command not found...
Similar command is: 'docker'
[root@claylpf apiserver]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    021283c8eb95   12 days ago   187MB
[root@claylpf apiserver]# docker run -d -p 8000:80 --name cly-nginx nginx
a3e47da286fd588c51297374480ee842942781e4752e488e2626e69143db4d92
[root@claylpf apiserver]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
a3e47da286fd   nginx     "/docker-entrypoint...."   6 seconds ago   Up 5 seconds   0.0.0.0:8000->80/tcp, :::8000->80/tcp   cly-nginx
[root@claylpf apiserver]# 

4.1、访问nginx镜像

如何当我们访问firewall网关服务器的其他端口(假设是80端口)也能映射访问到我们的linux客户机的8000端口

如下拓扑图就很生动的展示了我们的IP包通过firewall网关服务器的时候,IP包内的目的地址发生了改变,还有TCP段的端口也发生了改变。

#通过访问192.168.1.254:8000端口 访问到 192.168.2.80的8000端口
iptables -t nat  -A PREROUTING   -d 192.168.1.254 -i ens33  -p tcp  --dport 8000  -j DNAT  --to-destination 192.168.2.80


#通过访问192.168.1.254的80端口 访问到 192.168.2.80的8000端口
iptables -t nat  -A PREROUTING   -d 192.168.1.254 -i ens33  -p tcp  --dport 80  -j DNAT  --to-destination 192.168.2.80:8000

可以浅显的理解为:当我们使用Windows上的浏览器想要访问我们的A客户机的Web服务的时候,我们需要访问浏览器的http://192.168.2.1:80,可知我们访问的正是firewall网关服务器WAN口的IP地址和端口80,而我们的firewall网关服务器会帮助我们修改IP包中的:

  1. 目标 IP 地址(Destination IP Address) :防火墙网关服务器会将数据包的目标 IP 地址 (原来是firewall网关服务器的WAN口的IP地址,也就是192.168.2.1)修改为内网服务器 (linux客户机)的 IP 地址(192.168.1.1),以实现数据包的转发到内网(局域网)。

  2. 目标端口号(Destination Port) :如果进行端口映射,防火墙网关服务器可以将数据包的目标端口号 (原来是firewall的网关服务器的80端口)修改为内网服务器 (linux客户机)上相应服务的监听端口(我们开启的监听端口为8000端口),以确保数据包能够正确地被内网服务器接收。

相关推荐
州周29 分钟前
Ftp目录整个下载
linux·服务器·数据库
中科岩创37 分钟前
中科岩创边坡自动化监测解决方案
大数据·网络·物联网
冷曦_sole1 小时前
linux-19 根文件系统(一)
linux·运维·服务器
AI大模型学徒1 小时前
Linux(二)_清理空间
linux·运维·服务器
花鱼白羊1 小时前
TCP Vegas拥塞控制算法——baseRtt 和 minRtt的区别
服务器·网络协议·tcp/ip
PyAIGCMaster1 小时前
文本模式下成功。ubuntu P104成功。
服务器·数据库·ubuntu
brrdg_sefg2 小时前
WEB 漏洞 - 文件包含漏洞深度解析
前端·网络·安全
CHENGlady4 小时前
传输层协议分析头歌
计算机网络
shelby_loo5 小时前
使用 Docker 在 Ubuntu 下部署 Cloudflared Tunnel 服务器
服务器·ubuntu·docker