通过SSH反向代理连接学校内网服务器

问题的来源

从老师那里借了两台服务器跑数据,但是老师的服务器没有公网ip,只有学校内网ip,故只能在实验室或者图书馆登录。有没有什么办法,能让我在宿舍或者家里,远程连接进这两台学校内网的服务器呢?答案肯定的,那就是 反向代理。前提是,我得有一台有公网ip的服务器(例如,阿里云服务器或VPS都可以)。


什么是代理?

要搞清楚什么是反向代理,就得知道什么是 代理(Proxy)。代理其实就是一个跳板。比如我要去图书馆借一本书,我把要借的书的信息写在纸上,交给图书馆管理员,由图书馆管理员去仓库帮我把书取出来交给我。那我们就说,图书馆管理员是我的代理。

在计算机网络中,代理分为 正向代理反向代理

阅读更多

Debian 9 安装 Apche2 和 vsftpd

apache2

什么是 Apache HTTP Server

Apache HTTP Server Project 是致力于为现代操作系统(包括UNIX 和 Windows)提供和维护的一个开源 HTTP 服务项目。该项目发起于 1995 年,至今已有20+年的历史。

借助 Apache HTTP Server,我们可以在我们的计算机或服务器上快速部署一个高效、可用的 HTTP 服务。Apache2 是 Apache HTTP Server 的最新版本。

  • Apache官网:Link

Getting Started

安装

1
sudo apt-get install apache2

访问 127.0.0.1 或者该服务器的公网ip ,即可看到 apache2 的主页面

welcome

阅读更多

Linux环境QT编程

由于课程需要,需要在 Linux 环境下开发 QT 程序,因此开一篇文章来记录QT的知识点。

阅读更多

Linux内核模块编程 HelloWorld

微内核和宏内核

微内核

内核中只有最基本的调度、内存管理。其他的比如驱动、文件系统等都是用户态的守护进程去实现的。比如Windows NT、OS X

优点是超级稳定,驱动等的错误只会导致相应进程死掉,不会导致整个系统都崩溃,做驱动开发时,发现错误,只需要kill掉进程,修正后重启进程就行了,比较方便。

缺点是效率低。典型代表QNX,QNX的文件系统是跑在用户态的进程,称为resmgr的东西,是订阅发布机制,文件系统的错误只会导致这个守护进程挂掉。

宏内核

简单来说,就是把很多东西都集成进内核,例如Linux内核,除了最基本的进程、线程管理、内存管理外,文件系统,驱动,网络协议等等都在内核里面。优点是效率高。缺点是稳定性差,开发过程中的bug经常会导致整个系统挂掉。做驱动开发的应该经常有按电源键强行关机的经历。


内核模块

由于 Linux 内核是宏内核,集成性比较高,随着内核版本的迭代,内核变得非常大(Linux内核约50M),我们想定制自己的内核时,需要整个重新编译,比较繁琐。而且,定制内核时,有些功能我们是不需要的。

因此 Linux 内核采用了模块化的方式。当我们编译内核时,可以只选择我们需要的模块。而且,我们自己编写的模块,可以采用安装/卸载的方式,集成到内核里。

内核模块的优点是:开发效率更高,而且可以在内核运行时动态加载。由于Linux内核模块是动态加载的,所以它也叫可加载内核模块(Loadable Kernel Module, LKM)。Linux内核镜像位于/boot目录下,启动时最先加载,LKM总是在内核启动之后加载。

LKM主要用于:设备驱动、文件系统驱动和系统调用。

  • 注意:LKM是内核空间程序,不是用户空间程序,你可以把它看成是内核的一部分。也就是LKM没有任何保护,一不小心可能就会导致系统崩溃。

编译LKM

安装C编译器和Linux内核头文件

1
sudo apt-get install build-essential linux-headers-$(uname -r)

Hello World内核模块代码(hello.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <linux/module.h>     /* 模块头文件,必不可少 */
#include <linux/kernel.h> /* KERN_INFO在这里 */
#include <linux/init.h> /* 使用的宏 */

// LICENSE
MODULE_LICENSE("GPL");

// 作者
MODULE_AUTHOR("blog.topspeedsnail.com");

// 描述
MODULE_DESCRIPTION("hello world");

// 模块版本
MODULE_VERSION("3.14");

static int __init hello_start(void)
{
printk(KERN_INFO "Hello World\n");
return 0;
}

static void __exit hello_end(void)
{
printk(KERN_INFO "Go to Hell\n");
}

module_init(hello_start);
module_exit(hello_end);
  • module_init 定义了模块的入口函数,在模块加载 insmoded (插入模块)时执行
  • module_exit 定义了模块的退出函数,在模块卸载 rmmoded (移除模块)时执行

创建Makefile

1
2
3
4
5
6
obj-m = hello.o
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
# make命令前是tab,不是空格

编译

make命令

1
make

输出

1
2
3
4
5
6
7
8
9
jerrysheh@ubuntu:~/Desktop$ make
make -C /lib/modules/4.13.0-31-generic/build/ M=/home/jerrysheh/Desktop modules
make[1]: Entering directory '/usr/src/linux-headers-4.13.0-31-generic'
CC [M] /home/jerrysheh/Desktop/helloworld.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/jerrysheh/Desktop/helloworld.mod.o
LD [M] /home/jerrysheh/Desktop/helloworld.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.13.0-31-generic'

查看

使用modinfo hello.ko来查看模块信息

使用sudo insmod hello.ko来加载模块到内核

使用lsmod来查看已加载的内核(结合管道lsmod | grep hello

使用sudo rmmod hello来卸载模块

输出

使用tail /var/log/kern.log来查看模块的输出

1
2
3
4
5
6
7
8
9
10
11
jerrysheh@ubuntu:~/Desktop$ tail /var/log/kern.log
Mar 7 12:53:59 ubuntu NetworkManager[863]: <info> [1520398439.9770] gateway 192.168.224.2
Mar 7 12:53:59 ubuntu NetworkManager[863]: <info> [1520398439.9770] server identifier 192.168.224.254
Mar 7 12:53:59 ubuntu NetworkManager[863]: <info> [1520398439.9770] lease time 1800
Mar 7 12:53:59 ubuntu NetworkManager[863]: <info> [1520398439.9770] nameserver '192.168.224.2'
Mar 7 12:53:59 ubuntu NetworkManager[863]: <info> [1520398439.9770] domain name 'localdomain'
Mar 7 12:53:59 ubuntu NetworkManager[863]: <info> [1520398439.9770] wins '192.168.224.2'
Mar 7 12:53:59 ubuntu NetworkManager[863]: <info> [1520398439.9771] dhcp4 (ens33): state changed bound -> bound
Mar 7 12:56:41 ubuntu kernel: [ 1170.100050] helloworld: loading out-of-tree module taints kernel.
Mar 7 12:56:41 ubuntu kernel: [ 1170.100085] helloworld: module verification failed: signature and/or required key missing - tainting kernel
Mar 7 12:56:41 ubuntu kernel: [ 1170.100760] Hello World

看到最后一行输出了 Hello World,正是我们编写的 helloworld.ko 模块输出的。

可以使用tail -f /var/log/kern.lo来动态监控内核的输出

作为字符型驱动

在 insmod 的时候把设备的主设备号打印出来。

如果要把内核模块作为字符型驱动设备,首先

1
tail -f /var/log/messgaes

查看设备的主设备号,比如是 254

然后创建目录和节点

1
2
mkdir /dev/demo
mknod /dev/demo/newdev c 254 0

这样就创建了一个虚拟的字符型驱动设备。


本文引用的文章:

Linux系统漫游(二)从进程到并发

漫游式梳理一下关于 Linux 的知识。

上一篇

  • Linux简介与版本
  • 从开机到启动
  • 文件系统
  • 文本流
  • 标准输入、标准输出、标准错误、重定向
  • 管道
  • Linux 架构

本篇:

  • 进程
  • 进程空间
  • 信号
  • 进程间通信
  • 并发与同步
阅读更多

Linux系统漫游(一)从开机到架构

用了好久的 Linux 系统了,然而却没有从头开始好好系统地认识过 Linux,这两篇,就从以下几个方面,漫游式地重新梳理一下关于 Linux 的知识。

本篇:

  • Linux简介与版本
  • 从开机到启动
  • 文件系统
  • 文本流
  • 标准输入、标准输出、标准错误、重定向
  • 管道
  • Linux 架构

下一篇

  • 进程
  • 进程空间
  • 信号
  • 进程间通信
  • 并发与同步

Linux

注:本文提取总结自Vamei的博客


Linux 简介和版本

狭义的 Linux 指的是 Linux kernel (内核),最初由 Linus Torvalds 根据Minix系统的代码,参照UNIX系统的设计写出。kernel 就是负责管理硬件并为上层应用提供接口的底层代码。广义的 Linux 指的是以 Linux kernel 为基础的包括操作系统和各种应用在内的各个Linux版本(distribution)。

阅读更多

了解makefile

使用 gcc 命令可以很方便地在Linux下编译C源代码,但是,当我们的工程变大了之后,项目下面有很多 .c.h文件,各种依赖关系错综复杂。这时候,手工编译就不是那么划算了。makefile就是用于解决这个问题的。

假设我现在的工程下面有5个文件,分别是:

  1. main.c 主函数所在源文件
  2. hello.c 输出hello的函数
  3. hello.h 头文件
  4. world.c 输出world的函数
  5. world.h 头文件

我们可以在工程目录下,新建一个名称为makefile的文件(没有扩展名),然后往这个文件里写一些规则,再在shell下面执行make命令,就可以实现自动编译了。

阅读更多

gcc编译基本操作

假设我现在有3个文件,分别是:

  • mystrlen.c: 是我自己实现的一个计算字符串长度的算法函数。
  • mystrlen.h: 该算法的头文件。
  • test.c: main函数,里面有一些字符串需要调用上面的算法来计算长度

那么在 Linux 下,如何用 gcc 把 mystrlen.c 编译成动态链接库,方便 test.c 去使用呢 ?


阅读更多

给自己的 Linux 备忘

Linux 学习任重而道远,此文记录了我在 Linux 学习中需要知道或反复查阅使用的命令、表达式等内容,持续更新。

阅读更多

Ubuntu的一些奇技淫巧

接触Linux越久,掉进莫名其妙的坑里就越多,于是我决定每遇到一个坑就记录下来,这样以后再踩的时候不至于爬不起来。

Ubuntu的一些使用技巧

目前 get 的有:

  1. 调整鼠标速度
  2. 解决双系统时间不同步的问题
  3. 系统更新提示 /boot 空间不足的解决办法
  4. 更改国内源,提高下载速度
  5. 利用 Xshell / SSH 在远程和本地之间传文件
  6. 编辑菜单
  7. 终端使用SS,查公有ip
  8. 管理ppa源
  9. 安装 jdk 1.8
  10. 更改 root 账户密码
  11. apt安装不成功,每次 apt install 都报错
  12. 使用openssh远程连接
  13. ROOT账户没有环境变量
  14. 如何正确地配置环境变量
  15. Ubuntu出现了内部错误
  16. Ubuntu/Debian 完全卸载Mysql
阅读更多

Ubuntu 下配置SS和SSR

Ubuntu 下配置 shadowsocks-qt

注意:shadowsocks-qt只能用于SS,不能用于SSR

安装

1
2
3
sudo add-apt-repository ppa:hzwhuang/ss-qt5
sudo apt update
sudo apt install shadowsocks-qt5

对于 UBuntu 18.04

ppa:hzwhuang/ss-qt5 并没有18.04版本的源,所以再执行update时会出现

E: 仓库 “http://ppa.launchpad.net/hzwhuang/ss-qt5/ubuntu bionic Release” 没有 Release 文件 的错误。

这时,只要编辑 /etc/apt/sources.list.d/hzwhuang-ubuntu-ss-qt5-bionic.list 文件,将bionic (18.04版本代号)改成xenial(16.04版本代号)。

配置

添加服务器地址、密码、连接方式。 gui友好界面。

配置Chrome ,使用插件SwitchyOmega

用你能想到的方法找到Chrome SwitchyOmega 插件的 crx 离线包

打开 Chrome 的扩展程序,将 crx 托进去及安装完毕

第一步

  1. 新建一个情景模式,更名 shadowsock
  2. 代理协议选择 sock5,代理服务器 127.0.0.1, 代理端口 1080

第二步

  1. 选择 autoswitch
  2. 规则列表设置选择 Autoproxy
  3. 规则列表网址如下
    1
    https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
  4. 立即更新情景模式
  5. 切换规则 - 规则列表规则选择 shadowsock

Have fun :)


使用 SSR 客户端

安装

1
2
3
4
wget http://www.texfox.com/ssr  
sudo mv ssr /usr/local/bin
chmod 766 /usr/local/bin/ssr
ssr install

一般安装的或者自己写的把全局脚本放在 usr/local/bin 下,这样在终端任意位置可以使用脚本命令

配置

1
ssr config

然后在弹出来的配置文件中填写你的服务器信息

1
2
3
4
5
6
"server":"0.0.0.0",        //服务器ip  
"server_port":8388, //端口
"password":"m", //密码
"protocol":"origin", //协议插件
"obfs":"http_simple", //混淆插件
"method":"aes-256-cfb", //加密方式

一般配置完之后就会自动启动,如果没有,使用以下命令来启动

1
ssr start

使用以下命令来关闭

1
ssr stop

Chrome 配置同SS

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×