目录
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、访问nginx镜像
如何当我们访问firewall网关服务器的其他端口(假设是80端口)也能映射访问到我们的linux客户机的8000端口
DNAT(Destination Network Address Translation)是一种NAT的实现方式,也被称为目的地址转换(Destination NAT)。它在传输层对IP数据包进行修改,将目的IP地址改为内部网络中的设备IP地址,从而实现外部网络可以通过公共IP地址访问内部网络中的设备。DNAT通常用于实现服务器对外提供服务的功能,例如将公共IP地址映射到内部网络中的Web服务器上,从而外部用户可以通过公共IP地址访问Web服务器。
在Internet中发布位于企业局域网内的服务器
目标地址转换,Destination Network Address Translation
修改数据包的目标IP地址
准备2台集群:一台做局域网里的客户机(Web服务器)(1个网卡),一台做firewall网关服务器(路由器)
所有的虚拟机的网卡模式选择桥接模式(客户机可以选择仅主机模式)
go语言网站代码提取:
链接:https://pan.baidu.com/s/1QSulTw3P_lrp7RCHbHjhow?pwd=byp5
提取码:byp5
方式一(假设你的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.
[email protected]'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
然后选择需要上传的文件的路径
[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端口
[root@nginx-lb1 ~]# curl 192.168.80.1:8000
hello,三创人 nice 2022[root@nginx-lb1 ~]#
#curl 是linux系统里的字符界面的浏览器
#也可以使用其他图形界面的浏览器去访问
1、局域网的Web服务器正确设置了IP地址/子网掩码/DNS服务器
2、局域网的Web服务器正确设置了默认网关地址
3、创建Web框架,并确保Web服务已经在Web服务器上运行了
在linux网关服务器(防火墙)上操作
[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 ~]#
[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]#
[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]#
使用浏览器访问linux网关服务器wan口的地址和8000端口
http://192.168.2.77:8000
[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]#
如下拓扑图就很生动的展示了我们的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包中的:
目标 IP 地址(Destination IP Address):防火墙网关服务器会将数据包的目标 IP 地址(原来是firewall网关服务器的WAN口的IP地址,也就是192.168.2.1)修改为内网服务器(linux客户机)的 IP 地址(192.168.1.1),以实现数据包的转发到内网(局域网)。
目标端口号(Destination Port):如果进行端口映射,防火墙网关服务器可以将数据包的目标端口号(原来是firewall的网关服务器的80端口)修改为内网服务器(linux客户机)上相应服务的监听端口(我们开启的监听端口为8000端口),以确保数据包能够正确地被内网服务器接收。