Linux端口复用工具sslh

sslh简介

sslh可以在同一端口上接受HTTP,HTTPS,SSH等多种协议的连接,然后转到其他不同的内部端口。
这样做的意义不仅是减少对外开放的端口数量,还能满足一些特殊的应用场合,如:

  • 实现网页和ssh共用443端口
  • 外部端口转内部端口的特殊应用

sslh安装

以centos为例:

yum install epel-release
yum install sslh

配置

安装好后,sslh的配置文件在/etc/sslh.conf。以两个示例说明配置方法

实现网页和ssh共用443端口

些配置假设nginx配置HTTPS监听的内部端口为8001。配置sslh监听443端口,将ssh的服务转到内部22端口,把其他443的访问转到8001端口:

# This is a basic configuration file that should provide
# sensible values for "standard" setup.

verbose: false;
foreground: true;
inetd: false;
numeric: false;
transparent: false;
timeout: 2;
user: "sslh";

# Change hostname with your external address name.
listen:
(
    { host: "0.0.0.0"; port: "443"; }
);

protocols:
(
     { name: "ssh"; service: "ssh"; host: "localhost"; port: "22"; },
     { name: "anyprot"; host: "localhost"; port: "8001"; }
);

外部端口转内部端口的特殊应用

如我需要将外部8003的访问都转到8883,可以用以下配置:

# Change hostname with your external address name.
listen:
(
    { host: "0.0.0.0"; port: "8003"; }
);

protocols:
(
     { name: "anyprot"; host: "localhost"; port: "8883"; }
);

开启sslh

因为sslh自带服务配置文件。所以直接用systemctl使能和启用便可:

systemctl enable sslh
systemctl start sslh

这样就启用SSLH了,且重启后服务也自动启动。

MySQL的基础操作

数据库

创建数据库

创建数据库my_db

mysql> CREATE DATABASE my_db;

删除数据库

删除数据库my_db

mysql> DROP DATABASE my_db;

查看数据库列表

mysql> show databases;

查看数据存放位置

mysql> show global variables like "%datadir%";

查看数据库编码

show variables like 'character_set_%';

可以看到如下结果:

character_set_client为客户端编码方式;
character_set_connection为建立连接使用的编码;
character_set_database数据库的编码;
character_set_results结果集的编码;
character_set_server数据库服务器的编码;

只要保证以上四个采用的编码方式一样,就不会出现乱码问题。

set character_set_client = xxxxx

用户管理

查看用户状态

mysql> use mysql;
mysql> select host,user from mysql.user;

创建用户

在localhost上创建上个名叫user_a,密码为a_password的用户:

mysql>create user user_a@'localhost' identified by 'a_password';

删除用户

删除localhost上的user_a用户

mysql> drop user user_a@'localhost';

查看权限

查看用户user_a的权限:

mysql> show grants for user_a;

赋予权限

赋予用户user_a在数据库my_db上的所有权限

mysql> grant all privileges on my_db.* to user_a@'localhost' identified by 'a_password';
mysql> flush privileges;

回收权限

回收user_a的所有权限

mysql> revoke all on *.* from user_a@'%';

设置用户密码

设置用户user_a的密码为new_passwd

mysql> set password for user_a = password('new_passwd'); 

Hex文件格式详解

Hex文件

Hex文件是可以烧录到MCU中,被MCU执行的一种文件格式。有EEPROM中的数据存储格式也与之类似。
如果用记事本打开可发现,整个文件以行为单位,每行以冒号:开头,内容为16进制码(ASCII码),如下示例所示:

:020000040008F2
:10000400FF00A0E314209FE5001092E5011092E5A34
:00000001FF

在HEX文件里面,每一行代表一个记录(RECORD)。

记录(RECORD)的格式分析

记录的基本格式为:

Record mark Length Load offset Record type INFO or DATA CHKSUM
: 1 byte 2 bytes 1 byte n bytes 1 byte

记录类型有:0x00、0x01、0x02、0x03、0x04、0x05:

  • 00‘ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
  • 01‘ End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
  • 02‘ Extended Segment Address Record: 用来标识扩展段地址的记录
  • 03‘ Start Segment Address Record:开始段地址记录
  • 04‘ Extended Linear Address Record: 用来标识扩展线性地址的记录
  • 05‘ Start Linear Address Record:开始线性地址记录

校验和的算法为:计算所有数据(仅INFO OR DATA部分)的累加和(不计进位),检验和 = 0x100 – 累加和

示例分析

第1条记录::020000040008F2
长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0008,校验和为F2。
从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0008 << 16)。后面的数据记录都以这个地址为基地址。

第2条记录::10000400FF00A0E314209FE5001092E5011092E5A34
长度为10(0x16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为0X80000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x80000 + 0x0004 = 0x80004.

第3条记录:00000001FF
长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。

在这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x0004.