golang操作华为防火墙ACL实现远程启停
一、需求
某个服务端应用A在地点P1,地点P2通过网关建立的VPN来访问P1(A服务器禁止上外网,外网也不能访问A的服务)。这个A服务上线运行后,P2日常访问没什么问题。某天来了个新需求,为了增加A服务的安全性,P2不能再随意访问。要求:
- 指定的管理人员可以在任意地方查看当前服务的状态==开启或关闭==。
指定的管理人员可以随时在任意地方开启或关闭服务
某个服务端应用A在地点P1,地点P2通过网关建立的VPN来访问P1(A服务器禁止上外网,外网也不能访问A的服务)。这个A服务上线运行后,P2日常访问没什么问题。某天来了个新需求,为了增加A服务的安全性,P2不能再随意访问。要求:
指定的管理人员可以随时在任意地方开启或关闭服务
上回提到源码能正常跑起来了,但多次测试后发现有个很严重的问题。在win7下,客户端首次dial时成功连接上后write就阻塞了,而且服务端并没有收到新的请求,一直阻塞在Accept。刚开始还以为自己的代码有问题,试了很多次,才发现这个Bug。网上的代码其实没问题,只是我这Win7系统,直接触发Bug了。
github https://github.com/microsoft/go-winio/issues/173
上有提到这个问题,但官方并没有修复,有人判断是因为微软不再更新Win7了。
I was trying go-winio in my project, but I noticed that the same code had diffe
项目需要在windows中由A服务启动B.exe,当B程序处理完任务后,将数据返回给A。由于需要考虑兼容性问题,不能用socket相关通信协议。
在windows中要实现进程间通信,可以用的方式有:共享内存、socket、基于win32的消息通信(sendmessage)以及管道通信等。刚开始用的是通过临时文件来传递消息,即B程序将处理结果写到tmp.file中,服务A 隔xx秒去读取tmp.file。这个方法在项目中测试了没啥大问题,但是实在是非常Low。于决定采用其它方式实现,测试了共享内存来进行通信,发现只是比临时文件的方式好一点点,本质并没什么大的变化。再测试调用win32的api来sendmessage,发现这个api是在winform中才
搞了个vps,科学上网用了一段时间,很稳定地用了一段时间因为我基本上就到墙外查下资料,偶尔看下油管,没干过坏事
。我移动端用的是CDN+SSL+V2xx,但PC端没有上CDN,而是通过国内的VPS连到墙外的VPS。上周开了个新域名xxx.com在CloudFlare没启用CDN,直接解析到外面的VPS,当时测试了没啥问题。今天用新域名后,google网站突然打不开,但是切换到CDN线路,能正常访问。
起初以为是配置文件出问题了,ssh上去看了一圈,没发现什么异常配置,而且之前也一直用着,应该没啥问题。telnet服务器科学上网端口,发现连接不了,但是加上CDN后,telnet正常。,netstat查看连接情况,发现没加CDN的TCP连接出现SYNC_RECV。百度看了下,*SYN_RECV*
默认go build xx.go 生成的exe执行时会出现一个黑框,如果要隐藏该黑框的话,需要加上一些参数来实现。
go build -ldflags "-s -w -H=windowsgui" .\main.go
其中-w为去掉调试信息
go build -ldflags "-w -h" .\main.go