Calm Hill My Random Thoughts

Tunnelling Multi-Region VPC

AWS မှာက သာမန်အနေနဲ့ ကြည့်မယ်ဆိုရင်တော့ အဆင်သင့်သုံးစရာ Service တွေပဲလို ထင်စရာရှိပေမယ့် တကယ်တမ်း သုံးတဲ့အခါမှာတော့ ကိုယ်လိုချင်တာက မရှိတာများပါတယ်။ AWS ပေါ်မှာ Software Deployment က Multiple Region ဖြစ်လာပြီဆိုရင် နည်းနည်းဇာတ်လမ်း ရှုပ်လာတာက Software Development လုပ်တဲ့လူက Infrastructure ကို စဉ်းစားတဲ့အခါ Network Structure ကိုပါ ထည့်ပြီးတော့ စဉ်းစားလာရတယ်။

အခုနောက်ပိုင်းမှာ AWS က EC2 တွေမှာ VPC ကိုပဲ Support လုပ်တော့တယ်။ VPC တွေရဲ့ပြဿနာက Single Region မှာဆိုရင် Different VPC တွေရဲ့ Connectivity အတွက်က VPC Peering လုပ်လို့ရပေမယ့် Region မတူတဲ့ VPC တွေကတော့ AWS က ပေးထားတဲ့ Service တွေနဲ့ ဘယ်လိုမှ Connect လုပ်လို့မရပါဘူး အဲဒါကြောင့် Physical Network ၂ ခုကို Tunnel လုပ်သလိုပဲ EC2 Instances ၂ လုံးနဲ့ Software Layer နဲ့ Tunnel လုပ်ပြီးတော့ Connect လုပ်ယူလိုက်ရတယ်။

Physical Server မှာ Setup လုပ်တာနဲ့ Installation မှာ သိပ်မကွာခြားပေမယ့် AWS နဲ့ပဲသက်ဆိုင်တဲ့ သီးသန့်လုပ်ရမယ့် တချို့ကိစ္စတွေထဲက တခုလောက်ပဲ ကျန်နေခဲ့ရင်ကို ဘယ်လိုမှ Setup လုပ်လို့မရပါဘူး အဲဒါကြောင့် နောက်တချိန် ပြန်ပြီးတော့ လုပ်စရာရှိခဲ့ရင် မမေ့အောင်နဲ့ အသုံးတည့်တဲ့လူ ရှိခဲ့သည်ရှိသော်ဆိုပြီး Manual ကို Blog မှာရေးပြီး မှတ်ထားတာပါ လူအများစုအတွက် အသုံးကျလိမ့်မယ် မဟုတ်ပါဘူး။

  1. VPC 2 ခုကို သက်ဆိုင်ရာ Region တွေမှာ Create လုပ်ပါ။ CIDR ကို သက်ဆိုင်ရာ VPC တခုစီအတွက် သတ်မှတ်ပေးပါ စမ်းကြည့်မယ်ဆိုရင်တော့ ခွဲခြားရလွယ်အောင် တဘက်က 10.10.0.0/16 ဆိုရင် နောက်တဖက်ကို 172.10.0.0/16 စသည့်ဖြင့် ပေးထားတယ်ဆိုရင် ခွဲခြားရလွယ်ပါလိမ့်မယ်။
  2. Create လုပ်ထားတဲ့ VPC တွေမှာ DHCP Resolution နဲ့ DHCP Hostname ကို မမေ့မလျော့ Enable လုပ်ပါ မလုပ်ခဲ့ရင် နောက်ပိုင်းမှာ Hostname တွေနဲ့ အလုပ်လုပ်တဲ့ Software ပေါင်းစုံမှာ ပြဿနာလုပ်ပါလိမ့်မယ်။
  3. ပြီးရင်တော့ Subnets တွေကို Create လုပ်ပေးဖို့လိုမယ် CIDR ဟာ 16 bits အထိပဲ အကြီးဆုံးပေးလို့ရတယ် Subnets မှာတော့ 16 bits ထက်ပိုပြီး ပေးလို့ရပါတယ် လိုအပ်တယ်ဆိုရင် စိတ်ကြိုက် Create လုပ်ပါ။
  4. နောက်တဆင့်အနေနဲ့ VPC တခုစီအတွက် Internet Gateways တခုစီ Create လုပ်ပါ။ VPC တခုစီ Create လုပ်လိုက်တဲ့အခါ Default အားဖြင့် Route Table ၁ ခုစီကို Create လုပ်ပြီးသားဖြစ်ပါလိမ့်မယ် အဲဒီ Route Table တွေမှာ 0.0.0.0/0 အတွက် သက်ဆိုင်ရာ Internet Gateways တွေကို Configure လုပ်ပါ။
  5. VPC တွေထဲက Instances တွေအတွက် Security Groups ၁ ခုစီလည်း Create လုပ်ထားရမယ်။ VPC ၂ ခုကို IPsec နဲ့ Tunnel လုပ်မှာဖြစ်တဲ့အတွက် UDP Ports 500 နဲ့ 4500 ကို ဖွင့်ထားပေးဖို့လိုအပ်မယ် Setup လုပ်ဖို့အတွက် SSH ကိုလည်း ဖွင့်ထားဖိုလိုမယ် SSH ကတော့ Setup လုပ်ပြီးတာနဲ့ ပြန်ပိတ်လို့ရပါတယ်။ IPsec အတွက် UDP တွေကတော့ ပိုပြီး Secure ဖြစ်ချင်လို့ Public ကို ဖွင့်မပေးချင် သက်ဆိုင်ရာ CIDR ရဲ့ Subnet နဲ့ဖြစ်ဖြစ် Tunnel လုပ်မယ့် Instances ၂ ခုရဲ့ IP အတိအကျနဲ့ပဲဖြစ်ဖြစ်ပဲ ဖွင့်ပေးထားရင်ရတယ်။
  6. VPC ကိစ္စတွေပြီးရင်တော့ Tunnelling အတွက် EC2 Instances တွေကို သက်ဆိုင်ရာ Region ၁ ခုစီမှာ Create လုပ်ပါ Setup လုပ်ရတာ မြန်တဲ့ Ubuntu ကို 15.04 သုံးထားတယ်။ Instances တွေမှာ IP ကို Fixed ပေးပါ အဲဒါမှပဲ Setup လုပ်ရလွယ်ပါမယ် အခု Setup မှာတော့ 10.10.1.10 နဲ့ 172.10.1.10 ဆိုပြီး တခုစီ ပေးလိုက်တယ်။
  7. Elastic IP တခုစီလည်း Assign လုပ်ပါ။ Elastic IP ကတော့ မလုပ်မဖြစ်မဟုတ်ပါဘူး Instance ၂ ခုရဲ့ရလာမယ့် Public IP ကိုသုံးလည်းရပါတယ် ဒါပေမယ့် Instance ကို Stop လုပ်ဖို့ လိုအပ်မယ်ဆိုရင် Public IP က ပြောင်းမှာဖြစ်လို့ Software တွေ Reconfigure လုပ်ရနိုင်ပါတယ် အဲဒါဆိုရင်တော့ Elastic IP က ပိုအဆင်ပြေပါလိမ့်မယ်။
  8. Instances ၂ ခုလုံးရဲ့ Source/Destination Check ကို Disable လုပ်ရမယ်။ အဲဒီ Option ဟာ Networking အောက်မှာရှိတယ်။ Disable မလုပ်ထားရင် Software အားလုံး Setup လုပ်ပြီးသွားရင်တောင် အလုပ်လုပ်မှာ မဟုတ်ပါဘူး။
  9. Instances ၂ လုံးမှာ strongSwan ကို Install လုပ်ဖို့လိုပါတယ်။ sudo apt-get install strongswan
  10. ပြီးရင်တော့ IPsec ကို Configure လုပ်ရမယ် VPC ၁ ခုစီမှာရှိတဲ့ Instances ၂ လုံးလုံးမှာ Configure လုပ်ဖို့လိုတယ် Config ဟာ ၁ ခုနဲ့ ၁ခုဟာ အပြန်အလှန် Local - Remote အဖြစ်ရှိတဲ့အတွက် ပြောင်းပြန်ကွာပါတယ်။ /etc/ipsec.conf ထဲမှာ နည်းနည်းစီထည့်ရမယ်။
        conn virginia-to-singapore
            ike=3des-md5-modp1024
            ikelifetime=28800s
            keyexchange=ikev1
            esp=3des-md5
            lifetime=3600s
            rekey=yes
            type=tunnel
            authby=secret
            left=%defaultroute
            leftid=<Local EIP or PIP>
            leftsubnet=<CIDR of local VPC>
            right=<Remote EIP or Public IP>
            rightsubnet=<CIDR of remote VPC>
            auto=start
    
    /etc/ipsec.secrets ထဲမှာလည်း Tunnel Authentication အတွက် Pre-configured လုပ်ထားတဲ့ Key ထည့်ပေးဖို့လိုသေးတယ်။
        <Local EIP or PIP> <Remote EIP or PIP> : PSK “Your Secret Keys”
    
  11. ပြီးပြီဆိုရင်တော့ IPsec ကို Restart လုပ်ရင် Tunnel က စပြီးတော့ အလုပ်လုပ်ပါပြီ။
        sudo ipsec restart
    
  12. ဒီအဆင့်ပြီးရင်တော့ 10.10.1.10 နဲ့ 172.10.1.10 ကတော့ Different VPC ဖြစ်ပေမယ့် Visible ဖြစ်နေပါပြီ ဒါပေမယ့် သက်ဆိုင်ရာ VPC ထဲက အခြားစက်တွေ အတွက်ကတော့ အဆင်သင့် မဖြစ်သေးပါဘူး အကယ်၍ 10.10.1.11 ရှိခဲ့ရင် 172.10.1.11 ကို မရောက်နိုင်သေးသလို 172.10.1.11 ကနေလည်း 10.10.1.11 ကို မရောက်နိုင်သေးပါဘူး အဲလို Traffic တွေကို 10.10.1.10 နဲ့ 172.10.1.10 ကနေတဆင့် Forward လုပ်ပေးမှ ရောက်ပါလိမ့်မယ် အဲဒီအတွက်ကတော့ Kernel parameters တချို့ကို configure လုပ်ဖို့လိုပါမယ်။ /etc/sysctl.conf ထဲမှာ သွားထည့်ပါ။
        net.ipv4.ip_forward = 1
        net.ipv4.conf.all.accept_redirects = 0 
        net.ipv4.conf.all.send_redirects = 0
    
    ပြီးရင်တော့ Instance ကို restart ချရင်ချ မဟုတ်ရင်တော့ ပြင်လိုက်တဲ့ sysctl.conf က parameters တွေကို apply လုပ်ပေးဖို့လိုမယ်။
        sudo sysctl -p /etc/sysctl.conf
    
  13. နောက်ဆုံးအဆင့်အနေနဲ့ VPC တွေရဲ့ Route Table မှာ Remote VPC တွေရဲ့ CIDR တွေအတွက် ဖြတ်သွားရမယ့် Route အတွက် သက်ဆိုင်ရာ Instance ကိုထည့်ပေးရမယ် အဲဒါဆိုရင် VPC ၂ ခုလုံးအတွင်းမှာရှိတဲ့ Instances တွေအားလုံးဟာ Visible ဖြစ်ပါပြီ။