分类 工作相关 下的文章

1 背景

受“新冠肺炎疫情”影响,出现不能回办公室上班的问题,所以制定一套安全的远程办公方案。

由于办公室有外网IP,原来的方案就是利用路由器的端口映射功能,把各个台式机(操作系统是Windows)的“远程桌面”端口直接映射到外网。这方案缺点如下:

  • “远程桌面”如果存在漏洞,比如绕过登录,电脑上的资料就可能被随意访问。
  • 需要远程访问的台式机,要24小时开机,否则连不上。
  • 需要远程访问的台式机,起码占用路由器的一个端口。

2 解决方案

结合SSH服务、wake on lan、远程桌面,实现更安全和灵活的远程办公。

  • 部署Linux服务器,只映射其SSH服务端口到外网,作为安全入口。
  • SSH客户端几乎覆盖所有平台(包括移动平台),且其功能强大。
  • 使用SSH的端口转发(Port Forward)功能,连上办公室内网的指定IP的“远程桌面”端口。
  • 各个台式机开启wake on lan功能,实现按需开机,工作完关机。
  • 各种操作系统有对应的远程客户端。Windows,使用微软的“远程桌面”客户端,全平台支持;Linux,使用SSH客户端;Mac操作系统,使用VNC客户端。

但是此方案仍有缺点:

  • 需要用户理解SSH及其功能。
  • 使用Linux远程开机命令(wakeonlan),即使把命令简化为Shell脚本,也不是普通人会用。
  • M系列CPU的Mac电脑,不能使用wake on lan,目前只能长期开机。

3 办公室部署

3.1 路由器

路由器的网络需要可外网访问,并且支持端口映射功能。基本路由器都支持端口映射,具体配置参考路由器说明书。

配置路由器外网端口,映射到Linux服务器的SSH服务端口。

3.2 Linux服务器

  1. 安装wakeonlan命令。

Debian或Ubuntu,执行以下命令安装

sudo apt install wakeonlan
  1. 部署SSH服务,作为安全入口。需要SSH服务的安全配置,例如:
  • 仅使用SSHv2协议

    Protocol 2
  • 禁止root用户登录。

    PermitRootLogin no
  • 禁止用户空密码登录。

    PermitEmptyPasswords no
  • 指定白名单用户。

    AllowUsers user1 user2 user3
  • 指定禁止登录的用户(一般指定白名单即可)。

    DenyUsers root user4 user5
  • 限制身份验证最大重试次数。

    MaxAuthTries 3
  • 登录用户的密码,使用强密码,甚至配置使用“密钥”验证登录。
  • 显示最后一次登录的日期和时间。

    PrintLastLog yes
  • 防止特权升级(一般默认配置)

    UsePrivilegeSeparation sandbox
  • 禁用 GSSAPI 认证

    GSSAPIAuthentication no

更详细的设置,可以搜索“Secure SSH”或者“SSH安全加固”等内容。

另外,最好配置一下服务器保持TCP连接的选项,避免客户端自动断开:

  • 开启保持TCP连接

    TCPKeepAlive yes
  • 向客户端发送是否存活的消息的时间间隔,单位是秒,默认是0,不发送

    ClientAliveInterval 30
  • 请求后客户端无响应则自动断开的最大次数

    ClientAliveCountMax 3

3.3 台式机

  1. 主板开启wake on lan功能。具体BIOS设置,需要查询主板的说明书。一般注意以下几点:

    • 板载有线网卡设置启用。
    • wake on lan设置启用。
    • 启动项,允许PCIE设备启动。
    • 启动项,出现pxe rom可选。
  2. 操作系统开启wake on lan功能。即操作系统执行关机时,让主板不要完全断电,并允许网卡运行于可接收Magic Package的状态,用于网络启动电脑。

  3. 开启远程访问服务。各个操作系统配置如下:

    • windows,开启“远程桌面”服务。
    • Linux,开启SSH服务。一般默认开启的。
    • Mac OS,开启“远程访问”服务,可以SSH客户端访问,即字符界面。
    • Mac OS,开启“远程桌面”服务,可以VNC客户端访问,即图形界面。

4 客户端部署

主要就是SSH客户端 + 远程客户端。

4.1 SSH客户端

4.1.1 Linux

一般Linux操作系统默认安装SSH客户端,如果没有,安装“OpenSSH”或者“Dropbear SSH”的客户端即可。

4.1.2 Windows

Windows 10或11可以通过“WinGet”命令安装“OpenSSH”客户端。例如:

winget install opensssh

Windows 7可以使用“PuTTY”。Windows都可以安装这个。

4.1.3 Android

可以使用“Termux”,再安装“OpenSSH”。

pkg install openssh

或者使用其它SSH客户端App。

4.1.4 iOS

安装Termius。需要注册账号,免费版可以使用SSH客户端和端口转发功能。

4.2 远程桌面客户端

  • Windows,自带“远程桌面”客户端。
  • Linux,推荐安装“Remmina”。
  • Android,安装微软官方“远程桌面”App。
  • iOS,安装微软官方“远程桌面”App。

4.3 VNC客户端

  • Windows,使用开源的“TightVNC”。
  • 其它,待补充。

5 客户端使用

以Windows远程桌面为例,其默认端口为3389,并假设该台式机的IP为192.168.0.123。其它服务类似操作。

  1. 远程开机。

    启动SSH客户端并登录,使用wakeonlan命令 + MAC地址,启动对应的台式机。注意,需要记录该台式机有线网卡的MAC地址。
  2. 开启端口转发。

    启动SSH客户端,设置本地端口(例如 43389)转发到办公室内网指定电脑端口(例如 192.168.0.123:3389)。
  3. 连接远程桌面。

    远程桌面客户端连接到本机端口(例如 127.0.0.1:43389),即可访问。如果是管理员帐号登录,需勾选“管理员模式”。

5.2 远程开机

普通用户执行wakeonlan命令,参数是对应台式机网卡的MAC地址。然后使用ping命令,检查该台式机是否开机成功。

要注意,Windows操作系统,不要使用shutdown /s命令关机,会导致wakeonlan命令无法开机。

5.3 开启端口转发

假设,办公室的外网域名为remote.office.com,SSH映射外网端口为22222,SSH登录用户为r-user,需要通过访问192.168.0.123:3389的“远程桌面”服务,并且本机开启43389端口去访问。

5.3.1 SSH命令

使用SSH客户端(例如OpenSSH客户端)的,直接执行以下命令,然后输入密码,让其一直运行即可。

ssh -f -N -L 43389:192.168.0.123:3389 r-user@remote.office.com -p 22222 -o ServerAliveInterval=30

关键参数说明如下:

  • -f后台运行。
  • -N不执行命令。
  • -L 43389:192.168.0.123:3389是把本机43389端口转发到办公室内网的192.168.0.123:3389端口。
  • -o ServerAliveInterval=30是每30秒向服务器发生一条表示客户端存活的消息,用于保持连接。

关于客户端保持连接,可以修改/etc/ssh/ssh_config文件,在Host *的配置下,加入以下配置。然后运行ssh命令,不用加上-o ServerAliveInterval=30这个参数。

ServerAliveInterval 30
ServerAliveCountMax 3

5.3.2 PuTTY设置

  1. 点Category -> Session,在Host name填remote.office.com,Port填22222,Connection Type选SSH。
  2. 点Category -> Connection -> Data,在Auto-login username填r-user
  3. 点Category -> Connection -> SSH -> Tunnels,Add new forward port下,Source port填43389,Destination填192.168.0.123:3389,勾选下面的“Local”和“Auto”,再点“Add”。
  4. 点Category -> Connection,在Seconds between keepalives (0 to turn off)填10,并勾选Enable TCP keepalives (SO_KEEPALIVE option)选项。这一步是设置客户端保持连接。
  5. 点Category -> Session,在Saved Sessions填remote_office,再点“Save”保存配置。
  6. 连接时,点Category -> Session,选中remote_office,点“Open”。输入密码后让其保持运行即可。

5.3.3 iOS设置Termius

  1. 安装Termius,并注册账户。
  2. 设置保持后台运行。

    • 在Settings -> SESSIONS -> 开启”Active Connect Saver“和”Save Location Data“。
    • 据说是使用了“获取地理位置”权限,实现App保持后台运行。
  3. 新建Hosts。

    • 填写连接到办公室的域名remote.office.com和SSH端口22222,然后命名为remote_office
  4. 新建Port Forwarding。

    • 在Port Forwarding,点“+”新建。
    • -> 选Local,点Continue。
    • ->“Set the local port and binding address”的Port number填写映射到本机的端口,例如3389,点CONTINUE。
    • -> 点Select a host,并选sdoffice。
    • -> “Set the destination host”填写目标电脑的内网IP和远程桌面端口,例如address为192.168.0.123,port为3389,点CONTINUE。
    • -> 最后填写标签,例如101-rdp,点DONE
  5. 连接。

    • 在Port Forwarding,长按101-rdp,点Connect。

5.4 远程桌面客户端

添加电脑,电脑名称为127.0.0.1:43389。如果是使用管理员账号,记得开启“管理员模式”。

6 其它方案

6.1 前端安全替代

  1. 使用虚拟内网,即VPN。连上VPN就等于进入办公室内网。

    • Android和iOS原生支持L2TP、IPSec、IKEv2等协议,不用安装客户端。
    • 路由器同样只需映射VPN服务的端口。
  2. 使用堡垒机做入口。

    • JumpServer。未了解。
    • Next Terminal。了解过,当前版本安全方面考虑不足,手机访问“远程桌面”不支持触屏等。
  3. 其它商业解决方案

    • TeamViewer
    • 向日葵远程控制软件

6.2 网络启动功能替代

可以使用WiFi开关 + 电脑通电启动,实现替代,但需要购买WiFi开关硬件。

终于在5月来临前结束了上一份工作。回望过去,刚好满一年。

一年前,眼前一切都安好了,想再次投入到软件公司去做开发。面试多间以后,最后选择了本地数一数二的,而且声称做Java的公司。现在想来,进去也太过于轻松了。

首先是HR招人会有奖金,其次是公司的经营方式--可以理解为人力外包。就是找一些会写代码的程序员,拉到客户那边帮客户做开发。公司赚取客户报价与员工工资之间的差价。这种开发模式,除非客户那边有比较强的技术,并且只需要增加临时的开发人员来完成项目,否则对客户是非常不利的。最简单一点是项目开发过后,就找不到人去维护。实际项目中,也有出现某些代码想修正或者升级,问谁,谁都不知道。

基于这种经营方式,就会导致人员流动性很大。当然,公司只要从客户那边拿到钱,就不用管人员的问题了。更厉害的是,开发工具采用了图形化开发。就是像配置工作流一样去配置业务逻辑。简单直观,开发快,而且不公开技术实现。新人立马就能上手,就算离职也不会学到真正的技术。

这样来看,一个声称是做技术的公司,其实就没有什么核心技术了。进去工作的程序员,也得不到太多的提升。再加上利用晚上不算工资、没有补贴的加班来压缩成本,人就会越做越累。正如某领导所说的,能留下来的都是精英。我的理解,他们都是心态非常好,抗压能力超强的精英。

当然,老板和领导们都应该看到这些问题了(或者看到其它方面),于是踏上了产品研发的道路。我一进去就是投入到新产品的研发,一做就是大半年。然后我们拿着这个半成品,就去给客户做项目开发了。

现在看来,该产品也一样空洞。主要的原因还是缺乏一个技术总监去主导、把控和验收。最后随着产品开发的结束,开发人员的离去(调去其它项目或者离职),产品未能达到预期效果。最TMD的是,有一些东拼西凑的模块,隐含重大问题。例如在Windows上部署Weblogic来运行,核心Jar包会报包名与类名冲突的问题。这样连部署到客户的服务器都成为难题。

啰嗦了一堆问题后,还是总结一下收获吧。

重新投入到软件开发的环境中,感觉还是很好的。一个开发团队里,有问题可以大家一起讨论解决。下班后还能天马行空地讨论各种各样的问题。

不得不说的是,技术老大传授了一些不错的经验。

对于技术的选择,要用自己熟悉的,而不是选择那些吹嘘有多强的新方案。自己熟悉的,遇到问题都好解决。而且成熟稳定的方案会少很多问题,就算有问题,解决方法也比新方案容易找到。

要通过增强代码可复用性来提高开发效率,而不是复制修改代码。其实这个程序员都明白的,但是在开发过程中总是没有做到。

针对问题去解决问题。就是根据问题的提示去找原因,然后解决。

面试的时候,要把话题带到自己熟悉的领域,说出面试官不懂的、不敢反驳的话题。

展望未来,将有更多需要努力和学习的地方。Come on, go ahead!

由于现在的公司有多个老旧系统,需要从一个系统访问到另一个系统的数据。一看到这个,就想到了SOA,但是几个小系统部署个SOA来整合,值得么?重点是没搞过SOA!于是怎么简单就怎么解决,例如实现跨数据库访问,即从SQL Server访问MySQL,程序层就从SQL Server读取数据。

Google了一下,找到一篇有用的教程:SqlServer2005 链接服务器用法(http://www.jb51.net/article/18484.htm)。文中提到用sp_addlinkedserver这个存储过程来添加链接服务器(要先配置好MySQL的ODBC数据源),然后通过以下语句获取数据:

SELECT * FROM OPENQUERY (链接服务器名,'MySql查询语句');

按照这个方法配置好,并建立了视图,然后就可以进行查询了。但是有很多问题:例如SQL Server不支持MySQL的某些数据类型,导致查询结果出错,还有个致命的问题,查询速度很慢。

最后还是写了个ASP页面,直接访问MySQL数据库,返回查询结果。打印时,也是写个ASP页面来实现。这,比什么都简单。汗……

PS. 后来还发现如果是SQL Server之间的访问,可以直接用OpenRowSet函数来实现跨数据库访问。格式如下:

OPENROWSET ( 'provider_name', { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }, { [ catalog.] [ schema.] object | 'query' } )

太方便了,特别是两个数据库之间复制数据,或者进行数据对比。

中午12点多,被组长送上火车后,就踏上这个既长又寂寞的旅程--坐上回广州的火车。24个小时以上的旅程,以陈绮贞那《旅行的意义》开始,散发淡淡的忧伤。陈老师的歌实在太棒了!特别适合这种悠长的旅程。

天津的出差总结?很想写,但又懒洋洋的,不想马上写。管它呢,旅程还长着。先吃点面包填下肚子。

PS. 今天是日本在二战投降65周年,也是舟曲特大泥石流灾难全国哀悼日。

整个7月份在天津出差,虽然去了几天首都北京,但也没一天去玩过。其实分给我的工作不多,只是一面对电脑就没精神了,导致每天都在混日子似的。

首先是模块要做成怎样,没跟软件经理(他设计了系统)沟通清楚,很多地方不敢下手。而软件经理根据另外一个项目的经验,把一些模块都搬过来让我改。其实只做修改的话,应该比重新开发更快,但是界面做得比较复杂。主要是设计了一大堆JavaScript,而这堆JavaScript都保存在js文件里,调试很麻烦。

其次是客户的需求,跟系统设计前调研的不同。由于客户是个国企类企业,花国家的钱(就是纳税人的钱)不心痛,内部管理又混乱(一些流程、文件没定下来),需求变化是注定的了。还有属下有十几个子公司,任何涉及到子公司的流程都要做十几个。这给开发部署带来了巨大的压力。

工作两年了,深深感到信息管理系统也不容易。说来说去,主要是人的问题。还有就是系统不够灵活,这应该算是技术问题吧。

PS.  1)跟同事聊天才知道,公司居然有个报表系统。这系统就是录入客户数据,然后出报表。进一步的价值就是根据录入的数据进行BI(商业智能)。但是由于没有把客户的业务、流程做到系统里,客户使用系统就会比原来增加工作量。如果业务和流程都做到系统(就是一般的信息管理系统),客户就可以真正的把系统用起来,使企业真正实行信息化。而这报表系统由于见效快,所以容易骗到客户的钱,但这样对客户极度不负责任!扯淡!

2)终于跟天津驻守的占起哥见面了,还吃了顿饭。在占起哥强烈要求之下,来到一家有点档次的海鲜酒楼吃饭。点菜是看着模型点,做出来的菜跟模型几乎一样。这顿饭除了能在毕业两年后与占起哥见面之外,还让我第一次吃到了三文鱼和金枪鱼刺身。88RMB一盘,就那么几块肉,感觉还没想象中那么好吃。

3)离开北京前,跟一学弟吃了个饭。吃了几百RMB,就那么三小碟菜,一卑蜂蜜柠檬茶也要28!不过那学弟9K RMB/月,还让我随便点。他以前是公路专业的,毕业时寄了一个Flash作品过去,就被那公司录用了,去做Flash游戏。工资在一年里从3K涨到9K,真让人羡慕。而且老板是个老外,工作之余还锻炼了英语口语。

由于公司参与某大项目的投标,需要做个系统的界面原型,而我刚好在天津,于是被召去北京了。本来随行的还有个组长,但他病得不行了,只能我一个人过去。幸好有北京分公司的同事带路,一切都顺利进行。

现在坐上天津到北京的动车了。第一次坐动车很舒服,还有带有第一次坐地铁的兴奋感。坐在车上,听着Dido,很小资~

到北京后希望能去向往已久的中关村逛逛,附近还有清华大学和圆明园遗址,也值得看看。不过玩之前得完成任务--想到要面对着领导工作,真不习惯。希望一切顺利吧。

先睡个午觉,估计醒来后就到了。

PS. 我还没睡醒,带路的MM就说到了。

坐在火车窗边,望着窗外远去的风景,听着《旅行的意义》,蒙蒙睡意还没褪去,淡淡的忧伤油然而生。

昨天跟组长终于出发去天津了。背上大大的爬山包,走向火车站,大学时的回忆涌上心头。计划24小时以上的火车旅程很自然地开始了。昨晚吃过方便面后,聊着QQ,不知不觉地睡着了。应该才八九点左右,算是这今年最早睡的一个晚上。深夜醒来,发现QQ一堆留言,可是手机不能上网了。不管,继续睡去。

今早醒来,懒洋洋地下了床,分别用干湿纸巾擦擦脸,用矿泉水漱漱口,顺便喝掉。唉,午饭依然是方便面。比较有趣的是经过河南时,看到黄河,真的很黄!黄河边上有两个大头像,不知道是什么历史人物。还有经过许昌、郑州、邯郸,幸好能下车,在月台上拍个照。在石家庄那站,本来可以跑到火车头拍个照,但是只有几分钟时间,来不及。

好了,已经从石家庄开车了,估计天津也不远了。

PS. 1)沿途看到的河流不是黄色就是黑色的,铁道两边的垃圾,还有高耸的烟囱,庞大的火力发电站,甚至看到黄色的烟飘出来(估计是带硫的)……究竟人类对自然的破坏有多大,有多深?

2)同学朋友们都问我去哪了(因为QQ签名上写着“再见了珠海,再见了顺德,再见了广东“),只有两个朋友第一句就问去天津多久。

3)幸好出差前邮购了个USB移动电源(据说9600mAh不虚报),给G1带来源源不断的电力,打发着火车上无聊的时光。

4月的某天,一同事透露了个骇人的消息--我们部门分拆了。后来才知道公司为实行未来战略而进行的大调整--统一的产品研发与项目开发。“五一“过后落实这一政策了。

昨天晚上部门组织了“散伙饭“。虽然没大学的来得伤感,但也隐隐作痛。不是因为部门解散而伤心,而是未来的计划又得改变了。最他妈的是,作如此大的调整,公司居然没有正式的公告,只是今天下班前在公司OA上发了个新的机构图。我们的消息都是私下互传,否则根本没有心理准备去面对这变化。

机构改革就会迎来新的管理方式。今天下午才匆匆忙忙地讨论了现存项目的未来工作方式。这种会议只有一个结果,扯淡一轮后默默接受安排。

什么都别想了,先开开心心地过完“五一“,然后再回去扯淡。

PS. 胖子一直说我早点离开,然后发展自己的事业。早点离开,确实是种解脱。但是如果连这种事情都不能跨过去,将来又能怎么走呢?

一个跟我差不多同一时间进公司的同事,今天走了(离职)。由于他不是以应届毕业生的身份进公司,所以只签了一年期限的劳动合同。而这合同,就是今天期满。对于他的离职,有同事说是被公司踢走的,貌似是因为态度问题和绩效问题。

其实让我触动的是,当我也合同期满时候(大概是2011年6月末),我会以什么姿态、心态离开公司呢?有没有可能继续留下来呢?刚好今天,胖子告诉我他们公司招人,机会难得,想让我过去。胖子已经不是第一次说介绍我到他们公司的了,但是深圳始终是个门槛,加上跟现在的公司签的合同还没到期(合同附带的《补充协议》写着提前离职要支付公司1.5万),很难让自己下定决心。朋友说,要不现递个简历,过去看看吧,至于去不去,还是要认真决定好。其实这样也好,起码对自己有个交代。

PS. 现在居然涌起了一年前找工作时的感觉,同时也责备了一下近来混者日子的自己。