MAL'S_BLOG

Welcome to Malossov's Personal Archieve!

0%

如何在宿舍有幽灵电脑

基础命令和服务部分

背景故事:呜呼哀哉,我因为没有趁着第一波危机从学校逃跑,不幸地阳了,没有精力完成实验报告和拷贝文件,只好在家远程连接到学校的电脑上完成作业,他需要做一些操作让他的台机能在家中被连接。

  • 我已有的知识:

    • Linux基础服务命令:systemctl,crontab……
    • 网页搜索能力
  • 我已有的设备:

    • 台式电脑:在宿舍,运行Windows11和Ubuntu22.04.1
    • 香橙派3:在宿舍,运行Ubuntu18.04
    • 笔记本:带回宿舍用以连接
  • 我需要做的:

    • 让香橙派能够唤醒台式电脑
    • 保持宿舍需要每时每刻发包的电信网络不断网
    • 让这两台设备能够被远控
  • 解决方案:

    • 唤醒问题:使用魔术封包的方法让主机支持WakeOnLan
    • 联网问题:使用crontab定时任务,让香橙派每一分钟给路由器发包,保证联网保活的包不断
    • 远程连接问题:使用内网透传工具

服务构建

保活:Crontab定时命令服务

数据包流量分析

背景故事:由于电信网络糟糕的设计,每次重启路由器时(即断电后第二天),都需要重新重新验证,所以必须进行保活处理。

  1. 首先验证网络登录方式,使用BurpSuite对登录网络进行抓包:(由于现在是远程访问,就改包越权访问到主页演示一下orz,一旦登出我两台设备都没网了害得等服务主动发包帮我续上)image-20221218132940999

    1. 最终抓到的包为:image-20221218133130102
  2. 稍稍修改为curl命令的语法并写成可以直接运行的脚本形式:image-20221218133246914

    curl命令语法:curl命令用法_追梦菜鸟的博客-CSDN博客_curl语法

    基础语法为:curl [options…] ,主要有:

    1. -H/—header LINE (H) # 添加请求头, 可添加多个 -H 参数,参数格式: -H “NAME: VALUE”
    2. -o/—output FILE FILE # 把响应内容输出到指定文件
    3. -F/—form CONTENT (H) # 参考格式: -F “name1=@/filepath” -F “name2=stringvalue”
    4. -b/—cookie STRING/FILE (H) # 请求头的 Cookie 字段, 以字符串的形式提供,**或从指定 cookie 文件中读取
    5. -d/—data DATA (H)
  3. 这时候可以使用终端运行脚本进行验证:image-20221218133346827

  4. 下面把脚本使用scp命令拷贝给香橙派之后进行定时任务的书写:image-20221218133620133

    SCP命令用法为:Linux scp命令 | 菜鸟教程 (runoob.com)

    1. 本地到远程:scp local_file remote_username@remote_ip:remote_file
    2. 远程到本地:scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3

Crontab保活

网上一般的都是比较老的/etc/cron和直接开启crond服务,但是ubuntu升级到systemctl下的系统步骤较少,这里随便试一下成功了。

  1. 我这里ubuntu自带了crontab的命令。image-20221218134507120

  2. 调用cron -e选择vim进行服务文件的编辑。cron的格式为:《crontab命令详解 含启动/重启/停止》

    在以上各个字段中,还可以使用以下特殊字符:

    • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

    • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

    • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

    • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

  3. crontab -l列出cron服务内容:在每分钟执行一次curl的操作,同时在每小时删除一次日志文件。cron当中必须使用绝对路径,否则会运行失败。image-20221218135121983

    1. network.sh内容:将内容存入tmp.txt日志当中。image-20221218135244996
  4. 接下来使能服务,注意ubuntu中cron的服务不是crond,而是cron.serviceimage-20221218135419224

    systemctl基本的服务操作:

    1
    2
    3
    4
    5
    6
    $ systemctl start   <docker>.service    //启动
    $ systemctl restart <docker>.service //重启
    $ systemctl stop <docker>.service //停止
    $ systemctl reload <docker>.service //重新加载
    $ systemctl enable <docker>.service //加入开机启动
    $ systemctl disable <docker>.service //取消开机启动

    systemctl配置详解:

    详细讲解systemctl(附常用指令) - 掘金 (juejin.cn)

  5. 可以观察tmp.txt日志文件看看是不是真的curl了,也可以使用systemctl status <service>进行日志查看:image-20221218135844577

  6. 可以看到已经成功了。

远程登录开启

由于我的路由器时电信送的便宜玩意,管理后台特别烂,所以只有DHCP的局域网IP分配,非常伤心。无法配置todesk的远程唤醒,只能使用ubuntu下的ethtools工具进行相关配置。

所以我大概是简体中文ubuntu22唤醒第一人了?

国内互联网上的资料非常老,在服务管理这一块用的还是古老的rc.local方式,而这种方式在ubuntu22当中根本就没有被使能,所以必须还是使用systemd的方式进行服务的追加和保活。

被唤醒主机

  1. 安装ethtool软件包:sudo apt install ethtool -y

  2. 更改并查看网卡状态,将网卡的在线唤醒模式开启:sudo ethtool -s enp5s0 wol g

    1. 使用ethtool enp5s0查看网卡状态,Wake-on:这一项为g表示已经开启了唤醒:image-20221218140530400
  3. 但是由于Linux万物皆文件的特性,在重启时,网卡的配置文件会被覆盖,因此采用systemd的方式,编写系统服务完成自动唤醒网卡的操作:

    1. 使用--preserve-env操作进行提权,直接编写systemctl服务:sudo --preserve-env systemctl edit --force --full wol-enable.service

      1
      2
      3
      4
      5
      6
      7
      8
      9
      [Unit]    # 服务本身的名字和说明
      Description=Enable Wake-up on LAN

      [Service]
      Type=oneshot # 只执行一项任务、随后立即退出的服务
      ExecStart=/sbin/ethtool -s enp2s0 wol g # 执行的命令,注意ethtool的位置是在sbin下的,泪目

      [Install]
      WantedBy=basic.target # 挂载在basic.target下,优先级必须比我用户启动高
    2. 详细配置2.0:linux systemctl 指令 —— 阮一峰 - 七脉 - 博客园 (cnblogs.com)

唤醒机器

  1. 查询到被唤醒机器的mac地址之后,使用魔术封包即可唤醒,也是安装个wakeonlan软件包就行。image-20221218141250231

  2. 可以看到ubuntu的软件包是全局发送的,不像windows下某些解决方案必须固定ip。

    1. 个人学了基本sdn控制器之后的理解大概是路由会记住主机的mac表然后发送给对应主机。
  3. 为了配合简洁使用写了个flask服务:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @app.route('/', methods=['GET'])
    def hello_world():
    return '''
    <form action="/" method="post">
    <input type="submit" value="SendRemoteRebootMessage">
    </form>
    '''

    @app.route('/', methods=['POST'])
    def post():
    import subprocess
    subprocess.call('./a.sh')
    return '''
    Successfully Reboot from remote
    <form action="/" method="post">
    <input type="submit" value="Resend Message">
    </form>
    '''
    1. 对应服务程序:由于flask这个pip包的原因,不能使用nohup&在后台运行,所以状态一直是loaded,但是日志是没有问题的。image-20221218141622686
    2. 来点cpolar透传5000端口之后的样子:image-20221218141901735

外网透传和远控

  1. 透传使用的是cpolar白嫖的三个通道,配置方法在文档里面很详细:https://www.cpolar.com/docs,还有`9200端口`的webui,基本上很无脑:![image-20221218142023423](http://picgo.malossov.top/malpicbed/image-20221218142023423.png)
  2. 控制方面使用的是toDesk,非常流畅,也是对Linux支持较为友好。image-20221218142149380

后续使用

双系统切换

电脑的默认引导加载程序和管理器因为安装了Ubuntu的缘故被设置成grub2,因此其实对于引导的修改就是对于grub2启动项的修改。

Grub2在UbuntuWiki上的介绍:↓简单的部分中文翻译和理解:这里为软件包相关配置,不涉及到grub控制台的配置

  1. Grub2介绍: 是引导加载和管理工具,在进入的时候会提供界面等待用户选择,或者将控制交给系统内核(可以是任意被识别到的系统内核)。

  2. 文件结构:

    1. /etc/grub.d(文件夹):Grub2脚本
    2. /boot/grub (文件夹):Grub2模块和菜单文件(grub.cfg
    3. /etc/default/grub :(配置文件)用户主要修改通过这个文件
      1. 应用配置更改:修改grub.d/etc/default/grub后,运行update-grub,来修改/boot/grub当中的内容。

Linux切换到Windows

修改grub配置文件,并且运行sudo update-grub即可。

image-20221218141710251

Windows下切换回Linux系统

  1. 让Windows正确识别到Linux的文件系统并且能进行修改
    1. 在网上陆续找了一些能识别ext4文件系统的软件但是都效果不佳,最终找到Linux File Systems for Windows | Paragon Software (paragon-software.com)可以将Linux盘挂在到Windows系统文件管理器当中image-20221218123143305
  2. grub的描述当中可知,grub在进行启动引导时,使用的是/boot/grub当中的模块和菜单文件。直接修改/boot/grub/grub.cfg菜单文件,将默认启动选项移到windows11对应的启动菜单栏目即可。image-20221218122929405

意外失去连接之后怎么办

  1. 此时局域网还是连通的,使用nmap扫描当前网段的内容。

  2. 使用cpolar远程登录到香橙派中。

  3. 使用命令:nmap 192.168.101.1-10 扫描10个ip,一般情况下dhcp会将PC分配在1-10当中。因为我都开启了ssh服务,可以通过香橙派作为中继连接主机的ssh服务image-20221218132505568

  4. 此时pc被分配在192.168.101.6上。ssh连接之后重启服务或者重启。

  5. 扫描时可以添加如下选项:

    1. Windows如果无法扫描到,添加:-Pn 禁止ping访问确定主机是否存在,强力联通;

      扫描速度太慢,给予sudo权限之后添加-sS进行扫描,更改连接方式,不需要经过TCP三次握手;

      或者选择经过TCP三次握手但是修改timeout超时时间,如:--host-timeout 10

关于为什么咕咕了那么久就上传了这个

因为实在是太纯阳了。

IMG_20221218_142310