基于SNAT和DNAT实现内网发布服务和内网服务器上网功能

项目架构图

 

项目描述

使用DNAT技术实现发布内网的服务(ssh、dns、nginx),使用SNAT技术实现内网的机器上网功能,构建一个基于SNAT和DNAT的发布内网服务和上网的集群项目。

项目环境

7台Linux服务器(centos 7.9)、dhcp、nginx 1.25.2、mysql-5.7.41、bind

ip地址规划

serverIP
firewallwan口:192.168.2.188  lan口:192.168.50.254
dhcp 192.168.50.20
dns192.168.50.30
nginx192.168.50.40
mysql192.168.50.50
Springboard192.168.50.60
client-test192.168.50.70

关闭selinux和firewalld

# 防火墙并且设置防火墙开启不启动
systemctl stop firewalld && systemctl disable firewalld
 
# 临时关闭seLinux
setenforce 0
 
# 永久关闭seLinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

修改主机名

hostnamectl set-hostname firewall
hostnamectl set-hostname dhcp
hostnamectl set-hostname dns
 
hostnamectl set-hostname nginx
hostnamectl set-hostname mysql

hostnamectl set-hostname Springboard
hostnamectl set-hostname client-test

项目步骤

一、搭建防火墙服务器,开启SNAT和DNAT功能,实现内网服务器的服务发布和上网功能

1.给Linux网关服务器2块网卡配置ip地址

关闭虚拟机 --》添加一块网卡

2.得到网卡ens37的配置文件

[root@firewall ~]# cd /etc/sysconfig/network-scripts/
 
[root@firewall network-scripts]# cp ifcfg-ens33 ifcfg-ens37
# 因为前面新添加的网卡名字就是ens37,所以使用ens37
 
[root@firewall network-scripts]# ls
ifcfg-ens33  ifdown       ifdown-ippp  ifdown-post    ifdown-sit       ifdown-tunnel  ifup-bnep  ifup-ipv6  ifup-plusb  ifup-routes  ifup-TeamPort  init.ipv6-global
ifcfg-ens37  ifdown-bnep  ifdown-ipv6  ifdown-ppp     ifdown-Team      ifup           ifup-eth   ifup-isdn  ifup-post   ifup-sit     ifup-tunnel    network-functions
ifcfg-lo     ifdown-eth   ifdown-isdn  ifdown-routes  ifdown-TeamPort  ifup-aliases   ifup-ippp  ifup-plip  ifup-ppp    ifup-Team    ifup-wireless  network-functions-ipv6

3.编辑网卡接口配置文件

配置WAN口的网卡ens37的ip,注意:WAN口配置网关和dns,网卡类型为桥接模式
[root@firewalld network-scripts]# cat ifcfg-ens37
BOOTPROTO=none
NAME=ens37 
DEVICE=ens37
ONBOOT=yes 
IPADDR=192.168.2.188
GATEWAY=192.168.2.1 
NETMASK=255.255.255.0 
DNS2=114.114.114.114 
 
配置LAN口的网卡ens33的ip,注意:LAN口里不配置网关和dns,网卡类型为仅主机模式
[root@firewalld network-scripts]# cat ifcfg-ens33
BOOTPROTO=none
NAME=ens33 
DEVICE=ens33
ONBOOT=yes 
IPADDR=192.168.50.254
NETMASK=255.255.255.0 

重启网络服务
[root@server network-scripts]# service network restart
Restarting network (via systemctl):                        [  确定  ]


[root@server network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:62:e8:d0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.254/24 brd 192.168.50.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe62:e8d0/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:62:e8:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.188/24 brd 192.168.2.255 scope global noprefixroute ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe62:e8da/64 scope link 
       valid_lft forever preferred_lft forever

4.开启SNAT和DNAT功能

编写脚本,实现SNAT和DNAT功能
[root@firewall nat]# cat snat_dnat.sh 
#!/bin/bash
 
#开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
 
#清除防火墙规则
iptables -F
iptables -t nat -F
 
#开启snat功能
iptables -t nat -A POSTROUTING -s 192.168.50.0/24  -o ens37 -j SNAT --to-source 192.168.2.188
 
#开启dnat功能
iptables -t nat -A PREROUTING -i ens37 -d 192.168.2.188 -p tcp --dport 22 -j DNAT --to-destination 192.168.50.60

iptables -t nat -A PREROUTING -i ens37 -d 192.168.2.188 -p tcp --dport 53 -j DNAT --to-destination 192.168.50.30
 
iptables -t nat -A PREROUTING -i ens37 -d 192.168.2.188 -p tcp --dport 80 -j DNAT --to-destination 192.168.50.40

二、搭建跳板机,建立免密通道,通过跳板机去访问内网的其他服务器

1.跳板机服务器上生成密钥对
[root@Springboard .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:RwPsvRYZ/cRdqUv2JVlFKQovTUsDb+3B+27izeinC8c root@Springboard
The key's randomart image is:
+---[RSA 2048]----+
|       ..... . oO|
|        .oo++.ooo|
|       . .O=+*oo |
|        .o=*.+* .|
|        S ooooo..|
|         .o .... |
|         . . E . |
|            o.=o |
|            o**+ |
+----[SHA256]-----+
[root@Springboard .ssh]# ls
id_rsa  id_rsa.pub

2.上传公钥到其他服务器的root用户家目录下
ssh-copy-id  -i id_rsa.pub root@192.168.50.20
ssh-copy-id  -i id_rsa.pub root@192.168.50.30
ssh-copy-id  -i id_rsa.pub root@192.168.50.40
ssh-copy-id  -i id_rsa.pub root@192.168.50.50

3.内网服务器开启黑白名单,只能跳板机ssh到内网服务器
[root@nginx etc]# cat /etc/hosts.deny 
sshd:192.168.50.60

[root@nginx etc]# cat /etc/hosts.allow
sshd:all

三、部署dns服务器,为整个集群提供域名解析功能,部署dhcp服务器,为整个集群分配IP地址

1.部署dns服务器

1.安装软件bind
yum install bind* -y
 
2.设置named服务开机启动,启动DNS服务
systemctl enable named && systemctl start named 
 
3.查看进程和端口号
ps aux|grep named
 
netstat -anplut|grep named
 
4.修改/etc/named.conf配置文件,重启服务允许其他电脑能过来查询dns域名
[root@dns ~]# vim /etc/named.conf
options {
        listen-on port 53 { any; };  # 修改
        listen-on-v6 port 53 { any; }; # 修改
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; }; # 修改
 
重启named服务
[root@dns ~]# service named restart 
Redirecting to /bin/systemctl restart named.service
 
 
5.修改配置文件,告诉named为sc.com提供域名解析
[root@dns named]# vim /etc/named.rfc1912.zones 
 
zone "sc.com" IN {
        type master;
        file "sc.com.zone";
        allow-update { none; };
};
 
6.创建sc.com.zone的数据文件
[root@dns named]# pwd
/var/named
 
[root@dns named]# ls
chroot  chroot_sdb  data  dynamic  dyndb-ldap  named.ca  named.empty  named.localhost  named.loopback  
 
[root@dns named]# cp -a  named.localhost sc.com.zone
[root@dns named]# ls
chroot  chroot_sdb  data  dynamic  dyndb-ldap  named.ca  named.empty  named.localhost  named.loopback  sc.com.zone  
 
7.编写sc.com.zone
[root@dns named]# cat sc.com.zone 
$TTL 1D
@ IN SOA  @ rname.invalid. (
          0 ; serial
          1D  ; refresh
          1H  ; retry
          1W  ; expire
          3H )  ; minimum
  NS  @
  A 127.0.0.1
  AAAA  ::1
www   A   192.168.50.40

 
[root@dns named]# named-checkzone sc.com  /var/named/sc.com.zone
zone sc.com/IN: loaded serial 0
OK
 
[root@dns named]# service named restart
 
8.所有机器上将dns服务器指向我们搭建的dns服务器
cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.50.30
 
9.使用host查看是否能进行域名解析
[root@dns named]# host www.sc.com
www.sc.com has address 192.168.50.40

2.部署dhcp服务器

yum install dhcp -y

[root@dhcp ~]# cd /etc/dhcp
[root@dhcp dhcp]# ls
dhclient.d  dhclient-exit-hooks.d  dhcpd6.conf  dhcpd.conf  scripts

[root@dhcp dhcp]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example  /etc/dhcp/dhcpd.conf
cp:是否覆盖"/etc/dhcp/dhcpd.conf"? y

编辑配置文件
只保留以下这段配置,搭建一个最简单的dhcp服务器。
[root@dhcp dhcp]# cat dhcpd.conf 
# dhcpd.conf
log-facility local7;
 
# A slightly different configuration for an internal subnet.
subnet 192.168.50.0 netmask 255.255.255.0 {
  range 192.168.50.2 192.168.50.100;
  option domain-name-servers 114.114.114.114;
  option routers 192.168.50.254;
  default-lease-time 600;
  max-lease-time 7200;
}
 
# 启动dhcp服务
[root@dhcp dhcp]# service dhcpd start
Redirecting to /bin/systemctl start dhcpd.service

关闭VMware虚拟机的dhcp服务

DHCP服务器查看分配的ip地址
cat /var/lib/dhcpd/dhcpd.leases

四、部署mysql服务器,给整个集群提供数据支持

1.下载源码包

2.编写安装脚本
[root@mysql mysql]# cat install_mysql.sh
#!/bin/bash
 
#安装相关依赖
yum  install cmake ncurses-devel gcc  gcc-c++  vim  lsof bzip2 openssl-devel ncurses-compat-libs -y
 
#解压mysql二进制安装包
tar  xf  mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz
 
#移动解压后的文件到/usr/local下改名叫mysql
mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql
 
#新建组和用户mysql
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
 
#新建存放数据的目录
mkdir  /data/mysql -p
 
#修改/data/mysql目录的权限归mysql用户和mysql组所有
chown mysql:mysql /data/mysql/
chmod 750 /data/mysql/
 
#进入/usr/local/mysql/bin目录
cd /usr/local/mysql/bin/
 
#初始化mysql
./mysqld  --initialize --user=mysql --basedir=/usr/local/mysql/  --datadir=/data/mysql  &>passwd.txt
 
#获得临时密码
tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
 
#临时修改PATH变量的值
export PATH=/usr/local/mysql/bin/:$PATH
 
#复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
cp  ../support-files/mysql.server   /etc/init.d/mysqld
 
#修改/etc/init.d/mysqld脚本文件里的datadir目录的值
sed  -i '70c  datadir=/data/mysql'  /etc/init.d/mysqld
 
#生成/etc/my.cnf配置文件
cat  >/etc/my.cnf  <<EOF
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m  mysql>
EOF
 
#修改内核的open file
echo "ulimit -n 1000000"  >>/etc/rc.local
 
chmod +x /etc/rc.d/rc.local
 
#启动mysqld进程
service mysqld start
 
#将mysqld添加到linux系统里服务管理名单里
/sbin/chkconfig --add mysqld
 
#设置mysqld服务开机启动
/sbin/chkconfig mysqld on
 
#初次修改密码需要使用--connect-expired-password 选项 修改root用户的密码为Sanchuang123#
mysql -uroot -p$tem_passwd --connect-expired-password   -e  "set password='Sanchuang123#';"
 
#检验修改密码是否成功,如果有输出能看到mysql里的数据库,说明成功。
mysql -uroot -p'Sanchuang123#'  -e "show databases;"

3.执行脚本
bash  install_mysql.sh

五、搭建nginx服务器,提供web服务

1.编写一键安装nginx脚本
[root@nginx ~]# cat onekey_install_nginx.sh 
#!/bin/bash
 
#新建一个文件夹用来存放下载的nginx源码包
mkdir -p /nginx
cd /nginx
 
#新建用户
useradd hanwei -s /sbin/nologin
 
#下载nginx源码包
yum install wget -y
wget http://nginx.org/download/nginx-1.25.2.tar.gz
 
#解压nginx源码包
tar xf  nginx-1.25.2.tar.gz
 
#解决依赖关系
yum -y install  openssl openssl-devel pcre pcre-devel gcc autoconf automake make
 
#编译前的配置
./configure  --prefix=/usr/local/scnginx99  --user=hanwei  --with-threads  --with-http_ssl_module  --with-http_v2_module --with-http_stub_status_module --with-stream
 
#编译,开启2个进程同时编译,速度会快些
make -j 2
 
#安装
make install
 
#启动nginx
/usr/local/scnginx99/sbin/nginx
 
#修改PATH变量
PATH=$PATH:/usr/local/scnginx99/sbin/
echo "PATH=$PATH:/usr/local/scnginx99/sbin/" >>/root/.bashrc
 
#设置nginx开机启动
echo "/usr/local/scnginx99/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
 
#关闭seLinux和firewalld
systemctl stop firewalld
#设置firewalld开机不启动
systemctl disable firewalld
 
#临时关闭seLinux
setenforce 0
#永久关闭seLinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config

2.执行脚本
bash  onekey_install_nginx.sh 

六、测试访问,使用Linux机器和windows机器ssh到跳板机,然后从跳板机上ssh到内网的服务器

1.直接ssh内网的服务器被拒绝
[root@client-test ~]# ssh root@192.168.50.40
ssh_exchange_identification: read: Connection reset by peer

[root@client-test ~]# ssh root@192.168.50.60
The authenticity of host '192.168.50.60 (192.168.50.60)' can't be established.
ECDSA key fingerprint is SHA256:NBsWUhu420ovbAZK0X5wAZHZYqrr5H7ilrqNbGka5UU.
ECDSA key fingerprint is MD5:0b:21:ef:0f:43:8a:9e:ac:c5:48:46:36:40:e4:13:65.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.50.60' (ECDSA) to the list of known hosts.
root@192.168.50.60's password: 
Last login: Sun Aug 27 12:42:58 2023 from 192.168.50.70


2.先ssh到跳板机,然后从跳板机上ssh到内网的服务器
[root@Springboard ~]# ssh root@192.168.50.40
The authenticity of host '192.168.50.40 (192.168.50.40)' can't be established.
ECDSA key fingerprint is SHA256:BoRg+sAchJqF/jNZkvAiRZX9rShMM6mGmgl+ZMuAQ8s.
ECDSA key fingerprint is MD5:cc:51:64:1d:dc:ee:b3:0a:86:90:82:94:76:f2:10:2d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.50.40' (ECDSA) to the list of known hosts.
root@192.168.50.40's password: 
Last login: Sun Aug 27 12:13:52 2023 from 192.168.50.60
[root@nginx ~]# exit
登出
Connection to 192.168.50.60 closed.

windows上测试

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩未零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值