header image

百度网盘下载之bypy

百度网盘现在各种限制,就是逼着用户付款,而且还要付最贵那档才给不限速。吃相这么难看,实在很难让人想给他钱。所以现在各种破解横行。不过我这里要介绍的bypy并不是一种破解方案,所以速度实际上也只能达到300KB/s(但总比10KB/s好),存储目录也不能随意设置,好处就是可以挂在NAS上。

简介

bypy的GitHub仓库:

bypy其实是一个调用百度网盘API的第三方应用,也就是将百度盘作为应用数据存储的地方(比如输入法存储词库这种的),只不过bypy是用这种方法来实现了百度网盘的命令行客户端。

由于是应用数据,所以存储的目录被固定为了我的应用数据/bypy,不过好在可以在百度网盘中将数据复制移动出入这个目录,所以问题不大。

项目作者已经停止了开发,进入了维护期,也许有一天百度网盘关闭或修改API就用不了了。不管怎么样,还是感谢作者。

安装

bypy是一个Python项目,所以只要有Python环境就可以使用。考虑到依赖的问题,我们使用pip来安装。

如果你还没有pythonpip环境,在Ubuntu下可以通过如下命令安装(Windows中可以用WSL的Ubuntu):

sudo apt-get install python python-pip

其他系统也是安装这两个软件包(包名可能有所不同)就可以了。注意,这里的python包要2.X版本的,如果默认的是3.X版,需要安装2.X的软件包(比如python2.7python2.7-pip)。

安装好后就可以直接用pip安装bypy了。

pip install bypy

但是由于pip的源在境外,有可能速度不理想,我们可以用清华大学的镜像:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bypy

pip会自己解决依赖关系,上面我们的安装没有使用sudo,所以仅是针对当前用户的。

使用

初次使用时需要设置百度网盘API key。我们随便用一条命令即可开始设置:

python -m bypy info

命令太长?我们可以加一个别名:

alias bypy='python -m bypy'

执行上面的命令之后,我们就可以用bypy来代替那一长串命令了。为了不每次进终端都要执行上面的命令,我们可以在当前用户的home目录下新建一个.bash_aliases文件(~/.bash_aliases),然后把上面这条命令添加进去,这样每次进终端都可以直接使用bypy命令了。

执行之后会给你一个网址,访问之后就可以得到API key(需要用百度网盘账号登录),然后复制或输入到命令行中即可。如下所示:

user@WIN10-PC:~$ bypy info
Please visit:
https://openapi.baidu.com/oauth/2.0/authorize?scope=basic+netdisk&redirect_uri=oob&response_type=code&client_id=q8WE4EpCsau1oS0MplgMKNBn
And authorize this app
Paste the Authorization Code here within 10 minutes.
Press [Enter] when you are done

输入Key之后回车确认,等一会儿获取授权之后就提示Successfully authorized并且会列出空间使用情况,这就成功了。

bypy命令结构很简单,就是bypy [操作],操作除了上面的info之外,常用的还有listdownloadupload。更多操作以及选项请直接运行bypy不加任何操作来查看。下面只介绍常用的。

列出文件

bypy list就是列出网盘目录(即我的应用数据/bypy)下的文件,每个文件或目录一行,每行有4~5列数据。第1列是类型,D为目录,F为文件;第2列为文件名或目录名;第3列为占用的空间大小(字节);第4列为修改时间;第5列为文件的Hash值。

例如:

user@HOST:~$ bypy list
/apps/bypy ($t $f $s $m $d):
D foo 0 2019-08-06, 23:08:15
F cn_windows_10_consumer_editions_version_1903_updated_aug_2019_x64_dvd_4c9cbf0b.iso 5306406912 2019-09-12, 19:31:11 7722dbe0ccebebe215fb8f0646450079
F win10-64bit-radeon-software-adrenalin-2019-edition-19.9.1-sep10.exe 435216696 2019-09-12, 21:08:51 cba1369bde139fffea4a3f5fef4c60c5

我们还可以在后面加上子目录名来显示子目录的文件列表,如:

bypy list foo

list可以简写为ls,和Linux常用命令一样。

下载文件

下载文件就直接bypy download <远程文件或目录路径> [本地目标路径]即可(尖括号<>里的内容表示必需,方括号[]表示可选)。随后就会调用自带的下载器下载。如果本地目标路径是目录,那么文件或目录就会下载到其中;如果文件或目录不存在,则会新建;如果文件存在,则会检查是否和远程文件匹配,如果不一样则会覆盖目标文件,如果一样则不做操作。

但是这样下载并不能达到最大速度,因此我们需要第三方下载器。bypy只支持aria2,所以我们安装aria2就行了。

sudo apt-get install aria2

aria2是一个非常好用的命令行下载工具,以后有机会再详细介绍。

然后我们需要用参数--downloader aria2来让bypy调用aria2下载,还可以用--downloader-arguments来设置aria2的参数,在此不细说了,请自行研究。

用aria2下载文件:

bypy --downloader aria2 download cn_windows_10_consumer_editions_version_1903_updated_aug_2019_x64_dvd_4c9cbf0b.iso

下载目录:

bypy download foo

下载目录时要注意两点:1、bypy会递归下载目录,也就是说会把目录中的内容一起下载下来;2、bypy会把目录里的内容放在当前目录。比如上面的目录foo中如果有个文件bar,那么bar会放到当前目录,而不是在当前目录新建一个foo然后把bar放进去。如果要下载到foo里,我们需要指定目标路径。

bypy download foo foo

上传文件

上传文件和下载正好反过来。bypy upload <本地文件或目录路径> [远程目标路径],操作也大同小异,因此就不细说了,唯一要说明的是,上传文件会检查文件校验,如果文件是百度已经收录过的,那么就可以做到秒传。

文件操作

bypy可以对远程文件直接进行复制、移动、删除操作,复制的命令是copy(简写cp,移动命令是move(简写mv)或rename(简写ren,重命名实际就是移动操作,两者等价)。命令你个后面加上目标即可。比如:

bypy copy foo foo2
bypy move foo2 foo3
bypy ren foo3 foo/foo3

删除就是deleteremove(简写为rm)后面跟着要删除目标就行了。

bypy rm foo/foo3

其他

bypy还有很多其他操作,比如添加、取消、列出离线下载,比较文件,同步上传、下载目录等等,感兴趣的请自行研究,这里也不细说了。

还有

bypy一段时间闲置之后会丢失token,很不方便。如果是在NAS上用的话,我们可以定时刷新一下。只要在crontab中添加一条定期执行info操作的命令,周期设定为每星期一执行。

在需要修改crontab的用户下执行该命令:

crontab -e

然后添加如下一行:

3 4 * * 1 python -m bypy info

crontab中要用完整的命令,不能用别名。执行时间为每星期一的凌晨3点4分。保存就行了。

最后

感谢bypy的作者,虽然百度云现在已经退出Linux版了,但主要面向的还是图形介面,命令行下能有bypy这样的工具很不错。

如何激活锁区的Steam游戏 [2019-09-10更新]

2019-09-10更新

由于Steam修改规则,只要钱包区域不是俄罗斯就不能激活俄区key,反之,如果钱包区域是俄罗斯则不用云激活也能激活俄区key。因此本文方法几乎失效(有部分游戏允许中国区激活,可以直接购买激活)。

强烈不建议将现有账号钱包区域更改为俄罗斯,因为这样涉及跨低价区,有被收回游戏甚至封号的危险!可以注册一个俄区下小号用于俄区游戏的激活(需要全程俄区IP操作,具体方法请自行研究)。

[之前讲过跨高价区购买Steam游戏的方法。这次来讲讲安全地跨低价俄罗斯区的购买方法吧。

Yuplay等网站上经常会有价格便宜的俄区游戏出售,但是经常是锁激活(只能在指定的地区IP下激活)和锁运行(只能在指定的地区IP下运行)的。那么如何判断是否锁区,又该如何激活和运行呢?

购买

注册

因为这篇文章重点不是如何在Yuplay购买游戏,所以购买过程就简单讲讲了。

首先点页面右上角的Войти(登录)进入登陆页面,然后在右边的登录框上面有一个Зарегистрироваться(注册),点击后进入注册页面。有两个输入框,填写两遍Email,下面两个选择框,第一个是同意条款,第二个是订阅优惠信息,填好后点下面的Зарегистрироваться(注册)按钮即可。然后密码会通过邮件发给你,去注册邮箱里检查邮件就行了。

改密码

其实随机生成的密码比较安全了,如果不习惯,可以修改密码。首先还是进入Yuplay,点右上角的Войти(登录)进入登陆页面,然后登录框里填入EmailПароль(密码),点Войти(登录)按钮登陆即可。登陆后就来到了个人页面,左边有一排链接,其中Личный кабинет(个人账户)下的Редактировать профиль(编辑档案)点进去就可以改密码了。

点进去后有四个输入框,第一个Email不用解释了,如果要修改Email就修改之后点下面的第一个Изменить(修改)按钮即可。第二个输入框Ваш действующий пароль(当前密码)填入当前的密码,第三个Новый пароль(新密码)和第四个Повторите пароль(重复密码)填入新密码,然后点下面的第二个Изменить(修改)按钮即可修改密码。

查看游戏是否锁区

注意,此方法仅适用于已发售游戏,无法用于预购游戏。

进入Yuplay,找到要购买的游戏。比如全面战争:三国。如果是页面的左边一栏下面,可以见到一个Steam SUB_ID,设个SUB_ID之前的文章讲过了。这次就不详细说了。总之,我们打开SteamDB的Sub详情页https://steamdb.info/sub/SUB_ID/info,其中SUB_ID替换为Yuplay上看到的SUB_ID(全站三国就是https://steamdb.info/sub/340375/info/ ),打开页面后可以看到红色的警告框This package is only purchasable in specified countries,说明这是锁激活的,下面的国家和地区里并没有中国,所以我们只能通过特殊手段激活了。如果是锁运行的,还能见到另一个警告框This package can only be run in specified countries,比如这个猛汉王:https://steamdb.info/sub/289476/info/ (不过这个锁激活和锁运行都是中国区,所以不需要特殊方法)。

购买

购买就简单了,登录之后,在游戏页面点右上方价格旁边的Купить(购买)按钮即可加入购物车。之后会进入购物车页面,我们可以把多个游戏加入购物车一起付款。点击页面右上角的Корзина(购物车)链接也可以进入购物车页面。

购物车页面中有已加入购物车的游戏的Название(名称)、Цена(价格),右边是Удалить(删除)选择框,如果要把游戏从购物车中删除,勾选这个选择框后点下面的Изменить(修改)按钮即可。

再下面是支付方式,熟悉的支付宝、微信、银联不用多解释了。

再下面Вы покупаете(你购买的是)是礼物选项,可以选择Себе(为自己)还是В подарок(作为礼物)。

最下面Всего к оплате就是总价了,右边的绿色按钮Перейти к оплате(转到支付)点击就对跳转到支付网站了。右边的输入框Введите код для получения скидки(输入代码获得折扣)可以输入打折码,输入后点Активировать(激活)使用。

查看激活Key

购买成功后,就可以领Key了,首先还是回到Yuplay,页面右上角的第一个链接Мои покупки(我的购买)点进去,就能看到已购买的游戏列表。列表最右边的Статус(状态)一栏,如果是Успешен(成功)就可以提取Key了。Успешен下面会有一个подробнее(更多)链接,点进去后就能看到Key了,有的Key是直接可以复制的,有的会提供图片,只要注意Steam Key一般是AAAAA-BBBBB-CCCCC这种5-5-5的格式就行。

激活锁区Key

如果Key锁区,我们可以用当地VPN激活。不过其实有更方便的选项——云激活,感谢Makazeu的无私奉献。

进入云激活网站后,选择需要激活的地区,点进去即可(需要点那个圆形的箭头图标)。然后用Steam账号登录(AuthCode即手机令牌,如果没有启用请先下载手机应用启用令牌。或者使用邮箱令牌的话,这里先不填,然后点登录按钮之后会弹出提示让你填写)。

但如果这里我们直接登录进去,会发现上面的IP地理位置会显示CN(或你登录的其他地区),这个时候是无法激活俄区Key的,所以我们要先完全退出账户。

完全退出账户

首先,关闭所有Steam客户端(关闭即可,不必登出)。

然后,在手机Steam应用里退出登录。退出登录后令牌仍然可以使用,不用担心。

这时,尝试使用云激活登录,如果IP地理位置还是CN(或你登录的其他地区),那么在浏览器里打开Steam商店,登录之后,点右上角你的用户名,然后点账户明细,然后往下找到账户安全,点击管理Steam令牌。进入管理Steam令牌页面后,点下面的取消对其他所有设备的授权

这个时候就完全退出了。如果没有就再来一次,然后注销网页登录(点右上角你的用户名,点注销)。

登录俄区

然后再尝试使用云激活登录,这时应该就可以看到IP地理位置是RU了。在Steam Key下面的输入框填入Key,然后点激活KEY即可,页面下方会显示激活状态。

如果好用,就给网站作者打赏吧!

运行锁区游戏

如果游戏不光是是锁激活,还锁运行怎么办呢?

一个办法是等3个月,3个月后就不锁运行了。但这肯定不是我们要的方法。

还有一个方法还是利用云激活,感谢Makazeu的无私奉献。

我们还是用上面的方法登录云激活,确保IP地理位置是RU之后,不要关闭网页,马上打开Steam客户端。然后我们通过在浏览器地址栏,或者Windows运行窗口(Win+R),输入steam://nav/console之后回车,就可以打开Steam控制台。然后我们在下面的命令框里输入user_info之后回车,就可以显示用户信息了,其中IPCountry如果是RU,那么恭喜你,你已经成功跨区了,这个时候就可以安装运行锁运行的游戏了。

之后只要不关闭电脑和Steam客户端,就可以一直保持IPCountryRU一直爽了。如果要回到国区(比如要接收礼物等等),可以先按上面的完全退出账户的方法退出,然后再打开Steam客户端即可。

最后

不说了我要去爽了。

如何将UWP应用添加到Steam

虽然UWP现在半死不活的,但是自从有了Win32转制之后,还是有不少应用登录Microsoft Store的,再加上现在微软大力推游戏,因此将这些游戏添加进Steam就成了一个问题。

目标

说白了,将UWP应用添加到Steam就是利用PowerShell来执行一个命令

Start-Process <ProtocolName>

下面就介绍如何来找到这个<ProtocolName>

如果你的游戏安装在C盘下

其实这个方法可以用于安装在任何盘下的,只不过其他盘下我们有更简单粗暴的方法,但还是先看完这一部分,因为有的内容后面还要用到。

首先我们打开一个文件管理器窗口,在地址栏里输入%AppData%(或者打开运行窗口(Win+R)输入可以),回车,就来到了当前用户的AppData\Roaming目录下,我们先向上一层,来到AppData目录,再进入Local\Packages目录。

然后我们用文件管理器右上角的搜索框直接搜索游戏名称(注意!这一步可能要运行过游戏之后才能搜索到)比如我要找帝国时代决定版,就搜索Age(of Empires)。结果可以看到一个Age of Empires DE右键属性可以看到位置中,其在Packages下的Microsoft.MSDallas_8wekyb3d8bbwe目录里,这就是它的PackageFamilyName了。

其中,Microsoft.MSDallas就是这个Package的Name8wekyb3d8bbwePublisherId,也就是微软了),我们以管理员身份打开PowerShell(在开始按钮上点右键,然后选择Windows PowerShell (管理员)即可),然后输入命令回车执行:

Get-AppxPackage <Name>

<Name>对于帝国时代决定版就是Microsoft.MSDallas,输入后就会得到完整的信息,包括InstallLocation。这就是游戏的安装目录了。我们执行下面的命令进入安装目录:

cd '<InstallLocation>'

注意<InstallLocation>两端要加上引号'",否则可能会有空格会导致命令失败。

然后我们可以用ls命令看到当前目录下的文件,这里我们需要的是AppxManifest.xml文件,我们执行下面的命令:

cat AppxManifest.xml

这个命令把AppxManifest.xml的内容显示到PowerShell中。我们可以找到其中的<Applications>标签,我们要的内容就在这里了,如帝国时代决定版的就是:

  <Applications>
    <Application Id="App" Executable="AoEDE.exe" EntryPoint="AoEDE.App">
      <uap:VisualElements DisplayName="Age of Empires: Definitive Edition" Square150x150Logo="Assets\Windows\UWP\Square150x150Logo.jpg" Square44x44Logo="Assets\Windows\UWP\SmallLogo.png" Description="Age of Empires: Definitive Edition" BackgroundColor="transparent">
        <uap:DefaultTile Wide310x150Logo="Assets\Windows\UWP\SplashScreen.jpg" Square310x310Logo="Assets\Windows\UWP\Square310x310Logo.jpg" Square71x71Logo="Assets\Windows\UWP\Square71x71Logo.jpg"></uap:DefaultTile>
        <uap:SplashScreen Image="Assets\Windows\UWP\WideSplashScreen.jpg" BackgroundColor="black" />
      </uap:VisualElements>
      <Extensions>
        <uap:Extension Category="windows.protocol">
          <uap:Protocol Name="ms-xbl-multiplayer" />
        </uap:Extension>
      </Extensions>
    </Application>
  </Applications>

<Extensions>标签下,我们可以看到<uap:Protocol Name="ms-xbl-multiplayer" />ms-xbl-multiplayer就是我们要找的ProtocolName了。

另类方法

上面我们得到Package的Name之后(或者Get-AppxPackage <Name>得到更详细的PackageFullName),可以到注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\PackageRepository\Packages\<PackageFullName>\windows.protocol下看到我们要找的ProtocolName

或者在HKEY_CURRENT_USER\SOFTWARE\Classes\Extensions\ContractId\Windows.Protocol\<PackageFullName>\ActivatableClassId\<SomeString>\CustomProperties,选中之后右边的Name数据就是ProtocolName。其中<PackageFullName>就是PackageFullName<SomeString>是一串字符串,不用在意含义。

如果你的游戏安装在其他盘上

上面的方法依然有效,但我们有更简单粗暴的方法:

非常简单,其他盘上会有一个WindowsApps的目录,游戏就装在这里面了。我们还是以管理员身份打开PowerShell(在开始按钮上点右键,然后选择Windows PowerShell (管理员)即可),然后输入命令回车执行:

cd 'D:\WindowsApps'

上面的命令是进入目录,其中D是对应的盘符,根据实际情况修改。然后我们用下面的命令来查看子目录:

ls

如果你只安装了一个游戏,那么就很好办了,直接进入目录查看其中的AppxManifest.xml就可以了(方法见上面)。

如果你安装了多个游戏,一个一个打开AppxManifest.xml看吧,文件中的<DisplayName>标签中可以看到这个Package的名称。如果实在太多,那还是按照上面的在C盘中方法来吧。

添加到Steam

首先打开Steam,然后点主界面左下角的添加游戏,然后选择添加非Stema游戏,这时会打开一个添加游戏对话框,随便选一个程序即可。

然后找到我们刚才添加的程序,右键属性,上面的名称改成游戏名称,目标修改成"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"起始位置留空。

然后点设置启动选项,填写-WindowStyle "Minimized" -NoExit -Command "Start-Process <ProtocolName>:",其中<ProtocolName>替换成我们之前找到的内容,注意后面有一个英文冒号:WindowStyle参数指定PowerShell窗口的运行方式,这里设置为最小化MinimizedNoExit参数指定运行命令后不退出,退出了Steam就不会显示游戏中状态了,游戏过后我们需要手动关闭窗口。Command参数就是指定要执行的命令了。比如帝国时代决定版就是-WindowStyle "Minimized" -NoExit -Command "Start-Process ms-xbl-multiplayer:"。设置好之后确定

然后关闭属性窗口,就可以运行游戏了。

最后

没图标总觉得不好看,可以自己去找图标,然后修改了就行。

Steam跨区指南

由于厂商的销售政策或其他一些众所周知的原因,Steam上的游戏在国区不一定买得到,因此需要通过一些手段购买,下面就来说一说。

首先

你需要准备一个美国的代理。虽然也可以跨到其他区,但是不推荐,因为如果不小心(或者说故意)跨到了低价区,等待你的很可能是游戏被收回,甚至账号被封禁。美区由于是全球区,还是高价区,G胖也不会跟钱过不去,所以相对来说比较安全。

Sub大法

严格来说,这个并不算跨区,但有的商品确实可以通过这种手段购买,因此也说一说。

Steam上的商品链接其实有三种,一种就是最基本的游戏或DLC(或其他程序、视频等,以下简称为App),比如https://store.steampowered.com/app/393080/Call_of_Duty_Modern_Warfare_Remastered/393080就是这个App的AppID,可以说是Steam上最基本的SKU(库存单位)了。后面的Call_of_Duty_Modern_Warfare_Remastered是App名称,其实可以不要,也就是说通过https://store.steampowered.com/app/393080照样可以访问。

接着是Bundle,这是捆绑包,也就是将多个App打包销售。比如https://store.steampowered.com/bundle/9193/Sid_Meiers_Civilization_VI_Gold_Edition/,可以看到形式和上面的App链接差不多,自然中间的9193就是BundleID了。

然后就是Sub了,Sub其实是用来区分不同的区域和销售版本的,一个App可以对应多个Sub。理论上你访问相应的区域时,购买App时就是购买相应的Sub。有的Sub可以用链接直接访问购买,比如https://store.steampowered.com/sub/306734/(对应的App是无法直接访问的https://store.steampowered.com/app/943690/),自然,最重要的就是如何获得这个SubID

这里我们就要利用一个大杀器https://steamdb.info/,这个网站是自动抓取Steam上的数据然后整理成数据库的。我们可以进入网站后在搜索框里通过内容的名称(默认就是搜索Sub)或AppID来搜索,或者直接通过类似Steam的链接格式访问(比如https://steamdb.info/app/943690/,就是上面的App对应的SteamDB页面了,然后我们可以在左侧找到PricesInformation等,点击其中的Packages,就可以看到这个App对应的Sub了(或者直接点,https://steamdb.info/app/943690/subs/)。

SUBID一列就不用解释了,链接点了之后可以进入Sub的SteamDB页面,NAME一列的右边如果有个地球图标的话,表示这是在Steam商店里销售的Sub。如果有多个在售的Sub,就要看清楚名称是什么版本的。点左侧SUBID的链接进去后看Sub的Information里有没有锁区、限区等,如果没问题,点页面上Store(或者自己构造Steam的Sub链接)来访问购买了。

对于锁区、限区的App或Sub,我们只能通过下面的方法来访问了。

切换区域法

有的App,或者搜索无法搜到,或者锁区限区。就算通过其他方法获得了链接,甚至挂上了代理,也还是显示“您所在的国家/地区不允许看到此内容。”。比如https://store.steampowered.com/app/947650/。可以发现有的访问之后链接中多了个agecheck,原来这些游戏有不可描述的内容,而国区是直接屏蔽的这样的年龄验证的。锁区限区则是有的直接不给访问,有的访问之后无法购买。

这个时候,我们先挂上代理,然后随便加一件东西到购物车里。然后进入购物车,这时可以发现,购物车商品列表的右上角多了个国家/地区的切换。

点击之后,选项有之前购买过的地区(也就是当前的钱包区域)、现在访问的地区(也就是代理的地区)和其他。如果挂的是美国代理,这里就可以切换成美国了。

然后我们再去上面的链接,就会发现可以访问了,我们可以将它加入购物车。

等等!还没完!我们再进入购物车,再把区域切换回中国,可以发现,这个商品仍然在购物车里,而且还有国区价格。我们这时只要愉快地购买就行了。

当然,不是所有内容都可以切换回国区购买,有的内容切换回国区就从购物车里消失了。这说明是发行商实行了限区政策(前面的是因为有年龄限制,但发行商并没有设置限区)。那我们先试试下面的方法,如果还不行,我们只能从美国区以高价购买了。

如果切换到了美国区购买,购买之后钱包区域会切换为美国,这个时候就不能接收中国区礼物了。我们需要用上面的方法再在中国区购买之后,才能把钱包区域切换回中国。

总结

基本上,这两种方法结合,已经能解决大多数情况了。跨美国区也相对安全(虽然价格贵一些)。虽然上述方法也适用于其他低价区,但是不建议跨低价区,收回或者封禁那就得不偿失了。对于俄区低价区,其实可以去yuplay看看,有的游戏购买不锁区,但是激活和运行锁区的,可以通过特殊手段激活和运行(或者激活后等三个月解锁运行)。以后有机会再说吧。

内网穿透之frp

  • 2018-06-23更新:
    由于新版(0.18.0开始)和之前的版本不兼容,因此针对新版做了一些补充。补充的内容基于0.20.0版本。

  • 2019-05-09更新:
    更改了一些文件的保存位置。

之前讲过ngrok,但是那个需要自己编译,也已经很久很没有更新了(作者开发了ngrok 2,但是变成私有软件了)。所以这次我们换一个大概是中国人编写的frp,作者提供了详细的中文文档,上手十分简单。

frp的GitHub页面,我们可以在Releases页面下载到编译好的版本。提供各种架构的版本:darwin是macOS,linuxwindows就不用多说了,386就是32位平台,amd64就是64位平台,其他还有armmips等多种平台。如果没有还可以自己编译,但不在本文涉及范围。

下载解包之后,会得到几个文件,frps就是服务器端程序,frpc就是客户端程序,后缀ini的就是对应的配置文件,full的就是完整的配置文件。

服务器端配置

基本配置

frpsfrps.ini上传到服务器,让后放到某个目录下(我放到了/opt/frps/目录下)。然后修改frps.ini文件(你也可以先修改了再上传)。

基本上只要一条设置就够了(每条选项一行,=之前是选项名,之后是值,[]内是选项块的名字):

[common]
bind_port = 7000

bind_port就是绑定的端口,设置一个没有被占用的就行了。值为端口号的整数。
如果服务器有多个IP地址,我们还可以设置bind_addr来绑定特定的IP地址。值为点分十进制的IPv4地址(如1.2.3.4)。

2018-06-23更新:新版增加了IPv6支持,因此值还可以设置为IPv6地址(必须用方括号[],如[2400::1:23:456:7890])。

PS:由于Go语言的特点,0.0.0.0[::]是一样的效果,会同时监听IPv4和IPv6地址,但在用netstat里只能看到IPv6被监听,实际上是通过了IPv4-Mapped IPv6 Address同时兼听了IPv4地址的。

如果要开启kcp,我们还可以设置kcp_bind_port选项。值为端口号。
为了增加安全性,我们可以加上密码privilege_token选项。值为字符串。

2018-06-23更新:从0.17.0版开始,privilege_token不再支持,请改为token

其他更多选项及相关说明请参见frps_full.ini文件。

然后我们只要运行如下命令就可以了:

/opt/frps/frps -c /opt/frps/frps.ini

开机自动运行

当然,我们要让它开机自动运行,如果系统使用的是systemd来进行初始化,我们只需要编写一个service文件(保存为/lib/systemd/system/frps.service)就行了:

2019-05-09更新:
请将文件保存到/etc/systemd/system/frps.service

[Unit]
Description=frp server
After=network.target

[Service]
Type=simple
ExecStart=/opt/frps/frps -c /opt/frps/frps.ini
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后照例启用和启动服务就行(逐条执行):

sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps

上面最后一条命令是查看服务状态的,如果是active就是成功运行了。

客户端配置

服务器端配置很简单,客户端配置就要复杂一点了。客户端里的配置文件一样是上面介绍的格式,下面我们以[]包含的不同块来分开介绍。注意,所有选项都在一个配置文件里。

如果是运行在NAS上的,同样上传到NAS之后使用(我上传到了/opt/frpc/目录)。

[common]

如同名字所说,这里都是一些公共配置,基本上如下:

[common]
server_addr = 1.2.3.4
server_port = 7000
admin_addr = 127.0.0.1
admin_port = 7400

server_addr就是我们的服务器IP地址,你也可以用域名,但是不推荐。
server_port就是我们在上面bind_port设置的端口号。
admin_addradmin_port是为了能够热加载配置而设置的,监听本机(127.0.0.1)的7400端口。
如果启用了密码,设置privilege_token和上面服务器设置的一样就行了。

2018-06-23更新:从0.17.0版开始,privilege_token不再支持,请改为token

如果上面设置了kcp_bind_port,我们还可以用protocol = kcp来启用kcp协议。
其他更多选项及相关说明请参见frps_full.ini文件。

公共设置就这些了,基本上这样就能用了。下面我们来设置具体的端口映射。

最基本的映射

基本的映射只要设置一个唯一的块名,然后下面做对应的设置就行了。比如我们设置SSH访问:

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 23333

[ssh]就是一个名称,我们自己设置就行了,用[]包上即可,下面的选项都是对应在这个块下的。一个ini可以包含多个设置。
type就是类型,大多数服务都是tcp的。除此之外还支持udphttp服务(当然,http也是tcp的一种,有这个只是为了方便虚拟主机的设置,详见GitHub上的说明),还有一个stcp我们下面会提到。
local_ip就是我们想转发到外网的本地主机的IP,127.0.0.1代表的就是本机。
local_port就是服务的端口了,22是ssh的默认端口。
remote_port就是我们想在服务器上打开的端口,比如我这里设置23333
如果需要加密,我们可以在每个映射下设置use_encryption = true
如果需要压缩,我们可以设置use_compression = true
其他更多选项及相关说明请参见frps_full.ini文件。

这样,当我们启动客户端之后,就可以通过访问服务器的23333端口来访问实际运行在本地主机的22端口上的SSH服务了。下面是一个Transmission远程访问的配置示例:

[transmission]
type = tcp
local_ip = 127.0.0.1
local_port = 9091
remote_port = 9091

当然,有时我们觉得这样直接把服务暴露给公网太不安全,那怎么办呢,上面提到过的stcp就是一个解决方案。

安全的映射

安全的映射我们需要两个客户端,一个运行在提供服务的主机上(简称A),一个运行在访问服务的主机上(简称B),通过服务器中转访问,服务器并不直接开放端口。

在提供服务的主机(A)上设置

我们还是以ssh服务为例:

[secret_ssh]
type = stcp
local_ip = 127.0.0.1
local_port = 22
sk = abcdef

前三项配置和前面的基本一样,就是type设置成了stcp。但最后我们不再设置remote_port,而是设置了一个sk,这是安全访问的密码,只有密码一致才能访问。

运行客户端之后,我们就可以通过另一个客户端来访问了。

在访问服务的主机(B)上设置

我们在另一台主机(B)上同样设置frpc.ini[common]部分是一样的,但是我们设置的并不是为了提供服务,而是访问服务,所以有所不同

[common]
server_addr = 1.2.3.4
server_port = 7000

[secret_ssh_vistor]
type = stcp
role = vistor
server_name = secret_ssh
sk = abcdef
bind_addr = 127.0.0.1
bind_port = 23333

type一样是stcp
多了个role = vistor表示我们是访客而不是提供服务的(吐个槽,作者这里错成vistor了,怎么想都是visitor才对嘛)。
2018-06-23更新:作者已经修正为了,请使用visitor作为正确的值。
然后server_name要和我们上面在主机A上设置的[]内的名字一样。
sk也要和上面一样。
bind_addr表示绑定在本机(B)上的IP地址,你可以绑定0.0.0.0或者具体的IP地址来再向局域网内提供访问。
bing_port就是绑定本机的端口了。

运行客户端之后,我们就可以访问本机(B)的23333端口,来访问主机A上的22端口的SSH服务了。

点对点映射

2018-06-23新增此节

新版增加了点对点映射,设置方法和安全映射差不多,仅type的值设置为xtcp

点对点映射时,连接不通过服务器,而是直接在两个主机(A和B)之间建立,但并不能支持所有网络环境,如果不能正常工作,还是需要使用安全映射。

自动运行客户端

我们可以先运行一下看看有没有什么错误。

/opt/frpc/frpc -c /opt/frpc/frpc.ini

因为我是运行在NAS上的,所以还是要自动运行。设置起来和服务器基本是一摸一样的,只不过把frps改成了frpc

如果系统使用的是systemd来进行初始化,我们只需要编写一个service文件(保存为/lib/systemd/system/frpc.service)就行了:

2019-05-09更新:
请将文件保存到/etc/systemd/system/frpc.service

[Unit]
Description=frp client
After=network.target

[Service]
Type=simple
ExecStart=/opt/frpc/frpc -c /opt/frpc/frpc.ini
ExecReload=/opt/frpc/frpc -c /opt/frpc/frpc.ini --reload
Restart=on-failure

[Install]
WantedBy=multi-user.target

多了一个ExecReload选项是为了可以热加载配置,因为我们主要都是修改客户端配置,这样可以方便修改之后立即生效。

然后照例启用和启动服务就行(逐条执行):

sudo systemctl enable frpc
sudo systemctl start frpc
sudo systemctl status frpc

上面最后一条命令是查看服务状态的,如果是active就是成功运行了。如果我们需要热加载配置,只需要用命令sudo systemctl reload frpc就可以了。

补充

如果是运行在Windows上的,网上有很多资料如何自动运行,就不细说了。如果只是临时使用(比如是作为上面提到的安全映射里的主机B),那么只需要在命令行执行代码就行了(打开命令行的方式:在文件管理器的frpc.exe所在文件夹里按住Shift点右键,然后选择在此处打开命令行提示符/Powershell窗口)。

frpc -c frpc.ini

2018-06-23更新:新版可以直接用命令行参数启动,不需要建立ini文件。如:

frpc tcp -s "127.0.0.1:7000" -n ssh -l 22 -r 6000

具体参数含义和用法请使用frpc -h命令查看。

最后

感谢frp作者fatedier的工作,大家如果有问题咨询作者或者想捐款给作者,可以在GitHub上的说明的最后找到相关的联系方式。