跳转至

2023

Codeforces & Topcoder

简介

  • codeforces
  • Codeforces 是一家为计算机编程爱好者提供的在线评测系统
  • 该网站由俄罗斯 ITMO 大学(圣彼得堡国家信息技术、机械学与光学研究型大学)的一个团体创立并负责运营。
  • 在编程挑战赛中,选手有 2 个小时的时间去解决 5 道题,通过得分排名,选手可以看到实时的排名(Standing),也可以选择查看好友的排名,还可以看到某题有多少人通过等信息。
  • 在 cf,所有的用户根据在以往比赛中的表现被赋予一个 Rating 并冠以不同的头衔,名字也会以不同的颜色显示,比如 Expert 是蓝色,Master 是黄色。
  • 题目兼容并蓄,什么难度等级的题目都可以找到。
    • 并且题目很有意思,往往思维陷阱比较多,也就是思维题比较多。
    • 对于数据结构以及算法的考察相对弱一些,更多的时候往往是告诉你用什么算法你也不知道怎么做。
  • topcoder
  • TopCoder成立于2001年,它的客户包括Google、MS、YAHOO、Intel、 Motorola和SUN等世界上顶级的IT公司。每年TopCoder都会举办若干个编程竞赛和锦标赛,其总奖金金额高达几十万美元。她是你进入世界顶级的IT企业的捷径,TopCoder排名(程序设计,开发,算法)靠前的选手基本都成了知名公司追逐的对象。
  • 积分:tc的每个用户(handle)都有自己的积分,从0-3000+不等。成绩越好,分数越高 。
  • 积分与颜色的对应为:白色——未参赛(unrated);灰色——0899;绿色——9001199;蓝色——12001499;黄色——15002199;红色——2200+。另外排名最高的几个人在TC客户端中会变成红色靶子图标。现在,全世界有300人达到红色等级,日本有26人。3000 分以上者被称为target,全世界有18人,日本有3人,分别是:iwi(秋叶拓哉)、wata (岩田阳一)和lvrically;

topcoder vs codeforces

Codeforces: Another good platform with nice contests where you will get to learn new things that will improve your understanding of concepts. It's ratings don't matter to recruiters but the things you'll learn will help you during interviews and company's coding tests.

TOPCODER: This caters to every aspect of software develpment. They have both designing and development contest. Major companies provide Topcoder community to experment with their nw products or APIs. But if you want to mention it in your CV, your ratings should be above 1400 to impress a recruiter.

for average is CODEFORCES, for expert TOPCODER

竞赛说明

codeforces

  • 比赛举办频率
  • 第一种是Codeforces Rounds(常规比赛) 大约一周一两次,时长2小时。常规赛分为三个赛区:Div3、Div2和Div1。题目难度Div3 < Div2 < Div1。
  • 第二种是Educational Contests(教育性比赛) 大约每个月二到三次,时长2个小时。常规赛分为两个赛区:Div2和Div1。题目难度Div2 < Div1。
  • 比赛一般是两个小时的赛程,一共六道题目。(20分钟一题)
  • 新手能做出3道,rating就不会跌。
  • div 表示题目难度,数值越小难度越高,
  • div 1 要求参赛者的 Rating 大于 1900 。div2 平均难度在 Rating 1500.
  • Hack:当你通过某题目,可以查看同房间内其他通过该题的参赛者的代码。
  • 由于codeforces在比赛的时候只会测试一小部分数据,真正的测试集会放到赛后进行测试。所以在比赛中测试通过的代码,只是通过了小数据验证,很有可能有隐藏的问题没被发现。
  • 如果发现了bug,可以构造一份数据hack掉他的提交。
  • hack 成功,你获得 100 分奖励,别人的提交会被打回;hack 失败,减 50 分作为惩罚。
  • 一般后面题不会做的时候,又有时间的时候就去Hack

topcoder

  • 安装程序TopCoder Arena(竞技场,古罗马的斗兽场也是这个词),
  • TopCoder Arena是一个纯Java应用程序,它既是Applet也是应用程序,所以需要安装Java运行环境。
  • 相关软件的网址ContestAppletProd.jnlp(Java Web Start 方式安装)
  • 规则
  • 75分钟做完3道难度递增的题。(25 mins per problem)
  • 比赛分为两个division:Div I和Div II。
    • 积分<1200或者unrated(即注册但还没参加过比赛的)参加Div II,>=1200的参加Div I。
    • Div I的题要比Div II难许多。 一般DivII的最后一题和Div I的第一或第二题是一样的。
    • 无论是Div I或Div II。三道题目的Score一般为250, 500和1000左右,视每次的难度略有浮动。
  • 个人积分 (rating)的增减是根据你和别人在比赛中的score以及你们原来的rating决定的。tc 的提交结合了ICPC和IOI的特点,即只能交一次,必须过所有数据并且得分与用时相关。tc每周有一次Single Round Match(SRM),每年两次大的比赛TCOpen(有$)。
    • 评分是根据你完成的时间和所完成问题的难易决定的。
  • 比赛可分为三部分:Coding Phase, Challenge Phase和System Test Phase
    • 发送代码后,你就进入Challenge Phase了,Challenge Phase部分是让参赛者浏览分配在同一房间的其他参赛者的源代码,然后设法找出其中错误,并提出一个测试参数使其不能通过测试。如果某参赛者的程序不能通过别人或系统的测试,则该参赛者在此题目的得分将为0。
    • System Test Phase: 挑战结束后,TopCoder会测试每个参赛者的代码,如果你的代码产生了不正确的输出、异常终止和其它错误,你就不能得分。
  • 如果是多个回合比赛,每个小组中得分最高的三位参赛者将进入下一轮的比赛。他们将解决一些新的问题,最后总得分在前三名的选手将会得到现金奖励。
  • 参赛具体操作, 图文

other platform

codechef

Actual experience

codeforces

  1. 22:35PM - 01:05 AM

topcoder

  1. Contest time infomation is here.
  2. SRM 849 on September 28, 2023 at 11:00 AM - 1:00 PM EST(UTC-4). (00:00 AM - 2:00 AM UTC+8)
  3. hard to read due to the tiny font.
  4. maybe copy the problem to outside

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/qiuzhenguang/article/details/5552122

https://zhuanlan.zhihu.com/p/540098105

cmake

导言

ipcc初赛的项目代码有些混乱,只是简单分类。想好好学习一下cmake和make。规范项目结构,优化编译运行流程,提高效率。

Docker On Win10

简介

  • WSL 2 是对WSL基础体系结构的一次重大改造,它使用虚拟化技术和 Linux 内核来实现其新功能。
  • docker是基于linux内核运行
  • WSL 2 加入了linux内核为docker在windows上运行铺平了道路

系统要求

开启虚拟化 + Hyper-V

  • BIOS开启虚拟化
  • 查看是否开启:任务管理器 -> 性能 -> CPU 虚拟化:开启
  • Control Panel(控制面板) -> Programs and Features(程序和功能) -> Turn Windows Features on or off(启用或关闭Widnows功能)勾选三项
  • Windows Hypervisor Platform(Windows虚拟机监控程序平台)
  • Hyper-V
  • 虚拟机平台
  • 管理员Powershell运行 bcdedit /set hypervisorlaunchtype auto
  • 重启

WSL 2

参考教程安装 WSL旧版 WSL 的手动安装步骤

# 查看当前版本
 wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         1

 wsl --set-version Ubuntu-20.04 2
正在进行转换,这可能需要几分钟时间。
操作成功完成。

E:/PowerShell via  v14.17.3 via 🐍 v3.9.7 took 59s
 wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

docker on Windows

注意:用命令行运行来修改默认安装路径(重命名install.exe),参考教程

.\Docker.exe install --installation-dir="E:\commonSoftware\Docker"
安装完之后运行设置 * 开启开机启动 * 在Resources里修改image保存路径

使用问题

1: read-only file system

Error response from daemon: container df6ee73697883e8e09edd65404e1fcc19a2b4bfb49212c754a8b3ef9741d7bda: driver "overlay2" failed to remove root filesystem: unlinkat /var/lib/docker/overlay2/475c350b02589ce2cb5ef30f0619ed3aeaba409c56d87191b8cbbd00ef618fe3: read-only file system
需要管理员运行docker

C盘没空间

WSL还是超级占用C盘

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/Antarctic_Bear/article/details/123489609

Linux Auto Run : crontab

crontab的使用

任务调度

Linux下的任务调度分为两类:系统任务调度和用户任务调度。

Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。

crontab 命令

crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
  • -u user:用于设定某个用户的crontab服务;
  • file: file为命令文件名,表示将file作为crontab的任务列表文件并载入crontab;
  • -e:编辑某个用户的crontab文件内容,如不指定用户则表示当前用户;
  • -l:显示某个用户的crontab文件内容,如不指定用户则表示当前用户;
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

crontab文件

  • crontab有2种编辑方式:
    • 直接编辑/etc/crontab文件,其中/etc/crontab里的计划任务是系统中的计划任务,
    • 通过crontab –e来编辑用户的计划任务;
      • 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
      • 所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
  • crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。
  • 新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。
  • %在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用\%来进行转义。

配置文件实例:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
MAILTO=root # MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
# * * * * * user-name command to be executed
@reboot /home/user/test.sh #可以实现开机自动运行
@reboot sleep 300 && /home/start.sh # 延时启动

@reboot 表示重启开机的时候运行一次。还有很多类似参数如下:

string             meaning
------          -----------
@reboot      Run once, at startup.
@yearly       Run once a year, "0 0 1 1 *".
@annually    (same as @yearly)
@monthly    Run once a month, "0 0 1 * *".
@weekly     Run once a week, "0 0 * * 0".
@daily        Run once a day, "0 0 * * *".
@midnight   (same as @daily)
@hourly      Run once an hour, "0 * * * *".
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |

*  */1  *  *  *  /etc/init.d/smb restart  # 每一小时重启smb

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

  • *代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;
  • /代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。
  • -代表从某个区间范围,是闭区间。如2-5表示2,3,4,5
    • 组合:小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。
  • ,分散的数字(不一定连续),如1,2,3,4,7,9

查看crontab的日志记录和状态

tail -f /var/log/cron观察查看cron运行日志(/var/log/cron.log),但是并未找到相关文件,原因是ubuntu默认没有开cron日志,执行命令:

sudo vim /etc/rsyslog.d/50-default.conf
找到cron.log相关行,将前面注释符#去掉,保存退出,重启rsyslog:
sudo  service rsyslog  restart
执行less -10 /var/log/cron.log再次查看cron运行日志,log出来了,提示如下信息:
No MTA installed, discarding output
原因是cron把屏幕输出都发送到email了,而当前环境并未安装email server,于是系统报错,解决方面就是不要直接向屏幕输出内容,而是重定向到一个文件。

cd /var/spool/mail/
less shaojiemike
service cron status # ubuntu

crontab on OpenWRT

# 1.编辑好脚本加入cron

crontab -e
* * * * * sh /root/tst.sh

# 2.创建cron初始化脚本 vi /etc/init.d/S60cron,添加下面内容

#!/bin/sh
#start crond
/usr/sbin/crond -c /etc/crontabs

# 修改权限
chmod 755 /etc/init.d/S60cron

# 3.手动启动crond
/etc/init.d/S60cron

# 4.查看crond任务
logread -e cron

# 5.重启crond
killall crond; /etc/init.d/S60cron

# 6.禁用crond日志 修改/etc/init.d/S60cron
/usr/sbin/crond -c /etc/crontabs -L /dev/null

crontab运行push-IP脚本

git-push脚本

https://git.ustc.edu.cn/supertan/autoupdateipconfig

Linux 开机自动运行脚本的其他方法

https://zhuanlan.zhihu.com/p/35402730

https://blog.csdn.net/qq_35440678/article/details/80489102

https://neucrack.com/p/91

需要进一步的研究学习

登录终端自动运行

可以用户登录的时候显示信息,记录信息,静止某些IP登录 https://cloud.tencent.com/developer/article/1416251

遇到的问题

开题缘由、总结、反思、吐槽~~

最近遇到了一堆机器,想白嫖,但是如果不是自己的机器,因为某些原因重启,IP变动就再也连接不上了。所以需要一个自启动push-IP的脚本,特此学习一下。

参考文献

https://www.linuxprobe.com/how-to-crontab.html

https://martybugs.net/wireless/openwrt/cron.cgi

Network InterConnect

不同带宽与距离的互连技术

System Area Network(系统域网):主机及外设 Local Area Network(局域网):以太网 Metropolitan Area Network(城域网):WiMax Wide Area Network(广域网):因特网,X.25

没有公网IP: FRP反向代理

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

如果在外地,需要访问单位或者家庭的内网:

用ipv6,通过VPN(wireguard)连接到我寝室的路由器,然后通过路由器上网,所以可以访问校内网络。

台式机不关机,用台式机的wireguard也可以访问。

参考文献

Family Wi-Fi

Wi-Fi

Wi-Fi是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关,也常有人把Wi-Fi当做IEEE 802.11标准的同义术语。

Wi-Fi这个术语被人们普遍误以为是指无线保真(Wireless Fidelity),并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词,Wi-Fi还出现在ITAA的一个论文中。但事实上,Wi-Fi一词没有任何意义,也是没有全写的。

WiFi4/5/6

WIFI6 是802.11ax协议,支持2.4GHz和5GHz,支持更多的技术,更高的调制方式。比如 1. 调制模式方面,WiFi 6 支持 1024-QAM,高于 WiFi 5 的 256-QAM,数据容量更高,意味着更高的数据传输速度; 2. 此外,WiFi 6 加入了新的 OFDMA 技术,支持多个终端同时并行传输,有效提升了效率并降低延时,这也就是其数据吞吐量大幅提升的秘诀。 3. WiFi6通过更优质的Long DFDM Symbol发送机制,将每个信号载波发送时间从WiFi5的3.2μs提升到12.8μs,有效降低丢包率和重传率,使传输更加稳定。 4. WiFi6容量更大:多用户MU-MIMO技术允许电脑讯网时间多终端共享信道,使多台手机/电脑一起同时上网,从此前低效的排队顺序通过方式变成为“齐头并进”的高效方式。

各种网络及速率

无线路由器发展到现在有IEEE802.11b、IEEE802.11g、IEEE802.11a、IEEE802.11n、IEEE802.11ac标准,对应的无线速率分别是11Mbps、54 Mbps、150 Mbps、300Mbps、1Gbps。这里的无线速率指的是无线传输通过的最高速率。

这里拿300Mbps的无线路由器速率来说一下路由器的传输速度,300Mbps无线路由器指的是传输和接收最大能通过的速率,一般看到的只是传输的速度,也就是只能看到一半的速度,也就是150Mbps,这个是理论速率,但是在实际使用过程中由于环境的干扰,会有衰减。所以在实际使用过程中都只剩下110 Mbps左右。

WLAN

WLAN是Wireless Local Area Network的简称,指应用无线通信技术将计算机设备互联起来。

WLAN起步于1997年。当年的6月,第一个无线局域网标准IEEE802. 11正式颁布实施,为无线局域网技术提供了统一标准,但当时的传输速率只有1~2 Mbit/s。随后,IEEE委员会又开始制定新的WLAN标准,分别取名为IEEE802.11a和IEEE802. 11b。IEEE802. llb标准首先于1999年9月正式颁布,其速率为11 Mbit/s。经过改进的IEEE802. 11a标准,在2001年年底才正式颁布,它的传输速率可达到54 Mbit/s,几乎是IEEE802. llb标准的5倍。尽管如此,WLAN的应用并未真正开始,因为整个WLAN应用环境并不成熟。

目前使用最多的是802. 11n(第四代)和802. 11ac(第五代)标准,它们既可以工作在2.4 GHz频段也可以工作在5 GHz频段上,传输速率可达600 Mbit/s(理论值)。但严格来说只有支持802. 11ac的才是真正5G,现来在说支持2.4 G和5G双频的路由器其实很多都是只支持第四代无线标准,也就是802. 11n的双频,而真正支持ac 5G的路由最便宜的都要四五百元甚至上千元。

移动网络

4G与5G的区别

在有线介质上传播数据,想要高速很容易,实验室中,单条光纤最大速度已达到了26Tbps。

无线电磁波传播,才是瓶颈。

3/4/5G的频率

3G的四种标准和频段:CDMA2000、WCDMA、TD-SCDMA、WiMAX,1880MHz-1900MHz和2010MHz-2025MHz。

4G的频率和频段是:1880-1900MHz、2320-2370MHz、2575-2635MHz。

我国的5G初始中频频段,3.3-3.6GHz、4.8-5GHz两个频段。24.75-27.5GHz、37-42.5GHz高频频段正在征集意见。国际上主要使用28GHz进行试验

路由器

MAC地址20-6B-E7-DB-D7-33

WAN口与LAN口

WAN是英文Wide Area Network的首字母所写,即代表广域网;而LAN则是Local Area Network的所写,即本地网(或叫局域网)。WAN口主要用于连接外部网络,而LAN口用来连接家庭内部网络,两者主要会在标识上面有区别,此外大部分路由器的WAN口只有一个,LAN口则有四个或以上。

管理界面

根据路由器背面的提示登陆,可以修改Wi-Fi名称密码、限制设备上下行速率以及黑名单设备。(注意关闭clash代理

DHCP服务器

Dynamic Host Configuration Protocol动态主机配置协议是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。担任DHCP服务器的计算机需要安装TCP/IP协议,并为其设置静态IP地址、子网掩码、默认网关等内容。

采用DHCP方式对上网的用户进行临时的地址分配。也就是你的电脑连上网,DHCP服务器才从地址池里临时分配一个IP地址给你,每次上网分配的IP地址可能会不一样,这跟当时IP地址资源有关。

SSID

Service Set Identifier是指服务集标识。SSID技术可以将一个无线局域网分为几个需要不同身份验证的子网络,每一个子网络都需要独立的身份验证,只有通过身份验证的用户才可以进入相应的子网络,防止未被授权的用户进入本网络。

无线信道

信道,也称作通道或频段。无线信号是以某一频率传送数据的。2.4G频段的工作频率为2.4-2.4835GHz,这83.5MHz频带划分为13个信道,各信道中心频率相差5MHz,向上向下分别扩展11MHz,信道带宽22MHz。中国采用欧洲/ETSI标准,使用1-13信道。

频段带宽

20Mhz和40Mhz的区别,你可以想象成道路的宽度,宽度越宽当然同时能跑的数据越多,也就提高了速度。

20MHz对应的是65M带宽,穿透性相对较好,40MHz对应的是150M带宽,穿透性肯定不如20MHz 所以追求稳定的话就选择20MHz,近距离传输就可以选择40MHZ。

当然,无线网的“道路”是大家共享的,一共就这么宽(802.11 b/g/n的频带是 2.412Ghz ~ 2.472Ghz,一共60Mhz。像802.11a/n在中国可用的频带是5.745Ghz ~ 5.825Ghz,同样也是60Mhz),你占用的道路宽了,跑得数据多了,当然就更容易跟别人撞车,一旦撞车大家就都会慢下来,比你在窄路上走还要慢。

如图,原来挤一挤可以四个人同时用的,如果你用了40Mhz的话就只能两个人同时用了。所以哪个更好的问题和你多大的房子无关,最主要的是你附近有多少个人跟你一起上路的,用NetStumbler这种扫描软件可以很容易看清楚周围频带的占用情况,如果你附近没什么人用,那么恭喜你,用40Mhz来享受高速吧!如果周围“车辆”很多,那么你最好还是找一个车少点的“车道”,老老实实用20Mhz比较好。

NetStumbler

04年停止更新的软件,不支持我笔记本的网卡

Intel WIFI6 ax200 160MHz

11bgn mixed

无线协议: 11b..=网络速度运行在11b网络标准,11g..=网络速度运行在11g网络标准,11n..=网络速度运行在11n网络标准。

如果你不知道你的无线设备是什么级别,802.11b/g/n是最好的选择。如果只使用.11n,旧设备可能存在兼容性问题。当然,速度是支持N的最快方式,但是它必须与特定的设备相结合。

实际的情况是,无线局域网的实际传输速度只能达到产品标称最大传输速度的一半以下;比如802.11b理论最大速度为11M,通过笔者的测试,在无线网络环境较好的情况下,传输100MB的文件需要3分钟左右;而相同的环境,换为支持802.11g的产品,传输100MB的文件就只需要30秒左右。

150M的网络理论下载速率

150M 全写是 150Mbps,注意这里是小b,是位数。所以与MB的兆字节是不一样的,需要除8,加上一点损耗。150Mbps网络有15MB/s就不错了。

怎么判断网络是百兆还是千兆

  1. 通过路由器WAN口速率设置,10/100M自动协商

如果是有线PC的话,看网卡信息,如果连接速度是1G的就是千兆网络,如果100M 就是百兆。

第二种方法: 测试下载速度,如果下载速度能够达到12.5MB/s以上就是千兆(1000/8),反之就是百兆。

第三种方法: 看交换机上的速度灯,如果千兆灯亮就是千兆,百兆灯亮就是百兆。如图(绿灯千兆,黄灯百兆)

家里明显是加强的百兆网络。

全双工和半双工

区别是:1、全双工允许数据在两个方向上同时传输;2、半双工允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输,实际上是切换的单工。

同样是100M的链路,一条是全双工,另一条是半双工,如果两条链路上都进行单向通信的话,理论上是都可以达到100M的(注意:这里全双工也只有100M),但是如果两条链路都进行双向通信就不一样了,双向通信时,全双工的链路的吞吐量是200M(两个方向每个方向上都是100M),而半双工最大也只有100M。但是虽然全双工的最大吞吐量能够达到200M,但是他使用的最大带宽永远都是100M,你不可能将双向的200M变成单向的200M。

因此全双工的带宽=半双工的带宽,全双工的吞吐量=2×半双工的吞吐量。

WPA2-PSK

WPA/WPA2

WPA/WPA2是一种最安全的加密类型,不过由于此加密类型需要安装Radius服务器,因此,一般普通用户都用不到,只有企业用户为了无线加密更安全才会使用此种加密方式,在设备连接无线WIFI时需要Radius服务器认证,而且还需要输入Radius密码。

WPA-PSK/WPA2-PSK

WPA-PSK/WPA2-PSK是我们现在经常设置的加密类型,这种加密类型安全性能高,而且设置也相当简单,不过需要注意的是它有AES和TKIP两种加密算法。 1. TKIP:Temporal Key Integrity Protocol(临时密钥完整性协议),这是一种旧的加密标准。 2. AES:Advanced Encryption Standard(高级加密标准),安全性比 TKIP 好,推荐使用。

使用AES加密算法不仅安全性能更高,而且由于其采用的是最新技术,因此,在无线网络传输速率上面也要比TKIP更快。

CommView

软件首次运行时,会提示你安装一个特别的无线网卡驱动,这个驱动可以使你的无线网卡处在混杂模式,接收周围的任何无线报文。

软件启动时,无线网卡模式被改变,无线网络是无法使用的。

我虽然看不懂,但是我大受震撼。但是只能5分钟试运行

无线传输原理

比如,我在图书馆上网的时候,我的电脑并没有收到对面妹子的web请求包回复啊?无线数据包已经发送到你的无线网卡,但是你的网卡一看(主要受网卡驱动影响),不是我的请求数据包啊,于是丢弃了。

使用commview for wifi破解Windows无线网络WEP加密的密钥

需要进一步的研究学习

为什么comview里好多华为,是很多人开了手机热点吗?

Type – node type. Possible values are AP (for access points), STA (for stations in infrastructure mode) and AD HOC (for stations in ad hoc mode).

家庭网络改造

当前现状

  1. 套餐:公务员免费移动百兆套餐
  2. 网络设备:
  3. 光猫自带的wifi,最高只支持到wifi4 的2.4GHz
  4. 不支持ipv6的垃圾TP-link路由器

改进

  1. 将路由器更换为wifi6,直接跑满百兆(在学校里都能随便千兆的)

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

暑假回到家,把家里的WiFi弄一下

参考文献

https://www.zhihu.com/question/53878059

OpenWRT on router

OpenWRT Installation on router

原理

原理在路由器的两个flash(firmware和firmware1)的两个系统里,写入一个支持图形化OpenWRT的新系统

查看路由器型号是否支持

查看系统型号[^1]:路由器默认是魔改的openwrt的系统:

root@XiaoQiang:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="18.06-SNAPSHOT"
ID="openwrt"
ID_LIKE="lede openwrt"
PRETTY_NAME="OpenWrt 18.06-SNAPSHOT"
VERSION_ID="18.06-snapshot"
HOME_URL="http://openwrt.org/"
BUG_URL="http://bugs.openwrt.org/"
SUPPORT_URL="http://forum.lede-project.org/"
BUILD_ID="unknown"
LEDE_BOARD="mediatek/mt7622"
LEDE_ARCH="aarch64_cortex-a53_neon-vfpv4"
LEDE_TAINTS="no-all glibc busybox"
LEDE_DEVICE_MANUFACTURER="OpenWrt"
LEDE_DEVICE_MANUFACTURER_URL="http://openwrt.org/"
LEDE_DEVICE_PRODUCT="Generic"
LEDE_DEVICE_REVISION="v0"
LEDE_RELEASE="OpenWrt 18.06-SNAPSHOT unknown"

刷入OpenWRT后:

root@ax6s:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="22.03.2"
ID="openwrt"
ID_LIKE="lede openwrt"
PRETTY_NAME="OpenWrt 22.03.2"
VERSION_ID="22.03.2"
HOME_URL="https://openwrt.org/"
BUG_URL="https://bugs.openwrt.org/"
SUPPORT_URL="https://forum.openwrt.org/"
BUILD_ID="r19803-9a599fee93"
OPENWRT_BOARD="mediatek/mt7622"
OPENWRT_ARCH="aarch64_cortex-a53"
OPENWRT_TAINTS=""
OPENWRT_DEVICE_MANUFACTURER="OpenWrt"
OPENWRT_DEVICE_MANUFACTURER_URL="https://openwrt.org/"
OPENWRT_DEVICE_PRODUCT="Generic"
OPENWRT_DEVICE_REVISION="v0"
OPENWRT_RELEASE="OpenWrt 22.03.2 r19803-9a599fee93"

路由器开启dropbear

dropbear 是一种轻量级sshd服务

nvram set ssh_en=1  # 不是1也退出1
/etc/init.d/dropbear start # 脚本start段里增加了判断,稳定版不让启动直接退出
netstat -n # 查看22端口

修改/etc/dropbear/authorized_keys 来添加ssh公钥

Redmi-Ax6s实操

参考教程,和具体的视频

Step1: 打开 telnet access

  1. installing a beta version of the stock firmware (miwifi_rb03_firmware_stable_1.2.7_closedbeta.bin)上传文件安装

Step2: 获取密码,本地运行返回密码。<S/N>为产品序列号(可以在路由器下面的标签上找到序列号。)

#!/usr/bin/env python3
import sys
import hashlib

if sys.version_info < (3,7):
    print("python version is not supported", file=sys.stderr)
    sys.exit(1)

# credit goes to zhoujiazhao:
# https://blog.csdn.net/zhoujiazhao/article/details/102578244

salt = {'r1d': 'A2E371B0-B34B-48A5-8C40-A7133F3B5D88',
        'others': 'd44fb0960aa0-a5e6-4a30-250f-6d2df50a'}


def get_salt(sn):
    if "/" not in sn:
        return salt["r1d"]

    return "-".join(reversed(salt["others"].split("-")))


def calc_passwd(sn):
    passwd = sn + get_salt(sn)
    m = hashlib.md5(passwd.encode())
    return m.hexdigest()[:8]


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <S/N>")
        sys.exit(1)

    serial = sys.argv[1]
    print(calc_passwd(serial))

Step3: telnet到机器上(ssh不行). 密码为前面设置的(登录上去passwd把密码改简单)

XiaoQiang login: root
Password:


BusyBox v1.25.1 (2021-10-25 11:02:56 UTC) built-in shell (ash)

-----------------------------------------------------
    Welcome to XiaoQiang!
-----------------------------------------------------
$$$$$$\  $$$$$$$\  $$$$$$$$\      $$\      $$\        $$$$$$\  $$\   $$\
$$  __$$\ $$  __$$\ $$  _____|     $$ |     $$ |      $$  __$$\ $$ | $$  |
$$ /  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ /  $$ |$$ |$$  /
$$$$$$$$ |$$$$$$$  |$$$$$\         $$ |     $$ |      $$ |  $$ |$$$$$  /
$$  __$$ |$$  __$$< $$  __|        $$ |     $$ |      $$ |  $$ |$$  $$<
$$ |  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ |  $$ |$$ |\$$\
$$ |  $$ |$$ |  $$ |$$$$$$$$\       $$$$$$$$$  |       $$$$$$  |$$ | \$$\
\__|  \__|\__|  \__|\________|      \_________/        \______/ \__|  \__|


root@XiaoQiang:~# ls

Step4: 先备份, 路由器flash有若干分区,其中有一个分区存储路由器MAC地址、无线校准参数等。若损坏可能导致无线信号弱等问题。因此刷之前最好备份。

  1. 通过cat /proc/mtd,知道对应关系

    root@XiaoQiang:/tmp# cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 07f80000 00020000 "ALL"
    mtd1: 00080000 00020000 "Bootloader"
    mtd2: 00040000 00020000 "Config"
    mtd3: 00040000 00020000 "Bdata"
    mtd4: 00040000 00020000 "Factory"
    mtd5: 00040000 00020000 "crash"
    mtd6: 00040000 00020000 "crash_syslog"
    mtd7: 00040000 00020000 "cfg_bak"
    mtd8: 00400000 00020000 "kernel0"
    mtd9: 00400000 00020000 "kernel1"
    mtd10: 01a00000 00020000 "rootfs0"
    mtd11: 01a00000 00020000 "rootfs1"
    mtd12: 02600000 00020000 "overlay"
    mtd13: 01b80000 00020000 "obr"
    mtd14: 00c1c000 0001f000 "ubi_rootfs"
    mtd15: 021e8000 0001f000 "data"
    
  2. 备份,其中Factory中存储了EEPROM的数据

    cat /dev/mtd4 > Factory.dump
    cat /dev/mtd3 > Bdata.dump
    
    #on windows
    scp [email protected]:/tmp/factory.bin .
    scp [email protected]:/tmp/factory.bin .
    

Step5: 准备刷OpenWRT

  1. 路由器ssh终端,配置环境变量

    ```bash
    # nvram写入flash
    # Enable uart and boot_wait, useful for testing or recovery if you have an uart adapter!
    nvram set ssh_en=1
    # 设置串口打开,以便ssh失败时,硬件debug
    nvram set uart_en=1 
    nvram set boot_wait=on
    
    # Set kernel1 as the booting kernel
    nvram set flag_boot_success=1
    nvram set flag_try_sys1_failed=0
    nvram set flag_try_sys2_failed=0
    
    # Commit our nvram changes
    nvram commit
    ```
    
  2. 电脑本地准备传输可执行文件(开启了ssh服务,直接scp传上去即可)

    1. Rename the file openwrt-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin you previously downloaded to your computer to factory.bin
    2. in the same directory where the file factory.bin is located, run the following command python -m http.server
  3. 路由器ssh终端,配置环境变量接受并运行

    cd /tmp
    wget http://<IP address of your computer>:8000/factory.bin
    mtd -r write factory.bin firmware
    
  4. 完成后重启,默认ip变成192.168.1.1

  5. 失败加上nvram set "boot_fw1=run boot_rd_img;bootm" 重来

WireGuard Server in OpenWRT

OpenWRT换软件安装源

修改/etc/opkg/distfeeds.conf的配置,参考

下面为x86软路由的源(由于是snapshot的安装不了,内核不匹配),如果是arm的需要看对应架构代号。

src/gz openwrt_core https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/targets/x86/64/packages
src/gz openwrt_base https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/base
src/gz openwrt_luci https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/routing
src/gz openwrt_telephony https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/telephony

比如ax6s

[root@ax6s ~]$ cat /etc/opkg/distfeeds.conf
src/gz openwrt_core https://downloads.openwrt.org/releases/22.03.2/targets/mediatek/mt7622/packages
src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/base
src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/luci
src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/packages
src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/routing
src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/telephony

可以通过cat /etc/os-release查看, 上面的如下

root@OpenWrt:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="SNAPSHOT" # snapshot是开发版的意思
PRETTY_NAME="OpenWrt SNAPSHOT"
VERSION_ID="snapshot"
BUILD_ID="r5636-25f88e06f"
OPENWRT_BOARD="x86/64"
OPENWRT_ARCH="x86_64"

[root@ax6s ~]$ cat /etc/os-release
NAME="OpenWrt"
VERSION="22.03.2"
PRETTY_NAME="OpenWrt 22.03.2"
VERSION_ID="22.03.2"
BUILD_ID="r19803-9a599fee93"
OPENWRT_BOARD="mediatek/mt7622"
OPENWRT_ARCH="aarch64_cortex-a53"

WireGuard安装服务端程序

  1. eSir精品小包固件下载地址(感谢esir的辛勤付出)
  2. 内置了wireguard(使用对等节点的公私钥加密)
  3. OpenWrt安装WireGuard命令(eSir精品小包已集成WireGuard,无需安装)

    opkg update
    opkg install luci-proto-wireguard luci-app-wireguard wireguard kmod-wireguard wireguard-tools
    reboot
    
    # x86
    opkg install wireguard luci-app-wireguard luci-i18n-wireguard-zh-cn wireguard-tools
    

WireGuard服务端设置

具体步骤
  1. 配置WG服务器端公私钥
  2. OpenWrt的luci界面配置服务器节点
  3. OpenWrt-网络-防火墙设置
    1. 如果OpenWrt做主路由,还需要在防火墙->通信规则中开放端口
    2. 假如是旁路由,需要设置端口转发
  4. 为每个客户端节点创建密钥
  5. OpenWrt->网络->接口,修改原本的WG0设置。修改Peers 1. 左下角更多选项选择预共享密钥,添加 2. 由于不能同时用,所以每个机器要单独配置,不能公用

WireGuard客户端设置

客户端模板文件test.conf

[Interface]
Address = 192.168.100.2 约定的IP
PrivateKey = cprivatekey文件内容 
DNS = 路由器IP


[Peer]
PublicKey = spublickey文件内容  

AllowedIPs = 0.0.0.0/0
//上面代表所有流量走WG。如果启用下面这行代码,表示只有192.168.2.0/24, 192.168.100.0/24这两个子网的IP走WireGuard
//逗号前是家庭局域网的IP段,后面是VPN的IP段
//AllowedIPs = 192.168.2.0/24, 192.168.100.0/24

PresharedKey=sharedkey内容
Endpoint = 公网IP(动态域名):端口号
PersistentKeepalive = 25

WireGuard配置匹配一览图

"[Interface] Address" is the address that gets assigned to the (virtual) network interface (e.g. wg0). 简单来说客户端和服务器端约定的相同的虚拟地址来通信。 注意防火墙放行端口 官方客户端软件下载

WireGuard常见问题

注意:如果连接不上

  1. 首先保证路由器有网,不是路由器下的电脑有网
  2. 上次师兄的电脑开了OpenVPN上网,导致路由器ipv6能ping通,但是不能上网
  3. 注意防火墙,一个是wan口允许某几个端口进来(wg连接请求)。另一个是wan能到wg,wg也能到wan,才能实现上网
  4. 至于和lan的关系,如果需要通过wg访问lan口下的设备(nas,电脑)再打开即可。

Clash in OpenWrt

  • 安装版本来自github
  • 但是由于DDNS会出问题,所以关闭了。(可以考虑2次wireguard蹭网和clash for linux)
  • BT,PT有时也会被代理,需要注意。

安装编译好的 IPK 文件(openwrt 的软件包)

安装依赖

#iptables
opkg update
opkg install coreutils-nohup bash iptables dnsmasq-full curl ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base

#nftables
opkg update
opkg install kmod-nft-tproxy

wget https://github.com/vernesong/OpenClash/releases/download/v0.45.59-beta/luci-app-openclash_0.45.59-beta_all.ipk
root@ax6s:/tmp# opkg install luci.ipk
Installing luci-app-openclash (0.45.59-beta) to root...
Configuring luci-app-openclash.
cfg117882

重启后出现

注意不会代理ping,所以ping不通的话,可以用curl来测试代理是否生效。https失败可以尝试http

安装问题

Collected errors:
 * check_data_file_clashes: Package dnsmasq-full wants to install file /etc/hotplug.d/ntp/25-dnsmasqsec
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /etc/init.d/dnsmasq
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/lib/dnsmasq/dhcp-script.sh
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/sbin/dnsmasq
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/acl.d/dnsmasq_acl.json
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/dnsmasq/dhcpbogushostname.conf
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/dnsmasq/rfc6761.conf
        But that file is already provided by package  * dnsmasq
 * opkg_install_cmd: Cannot install package luci-app-openclash.

解决办法如下

opkg update
opkg remove dnsmasq && opkg install dnsmasq-full 

DDNS in OpenWRT

DDNS简介

Dynamic DNS: 根據網際網路的域名訂立規則,域名必須跟從固定的IP位址。但動態DNS系統為動態網域提供一個固定的名稱伺服器(Name server),透過即時更新,使外界使用者能夠連上動態使用者的網址。

cloudflare动态域名 或者阿里云动态域名的DDNS都是很好的选择。

定时脚本实现DDNS

[root@ax6s ~]$ cat ddns.sh
#!/bin/bash

Network=wan@eth0

Date=`echo $'\n\n' >> /tmp/ddns_ipv4`
Date=`echo "$(date)" >> /tmp/ddns_ipv4`
IPv4=`ip a|grep -A 2 ${Network}|sed -n '3p'|awk  '{print $2}' |sed -e 's/\/[0-9]*//'`
echo $IPv4 >> /tmp/ddns_ipv4
IPv6=`ip a|grep -A 4 ${Network}|sed -n '5p'|awk  '{print $2}' |sed -e 's/\/[0-9]*//'`
echo $IPv6 >> /tmp/ddns_ipv4

curl -v http://v6.sync.afraid.org/u/4TY5…………tKF/?address=${IPv6} 2>&1 >> /tmp/ddns_ipv4
curl -v http://sync.afraid.org/u/M8uh9Zf…………ryjxs/?address=${IPv4} 2>&1 >> /tmp/ddns_ipv4

修改crontab -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
4,9,14,19,24,29,34,39,44,49,54,59 * * * * sleep 11 ; /root/ddns.sh

OpenWRT 为局域网设备设置IPv6 DDNS

脚本围绕,打印邻居路由表命令

[root@ax6s ~]$ ip -6 neigh | grep 2c:f0:5d
2001:da8:d800:611:1818:61b6:6422:56a1 dev br-lan lladdr 2c:f0:5d:ac:1d:2c DELAY
2001:da8:d800:611:5464:f7ab:9560:a646 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE
2001:da8:d800:611:4d13:ead8:9aaf:bfc4 dev br-lan lladdr 2c:f0:5d:ac:1d:2c REACHABLE
2001:da8:d800:611:a063:863f:caa3:4a73 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE
2001:da8:d800:611:8c75:4f49:f9d0:42b6 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE

新建 /usr/lib/ddns/dynamic_dns_iphelper.sh

#!/bin/sh

get_ip(){
    MAC=$1
    if [ "$MAC" = "" ]
    then
        exit 0
    fi
    IP=$(ip -6 neigh | grep -i $MAC | grep -v "fe80:" | grep -E "REACHABLE|STALE" | cut -d" " -f1 | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){8}")
    if [ "$IP" = "" ]
    then
        IP=$(mac_to_ipv6_ll $MAC $(get_ip_prefix))
    fi
    echo $IP
}

mac_to_ipv6_ll() {
    PREFIX="fe80::"
    if [ "$#" = 2 ]; then
        PREFIX=$2
    fi
    IFS=':'; set $1; unset IFS
    echo "$PREFIX$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

get_ip_prefix() {
    IP_PREFIX=$(ip -6 addr | awk '{print $2}' | grep '::1' | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){4}")
    echo $IP_PREFIX
}

if [ "$1" != "" ]; then
    echo `get_ip $1`
fi

新建 /usr/lib/ddns/getip_demo.sh

#!/bin/sh

. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 遵循 EUI-64 的设备使用这个方式 可以获取到静态后缀的IPv6地址
# 00:00:00:00:00:00修改为目标设备的MAC地址
echo $(mac_to_ipv6_ll "00:00:00:00:00:00" $(get_ip_prefix))

# 或者
#!/bin/sh

. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 00:00:00:00:00:00修改为目标设备的MAC地址
# 不遵循 EUI-64 的设备 可以获取到动态IPv6地址
echo `get_ip "00:00:00:00:00:00"`

脚本chmod +x就行

School Network

  • 根据学校的网络通各个端口的说明,0号端口没有经过NAT,登录之后获得公网ipv4。但是IPv4封了许多端口(至少ssh的22端口是不行的)
  • IPv6是直接可以ssh访问的。

参考文献

https://www.youtube.com/watch?v=F8z74oE71Gg&t=19s

https://xiumu.org/technology/openwrt-set-for-local-area-network-lan-equipment-ipv6-ddns.shtml

FTP

FTP简介

FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。

主动与被动模式

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

区别主要在于数据通道的建立方式:

  • 主动模式:服务器向客户端敲门,然后客户端开门
  • 在主动模式中,客户端向服务器发送一个随机端口号,服务器再用这个端口号和客户端建立数据通道。这样,服务器需要知道客户端的 IP 地址和端口号,并且能够穿透客户端的防火墙。
  • 如果通过代理上网的话,就不能用主动模式,因为服务器敲的是上网代理服务器的门,而不是敲客户端的门
  • 客户端也不是轻易就开门的,因为有防火墙阻挡,除非客户端开放大于1024的高端端口
  • 被动模式:客户端向服务器敲门,然后服务器开门
  • 在被动模式中,服务器向客户端发送一个随机端口号,客户端再用这个端口号和服务器建立数据通道。这样,客户端不需要公开自己的 IP 地址和端口号,并且只需要打开出站连接的防火墙。

ftp命令行登录

ftp ip
lftp user@site:port

常用命令

  1. 下载文件通常用get和mget这两条命令。
  2. 上传文件put和mput
  3. 断开连接bye

ftp空间

但是这个是当前目录的文件,不包括文件夹 1字节=1B,1024B=1KB

Ubuntu ftp服务器部署

vsftpd

  1. 安装
sudo apt install vsftpd # 安装
  1. 配置文件 /etc/vsftpd/vsftpd.conf
 local_enable=YES # 是否允许本地用户访问  
 local_root=/home/kaikai_ftp/ftpdir # 自定义上传根目录
 write_enable=YES # 允许用户修改文件权限
  1. vsftpd虚拟用户
  2. 运行
systemctl restart vsftpd.service
重启
sudo service vsftpd start
开机启动
sudo systemctl enable vsftpd
查看运行情况
sudo service vsftpd status

vsftpd虚拟用户

虚拟用户
  1. 虚拟用户,只对ftp有效的用户。这些用户不可以登录Linux系统,只可以登录ftp服务器。其实就是一个本地用户映射成多个只对ftp服务器有效的虚拟用户。虚拟用户可以有自己的ftp配置文件,因此通常利用虚拟用户来对ftp系统的不同用户制定不同的权限,以达到安全控制的目的。与虚拟用户有关的设置以guest_开头。
  2. 匿名用户,也就是不需要输入密码就可登录ftp服务器的用户,这个用户名通常是ftp或anonymous; 与匿名用户有关的设置多以 anon_选项开头。
  3. 本地用户,也就是你Linux系统上可登录到系统的用户,这些用户是在系统上实实在在存在的用户。通常会有自己的home,shell等。与本地用户有关的设置多以local_开头或包含local_的选项。

●所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录

●各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

具体命令
  1. 创建用户数据库文件
vim /etc/vsftpd/vusers.txt
    ftp123
    ftp2333
  1. 文件需要被加密编码为hash格式奇数行为用户名,偶数行为密码
sudo apt-get install db-util # install db_load
sudo db_load -T -t hash -f vusers.txt vusers.db #该 db_load 实用程序可用于将文本文件加载到数据库中
chmod 600 vusers.db
  1. 创建用户和访问FTP目录
sudo useradd -d /data/ftproot -s /sbin/nologin -r vuser
    # -d, --home-dir HOME_DIR       home directory of the new account
    # -s, --shell SHELL             login shell of the new account
    # -r, --system                  create a system account
mkdir -pv /data/ftproot/upload #-pv 是没有父路径也会创建
setfacl -m u:vuser:rwx /data/ftproot/upload
    # set file access control lists
    # -m, --modify
#chmod a=rx /data/ftproot/  如果自动创建家目录,需要改权限
  1. 创建pam配置文件
vim /etc/pam.d/vsftpd.db
 auth required pam_userdb.so db=/etc/vsftpd/vusers
 account required pam_userdb.so db=/etc/vsftpd/vusers
  1. 指定pam配置文件
vim /etc/vsftpd/vsftpd.conf

pam_service_name=vsftpd.db
userlist_enable=YES

guest_enable=YES #所有系统用户都映射成guest用户
guest_username=vuser #配合上面选项才生效,指定guest用户
user_config_dir=/etc/vsftpd/vusers.d/  #虚拟用户设置独立的配置文件
write_enable=YES

anonymous_enable=NO # 匿名访问是否允许,默认不要开启
local_enable=YES # 是否允许本地用户访问  
local_root=/home/shaojiemike/ftpdir # 自定义上传根目录
虚拟用户设置独立的配置文件

指定各用户配置文件存放的路径

vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/

创建各个用户的配置文件存放路径,配置文件的文件名需要与用户名一致。 没有独立配置文件的虚拟用户会遵守/etc/vsftpd/vsftpd.conf这个主配置文件的权限配置。

mkdir /etc/vsftpd/vusers.d/
cd /etc/vsftpd/vusers.d/
vim ftp123
    # 允许用户有自己的上传目录以及上传权限,添加这些参数以及值
    local_root=/tmp/vutest_d
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    allow_writeable_chroot=YES

建立目录,更改目录的所有者与所属组

mkdir /tmp/vutest_d
chown vuser:vuser  /tmp/vutest_d   #还是那句话,用户能不能上传不仅与配置文件有关,还与目录是否有w权限有关,两个权限都开启才能正确上传。
chmod 755 upload

Linux-PAM 的配置文件

PAM 的各个模块一般存放在 /lib/security/ 或 /lib64/security/ 中,以动态库文件的形式存在,文件名格式一般为 pam_*.so。

PAM 的配置文件可以是 /etc/pam.conf 这一个文件,也可以是 /etc/pam.d/ 文件夹内的多个文件。如果 /etc/pam.d/ 这个文件夹存在,Linux-PAM 将自动忽略 /etc/pam.conf。

  1. /etc/pam.conf 类型的格式如下:
服务名称  工作类别  控制模式  模块路径  模块参数
  1. /etc/pam.d/ 类型的配置文件通常以每一个使用 PAM 的程序的名称来命令。比如 /etc/pam.d/su,/etc/pam.d/login 等等。还有些配置文件比较通用,经常被别的配置文件引用,也放在这个文件夹下,比如 /etc/pam.d/system-auth。这些文件的格式都保持一致:
工作类别  控制模式  模块路径  模块参数

需要进一步的研究学习

Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's capabilities.

遇到的问题

530 Login incorrect.
Login failed.
  1. 尝试改shell,但首先不是这个问题
cat /etc/shells #没有/sbin/nologin
sudo usermod -s /bin/bash vuser
cat /etc/passwd #shell改好了
  1. 查看报错 我以为我是修改错文件了,但是好像没怎么简单
  2. 添加
guest_enable=YES   # 开启虚拟用户
guest_username=vuser  # FTP虚拟用户对应的系统用户,即第四步添加的用户

报错 后来发现原因是,变量这一行不要加注释 guest_enable=YES # 开启虚拟用户 4. 只改pam的路径为pam.db 报错 这很明显是没有指定用户

实际问题

home.ustc.edu.cn

ftp 上传的内容几秒中之内被覆盖了。这是学校网站的保护机制吗?(我之前调试修改太多了?)

   ftp> get index.html
   local: index.html remote: index.html
   200 EPRT command successful. Consider using EPSV.
   150 Opening BINARY mode data connection for index.html (360991 bytes).
   226 File send OK.
   360991 bytes received in 0.01 secs (25.7474 MB/s)
   ftp> get index.html
   local: index.html remote: index.html
   200 EPRT command successful. Consider using EPSV.
   150 Opening BINARY mode data connection for index.html (16116 bytes).
   226 File send OK.
   16116 bytes received in 0.00 secs (15.3082 MB/s)

I try single command line put site/index.html index.html and after a minute get index.html get the old file.

My USTC homepage is blocked

ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
drwxr-xr-x   46 0        0            4096 Oct 25 10:03 public_html.old
226 Directory send OK.
ftp> mkdir public_html
550 Create directory operation failed.
ftp> put jumpPage.html
local: jumpPage.html remote: jumpPage.html
200 EPRT command successful. Consider using EPSV.
553 Could not create file.

参考文献

https://www.jianshu.com/p/ac3e7009a764

https://blog.csdn.net/frank_ci/article/details/108847358

https://blog.csdn.net/enweitech/article/details/51330664

Webdav

简介

Webdav

WebDAV由互联网工程任务组的工作组在RFC 4918中定义。是基于Web的分布式编写和版本控制(WebDAV)是超文本传输协议(HTTP)的扩展,

WebDAV协议为用户在服务器上创建,更改和移动文档提供了一个框架。有利于用户间协同编辑和管理存储在万维网服务器文档。

WebDAV协议最重要的功能包括: * 维护作者或修改日期的属性、名字空间管理、集合和覆盖保护。 * 维护属性包括创建、删除和查询文件信息等。 * 名字空间管理处理在服务器名称空间内复制和移动网页的能力。 * 集合(Collections)处理各种资源的创建、删除和列举。 * 覆盖保护处理与锁定文件相关的方面。

  • 可以使用https来保证安全

Samba / CIFS

局域网传输,没有加密

群晖开启WebDaV

参考教程, 开启 https 5555 端口, http 5556端口

设置特殊用户keeweb来访问下载文件夹keeweb下内容。如https://10.0.233.3:5555/keeweb/1.txt

windows挂载

安装RaiDrive

测速

大文件

在1.63GB大文件的时候,SMB能稳定的跑满千兆全速

2M中文件

首先通过split来拆分文件来测试

split -b 2M 1.mkv split.mkv
在2M的时候,WebDav有些许优势

4K小碎片

在4K的时候,WebDav较大优势

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

  1. 网上有传言 WebDav 比 SMB快 8~9倍,但是有人质疑是缓存的原因
  2. keepass同步可以通过坚果云的WebDav

参考文献

https://www.rmnof.com/article/better-ways-to-use-webdav/