最近在看containerd的代碼,上手試的時候才發現它監聽的是unix socket,沒法從外部通路containerd。
而我要驗證的是從遠端能不能通路containerd、管理containerd的容器,是以需要一個從遠端通路unix socket的工具。
網上搜了一圈,沒有現成的實作,就自己寫了
sockfwd 。用法
Usage:
sockfwd [flags]
Flags:
-d, --destination string 目的位址,即要轉發到的位址
-s, --source string 源位址,即接收請求的位址
-q, --quiet 靜默模式
例子
将本地的containerd執行個體暴露到網絡上:
./sockfwd -s tcp://127.0.0.1:8090 -d unix:///var/run/containerd.sock
将本地的
127.0.0.1:8080
端口暴露到
0.0.0.0:8090
端口上:
./sockfwd -s tcp://127.0.0.1:8090 -d unix://127.0.0.1:8090
将本地的服務暴露到網絡上,需要格外注意是否有安全隐患!
其他碎碎念
最近在寫golang,發現如果僅僅是處理資料面的話,golang提供的goroute再加channel就能夠很優雅地處理資料轉發,比如這篇文章寫的sockfwd。
但是如果涉及管控面,比如複雜的狀态管理,資訊跨線程/goroute同步,那麼channel的抽象能力還是不夠的,需要寫很多額外代碼。
後續計劃
可以加上支援tls認證來更加安全地轉發資料。