基础命令和服务部分
背景故事:呜呼哀哉,我因为没有趁着第一波危机从学校逃跑,不幸地阳了,没有精力完成实验报告和拷贝文件,只好在家远程连接到学校的电脑上完成作业,他需要做一些操作让他的台机能在家中被连接。
我已有的知识:
- Linux基础服务命令:
systemctl
,crontab
…… - 网页搜索能力
- Linux基础服务命令:
我已有的设备:
- 台式电脑:在宿舍,运行Windows11和Ubuntu22.04.1
- 香橙派3:在宿舍,运行Ubuntu18.04
- 笔记本:带回宿舍用以连接
我需要做的:
- 让香橙派能够唤醒台式电脑
- 保持宿舍需要每时每刻发包的电信网络不断网
- 让这两台设备能够被远控
解决方案:
- 唤醒问题:使用魔术封包的方法让主机支持WakeOnLan
- 联网问题:使用crontab定时任务,让香橙派每一分钟给路由器发包,保证联网保活的包不断
- 远程连接问题:使用内网透传工具
服务构建
保活:Crontab定时命令服务
数据包流量分析
背景故事:由于电信网络糟糕的设计,每次重启路由器时(即断电后第二天),都需要重新重新验证,所以必须进行保活处理。
首先验证网络登录方式,使用BurpSuite对登录网络进行抓包:(由于现在是远程访问,就改包越权访问到主页演示一下orz,一旦登出我两台设备都没网了害得等服务主动发包帮我续上)
- 最终抓到的包为:
稍稍修改为curl命令的语法并写成可以直接运行的脚本形式:
curl命令语法:curl命令用法_追梦菜鸟的博客-CSDN博客_curl语法
基础语法为:curl [options…]
,主要有: - -H/—header LINE (H) # 添加请求头, 可添加多个 -H 参数,参数格式: -H “NAME: VALUE”
- -o/—output FILE FILE # 把响应内容输出到指定文件
- -F/—form CONTENT (H) # 参考格式: -F “name1=@/filepath” -F “name2=stringvalue”
- -b/—cookie STRING/FILE (H) # 请求头的 Cookie 字段, 以字符串的形式提供,**或从指定 cookie 文件中读取
- -d/—data DATA (H)
这时候可以使用终端运行脚本进行验证:
下面把脚本使用scp命令拷贝给香橙派之后进行定时任务的书写:
SCP命令用法为:Linux scp命令 | 菜鸟教程 (runoob.com)
- 本地到远程:scp local_file remote_username@remote_ip:remote_file
- 远程到本地:scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3
Crontab保活
网上一般的都是比较老的
/etc/cron
和直接开启crond服务,但是ubuntu升级到systemctl下的系统步骤较少,这里随便试一下成功了。
我这里ubuntu自带了crontab的命令。
调用cron -e选择vim进行服务文件的编辑。cron的格式为:
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
crontab -l
列出cron服务内容:在每分钟执行一次curl的操作,同时在每小时删除一次日志文件。cron当中必须使用绝对路径,否则会运行失败。- network.sh内容:将内容存入tmp.txt日志当中。
接下来使能服务,注意ubuntu中cron的服务不是
crond
,而是cron.service
systemctl基本的服务操作:
1
2
3
4
5
6systemctl start <docker>.service //启动
systemctl restart <docker>.service //重启
systemctl stop <docker>.service //停止
systemctl reload <docker>.service //重新加载
systemctl enable <docker>.service //加入开机启动
systemctl disable <docker>.service //取消开机启动systemctl配置详解:
可以观察tmp.txt日志文件看看是不是真的curl了,也可以使用
systemctl status <service>
进行日志查看:可以看到已经成功了。
远程登录开启
由于我的路由器时电信送的便宜玩意,管理后台特别烂,所以只有DHCP的局域网IP分配,非常伤心。无法配置todesk的远程唤醒,只能使用ubuntu下的ethtools工具进行相关配置。
所以我大概是简体中文ubuntu22唤醒第一人了?
国内互联网上的资料非常老,在服务管理这一块用的还是古老的rc.local
方式,而这种方式在ubuntu22当中根本就没有被使能,所以必须还是使用systemd的方式进行服务的追加和保活。
被唤醒主机
安装
ethtool
软件包:sudo apt install ethtool -y
更改并查看网卡状态,将网卡的在线唤醒模式开启:
sudo ethtool -s enp5s0 wol g
- 使用
ethtool enp5s0
查看网卡状态,Wake-on:这一项为g表示已经开启了唤醒:
- 使用
但是由于Linux万物皆文件的特性,在重启时,网卡的配置文件会被覆盖,因此采用systemd的方式,编写系统服务完成自动唤醒网卡的操作:
使用
--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下,优先级必须比我用户启动高
唤醒机器
查询到被唤醒机器的mac地址之后,使用魔术封包即可唤醒,也是安装个
wakeonlan
软件包就行。可以看到ubuntu的软件包是全局发送的,不像windows下某些解决方案必须固定ip。
- 个人学了基本sdn控制器之后的理解大概是路由会记住主机的mac表然后发送给对应主机。
为了配合简洁使用写了个flask服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def hello_world():
return '''
<form action="/" method="post">
<input type="submit" value="SendRemoteRebootMessage">
</form>
'''
def post():
import subprocess
subprocess.call('./a.sh')
return '''
Successfully Reboot from remote
<form action="/" method="post">
<input type="submit" value="Resend Message">
</form>
'''- 对应服务程序:由于flask这个pip包的原因,不能使用
nohup
和&
在后台运行,所以状态一直是loaded,但是日志是没有问题的。 - 来点cpolar透传5000端口之后的样子:
- 对应服务程序:由于flask这个pip包的原因,不能使用
外网透传和远控
- 透传使用的是cpolar白嫖的三个通道,配置方法在文档里面很详细:https://www.cpolar.com/docs,还有`9200端口`的webui,基本上很无脑:![image-20221218142023423](http://picgo.malossov.top/malpicbed/image-20221218142023423.png)
- 控制方面使用的是
toDesk
,非常流畅,也是对Linux支持较为友好。
后续使用
双系统切换
电脑的默认引导加载程序和管理器因为安装了Ubuntu的缘故被设置成grub2,因此其实对于引导的修改就是对于grub2启动项的修改。
Grub2在UbuntuWiki上的介绍:↓简单的部分中文翻译和理解:这里为软件包相关配置,不涉及到grub控制台
的配置
Grub2介绍: 是引导加载和管理工具,在进入的时候会提供界面等待用户选择,或者将控制交给系统内核(可以是任意被识别到的系统内核)。
文件结构:
/etc/grub.d
(文件夹):Grub2脚本/boot/grub
(文件夹):Grub2模块和菜单文件(grub.cfg
)/etc/default/grub
:(配置文件)用户主要修改通过这个文件
- 应用配置更改:修改
grub.d
和/etc/default/grub
后,运行update-grub
,来修改/boot/grub
当中的内容。
Linux切换到Windows
修改grub配置文件,并且运行sudo update-grub
即可。
Windows下切换回Linux系统
- 让Windows正确识别到Linux的文件系统并且能进行修改
- 在网上陆续找了一些能识别ext4文件系统的软件但是都效果不佳,最终找到Linux File Systems for Windows | Paragon Software (paragon-software.com)可以将Linux盘挂在到Windows系统文件管理器当中
- 从
grub
的描述当中可知,grub
在进行启动引导时,使用的是/boot/grub
当中的模块和菜单文件。直接修改/boot/grub/grub.cfg
菜单文件,将默认启动选项移到windows11
对应的启动菜单栏目即可。
意外失去连接之后怎么办
此时局域网还是连通的,使用nmap扫描当前网段的内容。
使用cpolar远程登录到香橙派中。
使用命令:
nmap 192.168.101.1-10
扫描10个ip,一般情况下dhcp会将PC分配在1-10当中。因为我都开启了ssh服务,可以通过香橙派作为中继连接主机的ssh服务此时pc被分配在192.168.101.6上。ssh连接之后重启服务或者重启。
扫描时可以添加如下选项:
Windows如果无法扫描到,添加:
-Pn
禁止ping访问确定主机是否存在,强力联通;扫描速度太慢,给予sudo权限之后添加
-sS
进行扫描,更改连接方式,不需要经过TCP三次握手;或者选择经过TCP三次握手但是修改timeout超时时间,如:
--host-timeout 10
关于为什么咕咕了那么久就上传了这个
因为实在是太纯阳了。