Calm Hill My Random Thoughts

SSH Tunneling

Server တွေကို Manage လုပ်ရတဲ့အထဲမှာ Port တွေကို ပိတ်ရဖွင့်ရတဲ့ ဒုက္ခကလည်း တမျိုးအပါအဝင်ပဲဆိုရမယ်။ ကိုယ့်အလုပ်မှာ Server တွေက မတူညီတဲ့ Network အများကြီးမှာရှိသလို တချို့ Server တွေက Public ကနေ Access လုပ်လို့မရဘူး Network ထဲမှာပဲ သုံးလို့ရတယ် တချို့ကျတော့လည်း Public ကနေ Access လုပ်လို့ရပေမယ့် လုံခြုံရေးအရ Port တိုင်းကို Public ကို ဖွင့်မပေးထားဘူး။ ပြဿနာက Programmer တွေ Data Migrate လုပ်မယ်တို့ဆိုပြီး Public မရှိတဲ့ Server တွေကို Public လုပ်ပေးပါတို့ ပိတ်ထားတဲ့ Port တွေကို ဖွင့်ပေးပါဆိုရင် Admin လုပ်တဲ့လူက ဖွင့်ပေးလိုက်တယ် ပြီးရင်ပြန်မပိတ်ဘူး မေ့နေတာလည်းရှိတယ် ခဏခဏဖွင့်ရပိတ်ရလို့ အလုပ်ရှုပ်တယ်ဆိုပြီး မေ့ချင်ယောင် ဆောင်တာလည်းရှိတယ်။

တကယ်တမ်းက SSH Access ရှိတယ်ဆိုရင် တချို့ကိစ္စတွေက လုပ်ယူလို့ရပေမယ့် Programmer တွေက System Admin မဟုတ်တော့ လုပ်လေ့မရှိတော့ မသိကြတာတခုပါ ခက်ခက်ခဲခဲ မဟုတ်ပါဘူး။ အဖြစ်အများဆုံးဖြစ်တဲ့ Remote Network ထဲကနေပဲ Access လုပ်လို့ရတဲ့ Server တို့ Remote Server ထဲကပဲ Access လုပ်လို့ရတဲ့ Port ဆိုတာတို့က Local Port Forwarding ရတယ်ဆိုရင် အလွယ်တကူ ရှင်းလို့ရတယ်။ Local Port Forward ဆိုတာက သဘောတရားက Server တလုံးကို SSH နဲ့ Login ဝင်လိုက်တယ် အဲဒီ Server ပေါ်ကနေ Access လုပ်လို့ရမယ့် Remote Host နဲ့ Port ကို ကိုယ့်ရဲ့ Local Machine မှာရှိတဲ့ Port တခုခုနဲ့ Map လုပ်လိုက်တယ် ပြီးပြီဆိုရင်တော့ Remote Host ကို Access လုပ်ချင်တယ်ဆိုရင် ကိုယ့်ရဲ့ Local Machine မှာ Map လုပ်ထားတဲ့ Port ကနေတဆင့် Access လုပ်ပါတယ်။

ssh -L localport:remotehost:remoteport username@servername

SSH command က ပုံမှန်အတိုင်းပဲ Option နည်းနည်းပဲပိုတယ် -L ဆိုတာက Local Port Forward အဲဒီမှာမှ localport:remotehost:remoteport Local Machine မှာ သုံးချင်တဲ့ Port ရယ် ကိုယ်သုံးချင်တဲ့ Remote Host ရဲ့ Name ဒါမှမဟုတ် IP Address ရယ် Port Number ရယ်ဆိုရင် SSH Connection ရှိနေသ၍ Local Machine က Port ကို Access လုပ်လို့ရပြီ။

ဥပမာအနေနဲ့ myserver ဆိုတဲ့ Server ပေါ်ကနေပဲ Access လုပ်လို့ရတဲ့ 10.0.1.12 ဆိုတဲ့ စက်တလုံးပေါ်က MySQL Server (Port: 3306) ကို Connect လုပ်ချင်တယ်ဆိုရင် အောက်မှာပြထားသလို Local Machine ရဲ့ Port: 13306 ကို Port Forward လုပ်ယူပြီးသုံးလို့ရတယ်။

ssh -L 13306:10.0.1.12:3306 user1@myserver

ဥပမာနောက်တခုအနေနဲ့ myserver ဆိုတဲ့ စက်ထဲမှာပဲ သုံးလို့ရတဲ့ MongoDB Server (Port: 27017) ကို Local Machine ရဲ့ Port: 37017 အနေနဲ့ Port Forward လုပ်ချင်တယ်ဆိုရင် အောက်မှာပြထားသလို လုပ်ရင်ရတယ်။ တခုပဲမျက်စေ့မလည်ဖို့က -L နောက်က ထည့်ပေးတဲ့ remotehost ဆိုတာက myserver ဆိုတဲ့ Server ထဲကနေမြင်ကြည့်ဖို့ပဲ localhost ဆိုတာ ကိုယ့်စက်မှာဆိုရင် အဲဒီစက်ကိုပဲ ဆိုလိုတာဖြစ်သလို myserver ဆိုတဲ့ Server အနေနဲ့ကြည့်ရင် အဲဒီ myserver လို့ပဲဆိုလိုတယ်။

ssh -L 37017:localhost:27017 user1@myserver

Local Port Forward ပြီးရင် နောက်ထပ်တခုက Remote Port Forward ရှိတယ် Local Port Forward က ကိုယ့်စက်က ssh နဲ့ဝင်ထားတဲ့ စက်ကနေတဆင့် လှမ်းပြီးသုံးတာ Remote ကတော့ သူနဲ့ဆန့်ကျင်ဘက် ssh နဲ့ ဝင်ထားတဲ့စက်က ကိုယ့်စက်ကတဆင့် လှမ်းပြီးသုံးတာ။ အကုန်လုံးအတူတူပဲ -L နဲ့ -R ပဲကွာတယ် localport:remotehost:remoteport မှာပါတဲ့ remotehost ဆိုတာကတော့ ကိုယ့်စက်အနေနဲ့ စဉ်းစားပြီးမြင်ဖို့လိုတယ်။ Remote Port Forward က ကိုယ့်ဆီကို ဝင်လာတာဆိုတော့ နည်းနည်းပြဿနာရှိတယ် အများအားဖြင့် SSH Server တွေက Disable လုပ်ထားလေ့ရှိတယ် သုံးချင်တယ်ဆိုရင် SSH Service တွေထဲက တချို့ Options တွေကို Configure ထပ်လုပ်ပေးဖို့ လိုတတ်ပါတယ်။ အသေးစိတ်ကို သိချင်ရင်တော့ Document မှာပဲဖတ်ပါ။

နောက်ထပ်အနေနဲ့ အသုံးဝင်တာခုက Dynamic Port Forward ဖြစ်လိမ့်မယ် သူကတော့ SOCKS Proxy အနေနဲ့ သုံးလို့ရတယ်။ မြန်မာနိုင်ငံရဲ့ ဘန်းကျော်ဆိုတဲ့ နာမည်ကို သိတယ်ဆိုရင် Proxy တို့ SOCKS တို့ဆိုတာကို စိမ်းမှာမဟုတ်ပါဘူး ငယ်တဲ့လူတွေဆိုရင်တော့ မသိလောက်တော့ဘူး။ သူအလုပ်လုပ်ပုံက Local Port Forward လိုပါပဲ ဒါပေမယ့် ဘယ် Host ဘယ် Port စသည်ဖြင့် ပုံသေအနေနဲ့ Forward လုပ်မထားတာတခုပဲ ကွာတယ်လို့ပြောရမှာပါ။ မြန်မာနိုင်ငံရဲ့ ISP တွေကို ကျော်ခွစရာ မလိုတော့ပေမယ့် ကိုယ်ကတော့ ဘယ်အချိန်တွေမှာ သုံးလေ့ရှိလဲဆိုတော့ ဟိုတယ်မှာတို့ ကော်ဖီဆိုင်မှာတို့ Public Network တွေကို သုံးရမယ်ဆိုရင် Dynamic Port Forwarding နဲ့ Tunnel တခုလုပ်ပြီး Browser ကို SOCKS ပြောင်းပြီးတော့ သုံးလေ့ရှိသေးတယ်။ အောက်မှာပြထားသလို Tunnel ဖွင့်ပြီးရင်တော့ SOCKS ကို 8080 ကတဆင့် သုံးလို့ရပြီပေါ့။

ssh -D 8080 user1@myserver

ဒီလောက်ဆိုရင် ခဏခဏနဲ့ Port ဖွင့်ပေးပါဦးလို့ ပြောတဲ့အခါတိုင်း ထပ်ထပ်ပြီးတော့ ဖြေစရာမလိုတော့ဘူး လာမေးတဲ့အခါတိုင်း ဒီရေးထားတဲ့ Link ကိုပေးလိုက်ပြီးတော့ ရအောင်သုံးဆိုပြီးတော့ ဖတ်ခိုင်းဖို့ပဲရှိတော့တယ်။

References

  1. SSH - https://man.openbsd.org/ssh
  2. SSHD - https://man.openbsd.org/sshd
  3. Example - https://www.ssh.com/ssh/tunneling/example