什么是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地址

基于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容器是否启动的命令测试即可

基于iptables的SNAT+DNAT+docker服务器集群搭建相关推荐

  1. 基于docker的集群搭建

    基于docker的集群搭建 2.3.2.1 环境准备 ​ 1.搭建docker ​ 要想在docker上搭建solr集群,首先安装docker的环境.这个就不再演示,如果没有学过docker的同学可以 ...

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

    基于slurm框架的GPU服务器集群搭建操作文档 1. 环境基础 2. 环境配置 2.1 hostname配置 2.2 关闭SELinux (master, slave) 2.3 关闭Firewall ...

  3. 正式环境docker部署hyperf_应用部署 - Docker Swarm 集群搭建 - 《Hyperf v1.1.1 开发文档》 - 书栈网 · BookStack...

    Docker Swarm 集群搭建 现阶段,Docker容器技术已经相当成熟,就算是中小型公司也可以基于 Gitlab.Aliyun镜像服务.Docker Swarm 轻松搭建自己的 Docker集群 ...

  4. Redis 多服务器集群搭建

    Redis 多服务器集群搭建 近期,想到之前使用的Redis集群测试使用的是单服务器上的伪集群,重温<Redis深度历险-核心原理与应用实践>的案例,觉得还是搭建一下多服务器集群来玩一玩会 ...

  5. Web服务器集群搭建

    Web服务器集群搭建 1.需求分析 1.1.整体需求 搭建一个高可用的网站服务器集群,能承受高并发请求,能抵御一般的网络攻击,任何一台服务器的退服不影响整个集群的运作,并且能对各服务器的运行情况作出实 ...

  6. Docker Swarm集群搭建以及服务命令等操作

    前言:之前都是采用rancher可视化管理工具进行管理K8S进一步管理容器,但是每次机器宕机后rancher中集群特别容易挂掉,出现的问题五花八门,在网上很难搜到解决方案,所以准备采用docker官方 ...

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

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

  8. netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现

    徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...

  9. 【Docker】docker swarm集群搭建和相关命令分享

    Docker swarm 集群通过 docker cli 来创建,并通过docker cli来实现应用的部署和集群的管理. Docker swarm集群的搭建相对简单,这里使用三台虚拟机(一个管理节点 ...

最新文章

  1. MySQL多实例的安装
  2. Appium 命令行安装教程
  3. (转)zookeeper理解
  4. Markdown学习测试.md
  5. Linux Cp 忽略报错信息,linux使用cp报错 Text file busy
  6. boost::gil::extend_boundary用法的测试程序
  7. ubuntu下安装php redis
  8. 「Python-Django」django 实现将本地图片存入数据库,并能显示在web上
  9. python自关联_django自关联,auth模块
  10. 解决seaborn绘制热力图使用科学记数法
  11. 任天堂连遭数据泄露,《动森》太火爆惊动黑客?
  12. jQuery数据与Attr?
  13. Swift面向对象基础(中)——Swift中的方法
  14. xshell 4无法保存新建session
  15. Struts2 教程 流程
  16. swfupload 无法加载_swfupload提示“错误302”的解决方法
  17. coverity java_coverity检测不到代码 | 学步园
  18. 网页设计常用色彩搭配表 - 配色表
  19. 用c语言反向输出5ge字符,C语言入门:05.scanf函数
  20. 【已解决】PEP 8: W292 no newline at end of file等相关PEP 8错误与警告

热门文章

  1. 面试问烂的 MySQL 查询优化,看完屌打面试官!
  2. 雅思备考-口语词组积累-第4章
  3. android 百度地图拖动定位,百度地图获取定位,实现拖动marker定位,返回具体的位置名...
  4. JSON.prase()使用报错
  5. 人工智能和机器学习如何影响金融服务?
  6. 数据与广告系列十九:推荐召回与广告LookAlike,万物皆可Embedding
  7. 传智播客JavaEE基础班+就业班全套资料
  8. SpringBoot 整合EasyExcel详解(一)-高性能Excel方案
  9. 【C/C++】蓝桥杯算法必刷题(一)目标ICPC铜/蓝桥杯国一
  10. axios 什么时候走then 方法;如何捕捉错误的状态码