通过SSH隧道端口转发实现内网穿透
前面介绍了一种使用V2ray实现的内网穿透方法,虽然达成了目的,但有诸多不足,例如必须在两台设备上同时运行V2ray,配置文件比较难懂等。尤其是对平时没有科学上网需求(自然也没有科学上网经历)的同学而言,下载V2ray本就是件令人头疼的事。
但事实上,常用的ssh命令也可以用来搞内网穿透,只需要一条命令即可。
现在假设我们面临如下图所示的一种情形:
左侧蓝色框内为家里的局域网,其中包含了一台运行80端口Web服务的服务器Server C,其内网IP为192.168.1.100,通过路由器的NAT地址转换接入Internet。右侧绿色框内为外部的互联网,其中有一台拥有公网IP地址(1.2.3.4)的服务器Server B。另有一台能访问互联网,但未接入左侧局域网的设备Laptop A。现Laptop A想通过连接Server B的8080端口来访问Server C80端口上的Web服务。
可见该情形就是最一般的内网穿透情形,在上面的网络拓扑结构中,既然Server B拥有公网IP,我们可以不过分地假设Server C能通过SSH与Server B建立连接,其中,Server B的SSH ...
大陆iOS系统免拔卡解锁TikTok
郑重声明:本文所介绍内容主要是为了方便学习、娱乐、开拓国际视野。请遵守本国法律法规,切勿在任何地方发布分裂国家,涉恐等违法犯罪的言论。
得益于一些政策,在中国大陆的我们没有办法直接浏览TikTok(抖音海外版),由于TikTok会通过一些方法检测你的电话卡,把大陆的运营商进行屏蔽,因此即便你挂满了梯子,也没有办法浏览TikTok。本文对iOS系统解决这一问题的过程进行了总结,力图让萌新踩更少的坑。
本文参考自下面仓库:
引用站外地址,不保证站点的可用性和安全性
TikTok-Unlock
GitHub
首先,你得有个梯子。
最简单粗暴的方法:直接拔卡,但该方法对于只有一台手机设备,没有平板的穷人而言不太友好,因此下面给出一种不需要拔卡的方法。
此教程所使用的软件为Shadowrocket。
操作过程只需按上面链接,找到关于Shadowrocket的部分,若你使用的是其他软件,可以自己 ...
编写一个自己的QQ机器人
更新于2022/9:由于tx增强了风控,我的QQ机器人无法在服务器上进行登录,不排除后期继续加大风控力度的可能,因此我决定不再折腾QQ机器人,而转战生态更丰富、交互性更好的Telegram Bot。
很早以前用过一段时间酷Q平台开发的机器人客户端,结合自己的逻辑进行各种消息的处理回复,但后来因为某种原因,平台跑路了,因此QQ机器人的开发也搁置了一年左右。这两天又想重新通过一些其他途径把机器人整起来。
本次QQ机器人的搭建过程用到了go-cqhttp项目与nonebot库(作为Python接口),操作系统是64位ARM架构的Linux,当然,需要注册一个QQ小号。
安装go-cqhttp并登录账号从上面的项目中选择适合64位ARM架构Linux系统(请根据自己的操作系统进行选择)的release最新版本,写此文时,最新版为v1.0.0-beta4,将其上传到目标系统,解压,得到三个文件,其中,文件go-cqhttp为可执行文件,为其添加执行权限:
sudo chmod +x go-cqhttp
然后执行:
./go-cqhttp
首次执行该程序,会在当前路径下生成一个配置文件(conf ...
如何在一些常用设备(操作系统)上访问局域网内的Samba服务
前面文章中写到了Samba服务的部署过程,但未提到如何在局域网的其他设备上访问该服务以获取共享的文件,虽然这些东西谷歌一查就有,但我还是想水个文章,对常用操作系统上访问该服务的方法做一个总结。
Windows 10/11在Windows 10/11系统上,不需要装任何其他软件,便可访问局域网的Samba服务。以下以Samba服务器的局域网IP地址为192.168.42.2为例。
临时访问服务,只需打开文件资源管理器,在地址栏中输入\\192.168.42.2,敲个回车,即可看到所有共享的目录,若某些共享目录需要身份认证,则双击进入时会要求账号密码。
若要长期挂载使用,可直接右击“此电脑”,选择“映射网络驱动器”,在界面中输入想要挂载的路径,例如\\192.168.42.2\public
不过此方法需要提前知道共享目录的名称。挂载成功后,可以在文件资源管理器的“网络位置”栏看到挂载的目录:
LinuxLinux系统下同样有很多方法,这里举两个比较简单的方法,其一是直接通过mount命令挂载。
首先在本地创建几个用于挂载的文件夹:
sudo mkdir /mnt/public
sudo ...
在树莓派上部署Samba服务实现局域网文件共享
很早以前买了一块1T的SSD移动硬盘,但找不到啥用处,一直放在家里吃灰,这几天突发奇想,打算把移动硬盘挂载到树莓派上,搞一个局域网文件共享系统,后期可以配合其他设备来实现各种功能。
通过简单的搜索,我了解到一种通信协议称为SMB(Server Message Block),通过一款叫Samba的软件应用到Linux系统上,实现了Linux与Windows文件共享。而且该服务的配置也通俗易懂容易入门,因此我决定在树莓派上整一个。
硬件配置主要是树莓派4B(4G内存很够用),另外当然是一块用于存放文件的存储设备(正常人应该不会想用树莓派系统盘作为存储设备吧)
软件配置树莓派使用了64位Ubuntu 20.04 Server作为运行系统。
处理存储设备这里我先把SSD格式化了一下,目标格式选择了适应性更广的exFAT,其适合用来存储大容量文件,还可以在Mac和Windows等主流操作系统上通用。
将SSD接到树莓派的USB接口上,正常情况下,树莓派可以识别到该SSD的信息。执行以下命令查看SSD的设备名:
sudo fdisk -l
然后将其挂载到一个用于共享文件的目录(我选择的路径是/mn ...
树莓派4B通过USB启动Ubuntu 20.04 Server系统
入手树莓派后,一直以来是用TF卡(micro SD卡)作为存储卡,我购买的TF卡只有32G,TF卡读写速度慢,且容易损坏。
因此我又购入了一块128G,提供USB接口的SSD硬盘,写入了Ubuntu 20.04 Server系统,试图从硬盘把树莓派启动起来。过程中遇坑无数,历经数十次失败后终于成功了,在此总结一下过程。
本文参考自此文章
硬件
树莓派4B(4G内存)
TF卡(SanDisk,32G)
SSD硬盘(STmagic,USB接口,128G)
网线一根(为了通过SSH登录树莓派)
HDMI显示屏(可选,便于实时观察启动过程,查看出现的问题,不过没有也无所谓)
软件
Ubuntu 20.04.2 Server 点此下载
Raspberry Pi OS(官方树莓派系统,也称为Raspbian)点此下载
进入正题修改树莓派的启动配置树莓派默认状态是TF卡启动,需要进行修改,修改需要用到官方树莓派系统,启动流程如下:
将Raspberry Pi OS的img文件烧入TF卡,在boot目录下创建空的ssh文件以在开机后自动开启ssh服务。
将TF卡插入树莓派,连接网线到路由器LA ...
从公网访问内网设备——内网穿透的一种手动部署方法
本文参考自下面文档:
引用站外地址,不保证站点的可用性和安全性
V2Ray反向代理
新V2Ray白话文指南
有时候我们需要远程访问自家家里的局域网设备,比如设备上的NAS服务、Web服务等,这种情况下,如果家里路由器的WAN口被直接分配了公网IP,那么在不考虑安全性的情况下,只要通过端口映射即可轻松达成目的,但一般家用路由器不太可能拿到公网IP,这种方法基本用不起来,这时便可采用另一种方法,称为内网穿透。
内网穿透需要一台具有公网IP的服务器作为中转,一种方法是直接使用成熟的第三方平台,例如花生壳,但免费用户每月只有一个G的流量,如果要付费的话,那倒不如去租一台服务器自己搭,因此我选择了后者。以下假设家里的内网设备为A,公网服务器为B,其IP为1.2.3.4,另一台未接入内网,但需要访问A的设备为C。以下假设需要通过访问1.2.3.4的8080端口来间接访问A设备上的Web服务(80端 ...
利用网关设备搭建私用无污染DNS服务器
前面文章提到过,即使使用了代理,也常会出现无法访问某些网站的情况,其实这就是因为DNS被污染了,因此为了更科学地上网,我们可以在网关设备上搭建一个私用的无污染DNS服务器。
网关设备这里先简单讲一下什么是网关设备,网关设备可以简单理解为你的局域网接入外部网络的最后一道关口(当然实际上不一定是最后一道,比如我下面的例子里 网关外面还有一个路由器),所有局域网流量在进入公网前都将首先经过该设备,再由该设备进行转发。除了普通家用路由器自身即可充当网关设备外,任何一台具备ip转发功能的设备都可以作为网关,比如一台废弃不用的笔记本电脑、部署在设备上的虚拟机等等。
这里我使用的网关设备是树莓派,其相当于一台轻量级的Linux电脑,拥有4逻辑核CPU、4G内存与32G存储卡。
基本网络配置我的网络架构及基本的网络设置大概如下(因为没办法在软件上模拟WiFi,故使用一条以太网线当做LAN-Device与路由器间的WiFi连接):
OpenWrt路由器WAN口连接外网,所有LAN口通过虚拟设备(br-lan)进行桥接,并分配静态IP为192.168.1.1
网关设备树莓派的以太口连接路由器一个LA ...
OpenWrt下游主机通过IPv6上网的一种方法
IPv6因IPv4地址池不够用而被提出,至今已有近30年了,但在国内的普及程度仍非常有限,不过,国内的ISP运营商基本都已经提供IPv6接入了,也就是说家里的宽带一般是支持IPv6的。
很多家用路由器尚无法为局域网设备发放IPv6的全局单播(Global)地址,更有一些号称支持IPv6的路由器,其下游局域网设备只能获取到链路本地(Link-Local)地址,其仅支持同一链路的设备通信(类似于局域网的作用),而不能访问到公网的IPv6。随着IPv6的普及,支持公网IPv6地址分配的路由器今后将会越来越多。
OpenWrt固件支持以Native方式通过WAN口从ISP获取IPv6全局单播地址,虽然支持程度一般,但至少可以通过IPv6上网了。
首先要保证WAN口有IPv6全局单播地址,然后打开/etc/config/network文件,在其中可以看到以下配置:
config interface 'wan6'
option proto 'dhcpv6'
可知IPv6对应的接口是wan6,接下来配置文件/etc/config/dhcp:
config dhcp 'lan'
...
o ...
在OpenWrt上配置透明代理
郑重声明:本文所介绍内容主要是为了方便学习、娱乐、开拓国际视野。请遵守本国法律法规,切勿在任何地方发布分裂国家,涉恐等违法犯罪的言论。
用OpenWrt的原因,我觉得对大部分中国大陆的互联网用户而言是不言而喻的,其拥有比一般路由器更高的灵活性与自由度,更重要的是可以方便舒适地进行某些活动。
这里我们用到的梯子就是v2ray,相信能用上这款软件的,应该或拥有一台VPS并配置好了v2ray服务端,或拥有了能用的机场节点,本文不介绍如何获取节点,只给出在已有节点的条件下,一种能实现透明代理的客户端配置。
配置来自于下面文档:
引用站外地址,不保证站点的可用性和安全性
配置透明代理规则
新V2Ray白话文指南
并经过了一些调整,并删去了一些udp和dns的配置。
为什么要用透明代理?一般而言,v2ray在各操作系统上都有拥有GUI界面的客户端,配置也十分容易,但由于需要下载软件、开启软件、甚 ...
Redmi AC2100路由器刷OpenWrt固件
本文参考自下面视频:
引用站外地址,不保证站点的可用性和安全性
[John] Redmi AC2100 OpenWrt installation (web exploit)
YouTube
首先感谢这位一口流利Chinglish的老哥发的这个视频让我毫无困难地刷机成功。接下来本文将该视频以文字的形式描述一下。
硬件要求如题所示,你需要一台Redmi AC2100路由器,其他openwrt支持的小米系列路由器好像也适用,但本文只针对这一种,以下所有内容仅保证适用于AC2100,其他小米系列可作为参考自己尝试。
如何判断一款路由器是否被openwrt所支持:支持列表
这里我好不容易才找到一款在某东商城和支持列表的交集里的路由器(应该是我的搜索方式不对),也就是这款红米AC2100,某东售价159(不是广告)。
另外,还需要一台能连网线的电脑(openwrt默认关闭WiFi功能,需要通过网线 ...
Docker默认存储路径修改
随着我们长期使用docker,可能会遇到默认存储路径所在的分区装不下的情况,所以不如提前把默认存储路径改了,放到比较充裕的分区下。
这里以Ubuntu为例,先停止docker服务,然后进行以下操作:
修改文件:/etc/systemd/system/docker.service.d/docker-overlay.conf (如果没有docker.service.d文件夹或docker-overlay.conf文件则手动创建)
在文件中写入以下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph="new_docker_storage_path" --storage-driver=overlay
将graph参数引号内部分修改为你所希望的docker存储路径,保存退出文件。
启动docker服务,通过命令docker info 可查看存储路径是否修改成功。
Polkit服务无法开启的一种解决方法
今天在CentOS服务器上想使用docker时,发现运行不起来,仔细一看报错内容,大概说是让我检查一下polkit.service有没有正常运作,因此使用命令systemctl status polkit进行查看,发现
好像确实没有运行起来…,直接运行systemctl start polkit妄图开启服务,果不其然失败了。然后我试了好多种方法,也重装了两次polkit,均失败。
了解到Polkit是Linux系统中的一个身份认证管理工具,它无法正常工作便会导致一些服务无法启动。经过一番搜索,最后的解决方法如下:
修改/etc/selinux/config文件,将SELINUX的值改为disabled,然后运行命令setenforce 0使修改生效。这之后就可以正常运行polkit和docker服务了。
WSL2+图形界面配置+CUDA调用
由于种种原因,我需要一台能调用NVIDIA CUDA的Linux系统机,众所周知,大部分虚拟机由于使用的是虚拟显卡,是没办法调用CUDA的。
然而我既不想装双系统,也不想在白嫖别人的服务器上瞎折腾,一筹莫展之时,偶然了解到Windows 10预览版本为其内置的Linux子系统WSL2增加了CUDA支持,二话不说直接安排一波。
更新Windows系统首先,需要将Win 10升级到预览版本,打开设置界面选择“更新与安全”,拖至底部可见选项“Windows预览体验计划”,在其中使用自己的Microsoft账户进行申请即可,然后将渠道设置为Dev,该渠道能获取到latest更新版本。
稍等片刻,进入Windows更新,若一切正常应该会在这里收到提醒更新的信息,在我操作时的最新版本号为“21343.1000”,然后则需要耐心等待系统更新完全。
安装WSL2的Ubuntu 18.04 LTS安装WSL2的操作官方文档写的比较详细。(其实文档里的操作我都没什么印象,好像很早以前用docker for desktop的时候就已经通过某种其他途径装好了WSL2)
然后去Windows应用商店搜索Ubun ...
如何为WSL虚拟磁盘瘦身
我们知道虚拟磁盘占用的硬盘空间一般是只增不减的,在长期使用WSL后,虚拟磁盘会变得比较大,而其文件占用其实可能并没有那么多,这个时候可以使用diskpart工具进行压缩。
先关闭wsl:
wsl --shutdown
在经历了一些麻烦之后,我现在对不太了解的操作比较小心谨慎,因此在后面的操作之前为磁盘留了备份:
wsl --export name target_file
命令中的name可以通过wsl -l 命令进行查看。
然后运行diskpart命令,进入一个新的窗口,在窗口中运行:
select vdisk file="vhdx文件名"
compact vdisk
稍作等待,即可完成压缩。
C++程序报0xc000007b错误的一种解决思路
近期在64位平台编译C++代码,能够成功编译,但运行时遇到错误码为0xc000007b的应用程序无法正常启动错误,用dependency walker分析生成的exe文件发现以下问题:
可以发现很明显出问题的原因在于SysWOW64/ucrtbased.dll这个文件,它是32位的,导致64位编译出来的程序无法运行。但按理说64位平台下编译会优先去System32文件夹下搜索所需的文件,这里大概是System32文件夹下ucrtbased.dll文件缺失所致。
因此只需下载到64位的ucrtbased.dll文件,放入System32文件夹下,即可。
可从下面网页下载到所需的文件:
引用站外地址,不保证站点的可用性和安全性
UCRTBASED.DLL
www.dll-files.com
Python、C++混合编程环境搭建及简单示例
Python以其极高的开发效率著称,而C++作为一种编译型语言,在运行效率上鹤立鸡群。开发效率,我所欲也,运行效率,亦我所欲也,二者可得兼乎?可!
近期在复现DeepMind的Alpla Zero算法时,我面临如下一种需求:既需要快速地把算法实现出来,又要努力保证其运行效率(算法的核心部分:蒙特卡洛树搜索用python实现需要消耗巨量时间),因此开始零基础尝试python、C++混合编程,试图用C++实现蒙特卡洛树搜索部分,并在python中调用(在此之前本人几乎无任何C++编程经验)
简单了解了下,这里推荐一下自我感觉API用户友好程度比较高的一个C++库——Boost。但u1s1,这个库的环境搭建过程中坑实在是多,网上资料也并不是特别多,因此在此记录一下。
引用站外地址,不保证站点的可用性和安全性
Boost官网
www.boost.org
由于一般代码都是搬去Linux服务器上运 ...
浅谈Softmax与Cross Entropy Loss
在机器学习的多分类任务中,经常听到这么两个名词:Softmax与交叉熵损失函数(Cross Entropy Loss),另外还有一个Sigmoid函数也经常出现,那么这几个东西究竟有什么联系呢?
Softmax这里先顺便提一句Sigmoid,它与Softmax也有一点关系。我最先听说Sigmoid函数是在逻辑斯蒂回归模型中,这是个二分类任务中常用的经典模型。Sigmoid函数长这样:
\sigma(z)=\frac{1}{1+e^{-z}}它将实数域$\mathbb{R}$映射为(0,1)区间,特殊地将0映射为0.5,那么我们在逻辑斯蒂回归中使用的决策方法就是计算一下$\sigma(\mathbf{\omega}^T\mathbf{x}+b)$的值,从而得到$\mathbf{x}$属于正类的概率值,进而进行预测判断。
而Softmax则是下面这样一个多元向量值函数:
a_i=\frac{e^{z_i}}{\sum_{j=1}^Ne^{z_j}},\quad i=1,2,\dots,N显然,一定有$\sum_{i=1}^Na_i=1$。在N分类任务中,常使用这个函数作为神经网络最末层的激 ...
Webpack配置Vue项目文件的读取解析规则
Vue项目中使用webpack对文件进行打包时,由于.vue文件的特殊性,webpack一般无法正常对这类文件进行解析,我们可以通过以下方法对webpack进行配置:
打开webpack.config.js文件,在module.exports中加上以下内容:
module: {
rules: [
{
test: /.css$/,
use: [ 'css-loader', 'style-loader' ]
},
{
test: /.vue$/,
use: [ 'vue-loader' ]
}
]
},
当然仅仅这样添加是没有用的,我们还需要安装css-loader、style-loader、vue-loader与vue-template-compiler:
npm install css-loader style-loader vue-loader vue-template-compiler --save-dev
安装完以后运行webpack ...
如何应用Webpack来运行Vue项目
Vue有多种导入方式,最常见的非模块化导入就是直接往网页里插入一个诸如这样的script标签:<script src="https://fastly.jsdelivr.net/npm/vue/dist/vue.js"></script>
但现在项目中一般看不见这种使用方法了,而大多使用模块化的导入方式。
但这些模块化导入命令的语法非浏览器所认可,直接在JS代码中使用会报错,而Webpack的作用简单而言就是将浏览器看不懂的代码转化为浏览器看得懂的代码。
简单创建一个web项目首先创建一个web项目的文件夹(不妨命名为web),在其下创建一个index.html作为web项目的入口文件,再创建两个文件夹:src与dist,其中src用于存放开发过程中的源码,而dist用于存放项目发布时的代码。进入src文件夹,随意创建一个index.js作为JS入口文件。
以下所有操作都在web文件夹下进行。
初始化npm依赖于Node.js环境
npm init
该命令会在当前路径生成一个package.json
安装Webpack全局安装:
npm ins ...