基于iptables的SNAT+DNAT+docker服务器集群搭建

article/2025/9/15 21:00:39

什么是SNAT?

SNAT用于局域网访问互联网,局域网的主机A想访问互联网上的主机C,首先要将数据包发送到防火墙所在的主机B,B收到后修改数据包的源地址为B机的公网IP,然后再发送到互联网。

C机收到后将回应包经互联网发送给B,B收到回应包之后修改回应包的目的地址为A,然后将数据包转发给A。

至此就是SNAT的完整过程,在这个过程中,修改了请求报文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域网访问互联网。

而DNAT(destination NAT POSTROUTING),修改了请求报文的目标地址,用于互联网访问局域网。

什么是DNAT?

Destination Network Address Translation

应用场景:在Internet中发布位于企业局域网内的服务器

原理

目的地址转换

修改数据包的目标IP地址

wKiom1NSBfXio3miAAJfNlUUjpY396.jpg (690×371) (51cto.com)

基于iptables的SNAT+DNAT+docker服务器集群搭建介绍

项目名称:基于iptables的SNAT+DNAT+docker服务器集群搭建

项目环境:CentOS 8.3,docker 20.10.8,Mysql 8.0

项目描述:模拟企业环境,构建并发布内网服务器,并让内网服务器可以上网,使用docker快速部署并搭建自己的web和MySQL应用

项目步骤:

  1. 规划整个项目的拓扑网络结构和IP地址
  2. 初始化3台服务器的系统,并根据拓扑图的规划配置ip地址,并初始化docker软件
  3. 实现SNAT方法让内网的服务器可以安全上网
  4. 在网关服务器上基于DNAT策略修改并更新IP配置文件,同时开启路由功能
  5. 在内网服务器上使用docker快速启动Nginx和MySQL容器
  6. 测试整个发布的效果

项目心得:

  • 对SNAT和DNAT的认识更加深刻

  • 对docker容器的概念与应用有了更深的理解,能够很好地使用docker进行应用的快速部署

  • 对集群的概念有了更深的认识,认识到集群的优势就是能够更加合理地分配资源

一、机器配置

如下图做机器配置:

其中Web-server,Mysql-server和Linux网关服务器分别为三台系统为CentOS的虚拟机

具体修改IP地址,添加网卡的操作可以参考笔者之前的博文:

注意,初始配置完成之后集群的状态应当是:

Web-server、Mysql-server不能联网,也就是ping不通www.baidu.com的状态

而Linux网关服务器可以联网

二、SNAT实现

各机器全部配置好之后,在网关服务器上运行snat.sh脚本如下:

#!/bin/bash#临时开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward#临时关闭selinux
setenforce 0
#临时关闭firewalld
service firewalld stop#清除filter表和nat表里的防火墙规则
iptables -F
iptables -t nat -F
iptables -P INPUT ACCEPT#snat策略,将进入的LAN口网段(192.168.170.0)包装成出去的WAN口网段(192.168.2.15)
iptables -t nat -A POSTROUTING -s 192.168.170.0/24 -o ens33 -j SNAT --to-source 192.168.2.15

运行之后web和mysql-server即可ping通,能够联网

再查看一下策略

iptables -t nat -L -n

三、启动容器

3.1 在web-server上启动docker的nginx容器

docker run -d --name sc-nginx-2 -p 80:80 nginx

测试

[root@web ~]# netstat -anplut|grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3411/docker-proxy   
tcp6       0      0 :::80                   :::*                    LISTEN      3415/docker-proxy   

成功

3.2 在mysql-server上启动docker的mysql容器

docker run -d --name mysql1 -e MYSQL_ROOT_PASSWORD='123456' -p 3306:3306 mysql

测试

[root@web ~]# mysql -uroot -p123456 -h 192.168.170.2
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 

成功

四、DNAT实现

然后在主机上运行dnat.sh脚本如下:

#!/bin/bash#临时开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward#临时关闭selinux
setenforce 0
#临时关闭firewalld
service firewalld stop#dnat to web
iptables -t nat -A PREROUTING -d 192.168.2.15 -p tcp --dport 80 -j DNAT --to-destination 192.168.170.1:80
#dnat to mysql
iptables -t nat -A PREROUTING -d 192.168.2.15 -p tcp --dport 3306 -j DNAT --to-destination 192.168.170.2:3306

查看一下策略

iptables -t nat -L -n

最终nat表如下:

[root@server ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            192.168.2.15         tcp dpt:80 to:192.168.170.1:80
DNAT       tcp  --  0.0.0.0/0            192.168.2.15         tcp dpt:3306 to:192.168.170.2:3306Chain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.170.0/24     0.0.0.0/0            to:192.168.2.15Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

最后的验证

五、验证web-server

在web-server中进入nginx容器做如下修改(不修改也可以,但是只能看到nginx默认页面)

[root@web ~]# docker exec -it web1 /bin/bash
root@4240c605729f:/# cd /usr/share/nginx/html/
root@4240c605729f:/usr/share/nginx/html# ls
50x.html  index.html
root@4240c605729f:/usr/share/nginx/html# echo "welcome to liwenbin's home!" >index.html

在win10浏览器地址栏中输入192.168.2.15,得到效果图如下:

六、验证mysql-server

另开一台虚拟机,使用之前验证mysql-server容器是否启动的命令测试即可


http://chatgpt.dhexx.cn/article/TaTTLfyR.shtml

相关文章

springcloud高可用服务器集群搭建

服务器健壮是非常重要的, 但是有很多种原因可能会导致服务注册中心宕机,如果宕机就会有一些灾难性的问题出现,所以保证服务注册中心处于活着运行状态显得尤为重要!!! 我们必须保证,哪怕某些服…

redis5.0集群搭建(两台服务器)

redis5.0集群搭建(两台服务器) 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。 redis 采用 redis-5.0.2 版本。 两台虚拟机都是 CentOS ,一台 Centos7 (IP:192.168.1.20),一台 C…

分布式文件服务minio集群搭建

minio集群搭建过程记录 minio集群搭建1、服务器:2台服务器(存储数据目录不能是/root目录,否则会报错)2、从官网获取Minio二进制文件并上传至2台集群主机:3、创建目录(2台集群主机都执行)4、集群启动文件配置(2台集群主…

云服务器大数据高可用集群搭建-----hadoop篇

目录 一、集群配置二、集群规划三、Hadoop、Zookeeper、Java、Centos版本四、Linux配置4.1 主机名配置4.1.1 修改Linux主机名4.1.2 修改linux的hosts文件4.1.3 重启服务器4.1.4 修改windows的hosts文件 4.2防火墙配置4.3 设置普通用户4.4 免密登录4.5 创建安装目录和软件包存放…

云服务器搭建Hadoop集群

云服务器搭建Hadoop集群 一、配置服务器1. 创建普通用户2. 安装 Java 环境3.安装hadoop4.网络配置5.hadoop配置6.执行分布式实例 一、配置服务器 1. 创建普通用户 说明:由于 root 环境下操作比较危险,所以这里新建一个普通用户来进行 hadoop 的搭建。 …

ZooKeeper集群搭建

目录 1 搭建要求 2 准备工作 3 配置集群 4 启动集群 5 模拟集群异常 1 搭建要求 真实的集群是需要部署在不同的服务器上的,但是在我们测试时同时启动很多个虚拟机内存会吃不消,所以我们通常会搭建伪集群,也就是把所有的服务都搭建在一台…

(七)centos7案例实战——nginx+keepalived高可用服务器集群搭建

前言 本节内容延续之前的内容,往期博客已经介绍了如何安装nginx服务器以及将nginx安装成为一个系统服务,本节内容是在前期内容的基础上,搭建一个高可用的nginx服务器集群,主要使用Keepalived组件,实现高可用的nginx集…

多台云服务器的 Kubernetes 集群搭建

环境 两台或多台腾讯云服务器(本人搭建用了两台),都是 CentOs 7.6, master 节点:服务器为 4C8G,公网 IP:124.222.61.xxx node1节点:服务器为 4C4G,公网 IP&#xff1a…

基于slurm框架的GPU服务器集群搭建方法

基于slurm框架的GPU服务器集群搭建操作文档 1. 环境基础 2. 环境配置 2.1 hostname配置 2.2 关闭SELinux (master, slave) 2.3 关闭Firewall (master, slave) 2.4 配置ip与hostname映射关系 (master, slave1) 3. 创建munge和…

Tomcat服务器集群搭建

Tomcat服务器集群与负载均衡 一、前言 在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就有点显得有 点力不从心了。另外一个常见的问题是会产生单点故障…

Hadoop分布式集群搭建完整版(持续更新中)

1.前期准备工作 各类软件以及工具包下载 2.网络环境配置 2.1 打开 VMware 找到编辑,点击虚拟网络配置 2.2 点击第二行,然后更改设置 2.3 点击第三行VMnet8,把本地DHC服务将IP地址分配给虚拟机取消,配置子网,子网掩码&a…

保姆级教学——集群环境搭建及创建集群

保姆级教学——集群环境搭建及创建集群 新建虚拟机 一些默认,加载镜像开启虚拟机,在安装位置选择自己目录,然后建立分区,首先添加 挂载点,类型标准分区,文件系统ext4 加载分区,期望给2G, 类…

集群搭建完整版

集群搭建完整版 1.集群搭建的准备工作 1.克隆虚拟机 (要三台,创建一台 JDK、Hadoop 都安装完成的虚拟机,看 1.1 和 1.2) 2. 修改克隆虚拟机的静态 IP vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0 TYPEEthernet ON…

搭建服務器集群【3大注意事項】

简述 服务器集群是现时很多企业选用的建站科案选用技术, 为企业提供更稳定可靠的运作, 服务器出现超载或宕机也不会导致整个业务无法运作, 是企业服务器热备的不二之选, 我们为你一一说明一下 什么是服务器集群? 服务器集群指多台服务器集合及共同管理一个业务, …

通过vnc自动连接linux,通过VNC连接Linux远程桌面

因为特殊的需求关系,琢磨了一下如何在本地连接远程Linux主机的桌面环境。翻了不少网上的相关文章,大部分都只讲了步骤没有说为什么这么做,我就简单再复述一遍吧,加深一下印象。 环境如下: 本地:OS X 10.8.2…

Linux和Windows间的远程桌面访问

在Windows上面,我们都用过系统自带的远程桌面连接或者TeamViewer这样的工具,可以方便的让我们用图形化方式远程操作其他计算机。但是在Linux上,我们一般都是使用SSH来操作终端。那么在Linux上有没有一些工具可以让我们像Windows那样用图形化的…

Linux远程桌面初体验——todesk、向日葵终极对决

文章目录 前言一、使用环境及软件介绍二、使用步骤总结 前言 大家都知道,Linux桌面的功能很少被人使用,但目前包括但不限于红帽系的发行版本慢慢开始重视桌面环境,尤其是国产操作系统。今天我就来大家看一下国产操作系统下远程桌面的使用体验…

linux远程桌面连接

rdesktop这个软件 sudo apt-get install rdesktoprdesktop -g 1366*768 -P -z -x l -r sound:off -u username 192.168.123.5参数意义-g后面代表要使用的分辨率-P启用位图缓存-z启用RDP数据流压缩-x l使用局域网级别的图像质量-r sound:off关闭声音-u windowuser指定要使用的用…

Linux 远程桌面实现

硬件环境:树莓派3B 操作系统: Raspberry Jessie 安装xrdp服务(属于tightVNC服务的一部分) sudo apt-get install xrdp 安装完成后,输入如下命令: sudo /etc/init.d/xrdp start sudo update-rc.d xrdp de…

Linux配置VNC远程桌面

环境:CentOS7 VNC需要系统安装的有桌面,如果是生产环境服务器,安装时使用的最小化安装,那么进行下面操作按章GNOME 桌面。 # 列出的组列表里有GNOME Desktop。 yum grouplist #安装之 yum groupinstall -y "GNOME Desktop&…