热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

家里ADSL上网无固定外网IP的群晖NAS安全实现与公网MySQL服务器主从同步

家里ADSL上网,没有办法分配固定外网IP,现在想使用群晖自带的MariaDB安全实现与公网MySQL服务器主从同步。最大的问题实际上是如果暴漏MySQL服务器的端口,但是不限制来


家里 ADSL 上网,没有办法分配固定外网 IP ,现在想使用群晖自带的 MariaDB 安全实现与公网 MySQL 服务器主从同步。


最大的问题实际上是如果暴漏 MySQL 服务器的端口,但是不限制来源 IP 地址的话,会造成非常大的安全隐患。


但是, ADSL 恰恰不能提供固定的 IP 地址,我们需要解决这个问题。如果通过在公网数据库服务器上搭建 OpenVPN 服务器的方式,我们恰恰可以把内外网的设备影射到同一个子网中,而且 OpenVPN 提供的加密服务支持,刚刚好满足我们的安全需求。


1. 参考 Ubuntu架设OpenVPN实现内网穿透 搭建整个的 OpenVPN 服务器。映射完成后,设备上会新增一个名为 tun0 的网卡设备。同时所有连接到 VPN 服务器的设备都被被影射到 10.8.0.X 的网段。 公网服务器的地址默认是 10.8.0.1


2. 配置防火墙规则,许可来自指定网卡指定地址的设备的访问。注意,此处一定要指定网卡为 OpenVPN 创建的虚拟网卡,否则造成安全隐患。


$ export slave_ip=10.8.0.7
 
#删除可能已经存在的配置,避免出现多条重复记录
$ sudo iptables -D INPUT -i tun0 -p tcp -s $slave_ip --dport 3306 -j ACCEPT

#增加配置,只允许特定地址访问数据库端口
$ sudo iptables -I INPUT -i tun0 -p tcp -s $slave_ip --dport 3306 -j ACCEPT
 
$ sudo iptables -L -n -v

#保存配置
$ sudo apt-get install iptables-persistent

$ sudo netfilter-persistent save

#配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6这两个文件下面,
#最好确认一下实际保存的内容,尤其是安装了denyhosts等其他安全软件的情况下,
#可能会记录了多余的规则,需要手工删除

3. 参照 ubuntu 16.04配置基于SSL的MySQL主从同步 配置服务器


4. 接下来是群晖NAS的配置


首先是群晖服务器上没有 MySQL ,需要安装 MariaDB ,如下图:



安装完成后, Maria DB 10 的配置信息在 /var/packages/MariaDB10/etc/ 目录下面:


$ sudo touch /var/packages/MariaDB10/etc/my.cnf
 
# 权限必须是 644
$ sudo chmod 644 /var/packages/MariaDB10/etc/my.cnf
 
$ sudo vim /var/packages/MariaDB10/etc/my.cnf

里面的内容如下:


[mysqld]
# 绑定地址禁止外网访问,安全性
bind-address = 127.0.0.1
 
#设置server-id,必须唯一
server-id = 3
 
#日志也最好打开,暂时不要打开从服务的 bin log 目前群晖上目录权限存在问题
# log_bin                 = /var/log/packages/MariaDB10/mysql-bin.log
 
#如果日志开启了,最好把日志格式设置为row格式,这样如果主从数据不一致,可以尝试mysql flashback功能
# binlog-format    = row
 
#如果数据库是从5.7版本之前升级的,并且是wordpress那么会遇到无法更改数据库的情况,
#NO_ZERO_IN_DATE,NO_ZERO_DATE这两个参数限制的,我们需要去掉这个限制,原因在于
#wordpress创建的表中存在
#`comment_date` datetime(0) NOT NULL DEFAULT '0000-00-00 00:00:00',
#这样的定义是没办法进行后续的操作的,因此我们需要重新定义sql_mode来解除这个限制
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
 
 
# 不同步哪些数据库  
binlog-ignore-db = mysql
  
binlog-ignore-db = test  
 
binlog-ignore-db = information_schema

下载加密证书


$ export MDB_SSL=/var/packages/MariaDB10/etc/ssl
 
$ sudo mkdir $MDB_SSL
 
#从服务端获取证书
$ export PORT=22
 
$ export SERVER=10.8.0.1
 
$ export MS_LIB=/var/lib/mysql
 
$ sudo scp -P $PORT -r root@$SERVER:$MS_LIB/ca.pem $MDB_SSL/
 
$ sudo chown mysql:mysql $MDB_SSL/ca.pem
 
$ sudo scp -P $PORT -r root@$SERVER:$MS_LIBclient-cert.pem $MDB_SSL/
 
$ sudo chown mysql:mysql $MDB_SSL/client-cert.pem
 
$ sudo scp -P $PORT -r root@$SERVER:$MS_LIB/client-key.pem $MDB_SSL/
 
$ sudo chown mysql:mysql $MDB_SSL/client-key.pem
 
# 重启 MariaDB,有时候重启无效,此时请重启服务器
$ /usr/syno/bin/synopkg restart MariaDB

按照 ubuntu 16.04配置MySQL主从同步 进行服务器端的备份:


$ mysql -u root -p -e "CREATE USER 'repl1'@'10.8.0.7' IDENTIFIED BY 'slavepass';" #创建用户
 
#  select user,host from mysql.user;  查看创建的用户列表
#  set password for  'repl1'@'10.8.0.7' = password('pass'); 修改用户的密码
 
#分配权限
$ mysql -u root -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl1'@'10.8.0.7';"
 
#刷新权限
$ mysql -u root -p -e "flush privileges;"
 
# 获取主数据库的日志状态
$ mysql -u root -p -e "SHOW MASTER STATUS;"
Enter password:
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000664 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
 
# 执行备份
$ sudo bash backup_wordpress.sh

客户端执行恢复数据命令,如下:


# 出错日志查看 sudo tail -f /var/packages/MariaDB10/target/mysql/DS718.err
 
$ export PATH=/usr/local/mariadb10/bin/:$PATH
 
$ export SERVER=10.8.0.1
 
$ scp -P 22 -r root@$SERVER:~/wordpress.*.sql ./
 
#删除可能存在的一行警告信息,这行警告信息可能导致我们无法恢复数据
$ sed -i "/^mysqldump: \[Warning\] Using a password on the command line interface can be insecure\./d" wordpress.*.sql
 
$ mysql -u root -p -e "stop slave;"
 
$ mysql -u root -p -e "drop database wordpress;"
 
$ mysql -u root -p -e "create database wordpress;"
 
$ mysql -u root -p wordpress  
$ mysql -u root -p -e "stop slave;"
 
#修改同步信息
$ mysql -u root -p -e "CHANGE MASTER TO MASTER_HOST='10.8.0.1', MASTER_USER='repl1', MASTER_PASSWORD='slavepass', MASTER_LOG_FILE='mysql-bin.000664',MASTER_LOG_POS=154 ,master_ssl=1,master_ssl_ca='/var/packages/MariaDB10/etc/ssl/ca.pem', master_ssl_capath='/var/packages/MariaDB10/etc/ssl', master_ssl_cert='/var/packages/MariaDB10/etc/ssl/client-cert.pem', master_ssl_key='/var/packages/MariaDB10/etc/ssl/client-key.pem';"
 
$ mysql -u root -p -e "start slave;"
 
#查看从库状态
$ mysql -u root -p -e "show slave status\G;"
Enter password:
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.8.0.1
                  Master_User: repl1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000664
          Read_Master_Log_Pos: 1266018
               Relay_Log_File: VM-xxx-xxx-xxxxx-relay-bin.000003
                Relay_Log_Pos: 162225
        Relay_Master_Log_File: mysql-bin.000664
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 174762
              Relay_Log_Space: 1188728
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /var/packages/MariaDB10/etc/ssl/ca.pem
           Master_SSL_CA_Path: /var/packages/MariaDB10/etc/ssl
              Master_SSL_Cert: //var/packages/MariaDB10/etc/ssl/client-cert.pem
            Master_SSL_Cipher:
               Master_SSL_Key: /var/packages/MariaDB10/etc/ssl/client-key.pem
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:

参考链接



  • ubuntu 16.04配置MySQL主从同步

  • linux iptables初步应用

  • ubuntu 16.04配置基于SSL的MySQL主从同步

  • 如何用 phpMyAdmin 来管理 Synology NAS 中的 MySQL/MariaDB 数据库

  • How to list all iptables rules with line numbers on Linux

  • 在 Synology NAS 中可对 MariaDB 设置进行自定义吗?

  • Synology(群辉) NAS Mariadb 配置文件修改

  • Mysql使用mysqldump和mysqlbinlog进行备份




推荐阅读
  • 1.ATP方式安装在ubuntu系统的apt软件仓库中,默认存在MySQL数据库,所以直接使用apt命令就可以安装。使用命令:aptapt-getin ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • shell脚本实战 pdf_Shell 脚本操作数据库实战
    安装mariadb数据库(默认没有密码,直接mysql即可进入数据库管理控制台)yuminstallmariadbmariadb-serv ... [详细]
  • Centos7安装MySql5.6
    如何在CentO ... [详细]
  • 阿里云主机实战应用之centos7上的防火墙设置
    最近公司又上了一台服务器,以前都是用centos6系统,这次选择使用了centos7系统的安装镜像,因为现在程序版本在centos7上一般php默认就是5.4以上的,mysql也 ... [详细]
  • centos7如何利用yum安装mysql 8.0.12
    这篇文章将为大家详细讲解有关centos7如何利用yum安装mysql8.0.12,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了CentOS7编译mysql8.0.12相关的知识,希望对你有一定的参考价值。步骤一:安装 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
  • PHP函数实现分页含文本分页和数字分页【PHP】
    后端开发|php教程PHP,分页后端开发-php教程最近,在项目中要用到分页。分页功能是经常使用的一个功能,所以,对其以函数形式进行了封装。影视网源码带充值系统,vscode配置根 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
author-avatar
mobiledu2502911415
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有