Let’s Encrypt SSL ใน Pfsense
Let’s Encrypt SSL ใน Pfsense
สำหรับคนที่เข้ามาอ่าน เนื่องจากบทความติดตั้ง Let’s Encrypt SSL ใน Pfsense นี้ เขียนไว้ค่อนข้างจะนาน ข้อมูลต่างๆ ในบทความนี้ อาจจะไม่สมบูรณ์ เพราะอาจจะมีการอับเดทหรือเปลี่ยนแปลง แต่ สามารถอ่านอ้างอิงได้เพื่อเป็นแนวทางในการจัดทำ และ อ้างอิงมาจากเว็บนี้ครับ
การดำเนินการทุกอย่างในติดตั้ง Let’s Encrypt SSL ใน Pfsense นี้ เกิดจากเว็บที่ลองทำมีปัญหากับการคอนฟิกค่า HTTPS เพราะ server ports 80 และส่งมายัง ports 443 จะมีปัญหาตอนเรียกค่า URL ในบทความ แต่ก็แนะนำเผื่อจะได้นำไปใช้หรือพลิกแพลงได้
ขั้นตอนการปรับแต่ง Acme haproxy
รูปแบบโครงสร้างของระบบเครือข่าย เพื่อใช้อ้างอิงในบทความนี้
- Firewall pfsense IP 192.168.101.
- Dynamic dns 2 ตัว โดยกำหนดชื่อ ciasteam.duckdns.ort สำหรับ เข้าสู่ระบบ Bot โดยใช้ของ duckdns.com และอีกตัว กำหนดชื่อ intteam.ddnsfree.com ใช้ dynu.com ตัวนี้ กำหนดเข้าสูเว็บไซต์ wordpress
- มี server 2 ตัว ติดตั้งภายในวง DMS ตัวแรกหมายเลข ip 192.168.5.12 ทำหน้าที่เป็น bot และอีกตัว 192.168.5.15 ทำหน้าที่บริการเว็บไซต์ ทั้งสองตัวนี้ แยกอยู่ใน วง DMZ GW 192.168.5.1
- ติดตั้ง packet ACME เพื่อเข้ารหัส ssl โดยแยกเป็น 2 Certificate ตัวหนึ่ง สำหรับ bot อีกตัวสำหรับ website
- ติดตั้ง packet haproxy เพื่อกำหนดเส้นทางไปยัง server bot ,web
เริ่มจากการ ติดตั้ง Acme Package
เส้นทางเพื่อเข้าไปติดตั้ง Acme
System /Package Manager/Available Packages
สร้าง Account Key
เส้นทาง Services /Acme /Accountkeys
คลิก Add. จากภาพด้านบน ได้สร้าง AccountBot ไว้แล้ว 1 Account
การกำหนดค่า Account keys
ขั้นตอนการสร้าง
- Name ให้กำหนดชื่อที่เราจะสร้าง
- Description คำอธิบาย
- ACME ตัวเลือกว่าจะใช้ตัวไหน แต่ส่วนมากตามภาพ
- กำหนดเมล์เพื่อคอยเตือน
- กดเลือก Create new account key เพื่อสร้างคีย์
- กดเลือก Register ACME account key
- Save
การสร้าง Certificates
ตัวอย่าง Certificates ที่สร้างเสร็จแล้ว
จากภาพข้างบน จะเห็นว่า ได้สร้าง certificats 2 ตัว
- ตัวแรกกำหนดให้ใช้สำหรับ bot
- ตัวที่สองกำหนดใช้สำหรับเว็บไซต์
(จำไว้ให้ดี นะครับ เพราะจะต้องไปอ้างอิงในขั้นตอนการปรับแต่ง Frontend เราจะต้องกำหนด 2 ตัวนี้ เพื่อแยกการเข้ารหัสออกจากกัน
วิธีการสร้าง certificates bot แบบ standalone http server
หลังจากที่สร้าง Account keys เสร็จก็สร้าง Certificaes
ตามภาพ ด้านบน คือการกำหนดชื่อของ Certificate และกำหนด private key ให้กำหนดค่าตามภาพ
ขั้นตอนต่อมา ตามภาพด้านบนคือหน้าเดียวกันครับ แต่จับภาพได้ไม่หมด คือ การเข้ารหัส สำหรับ Server bot
หลังจากนั้น ก็เข้าไปตั้งค่าของ Domain san list สิ่งที่เราต้องกำหนดคือ
- ชื่อ Domainname จากบทความได้กำหนดว่า ciasteam.duckdns.org ซึ่งเป็น ddns ที่เราไปลงทะเบียนไว้ ที่เว็บไซต์ duckdns.org เพื่อเข้าไปยังเครื่อง server ที่ใช้ทำ Bot
- กำหนด method ให้เป็น แบบ Standalone HTTP server แล้ว
Port: | HTTP listen port for stand-alone server. Must be 80 or have port 80 on WAN forwarded to this port. Firewall rules must allow traffic to reach this port. |
ในกรณีที่กำหนด Standalone HTTP Server จะต้องมี ports 80 ว่าง เพราะโปรแกรมกำหนดว่า ต้องผ่าน ports 80 และเราต้องกำหนด ports อะไร ก็ได้ ขึ้นมาอีก ports เพื่อไว้รองรับการทำงานที่ส่งต่อมาจาก Ports 80
จาก ตัวอย่างกำหนด ports 8082 ซึ่งเราจะกำหนด ports อะไรก็ได้ และเราจะต้อง แก้ไข Firewall/net ให้ ports ดังกล่าว สามารถผ่านเข้ามาได้ และไปยังหมายเลขไอพี ขา lan ของpfsnse (ตามรายละเอียดข้างล่าง ท้ายบทความ)
ตัวอย่างการกำหนดค่า กรณีที่ เรากำหนด Method แบบ Standalone HTTP server
ในส่วนของ Domainname ก็กำหนดตามความต้อง และเลือกสร้าง Ports อีก Ports จากภาพเลือก 8082 และ Ports นี้ต้องกำหนดให้ผ่านมายัง Ports ได้
ตัวอย่างการกำหนด NAT
Firewall / NAT / Port Forward
ตามภาพข้างบน คือการสร้าง rule ซึ่งมันจะ forwards port 80 HTTP to port 8080 มายัง pfSense IP address
จากตัวอย่างที่ผ่านมาถือว่าเราปรับแต่ง เสร็จในส่วนที่เรากำหนด method standalone HTTP server
การสร้าง certificates แบบ method จากผู้ให้บริการ DDNS
ลองสร้างจาก Duckdns.org ตามตัวอย่างที่ผ่านมา แต่ครั้งนี้ จะเปลี่ยนจาก method standalone HTTP server มาเป็นแบบ ใช้ของ ddns
ให้กำหนดค่าใน Domain SAN list ตามภาพข้างบน
- กำหนดค่า โดเมนเนม
- เลือก Method ให้ตรงกับ ddns ของเรา ตามตัวอย่างของ DNS-DuckDns
- เพิ่มค่า API Teken ซึ่งได้รับจากผู้ให้บริการ DDNS
- ให้เปิดค่า Enable DNS alias mode
- คลิกเลือก Enable DNS
กรณีการสร้าง Method จาก DDNS ของ dynu.com
เหมือนกับขั้นตอนที่ผ่านมา คือกำหนด Domain SAN List โดยกำหนดชื่อ โดเมนเนม และเลือก Method DNS-Dynu
แต่ในกรณีของ Dynu.com จะไม่มีการกำหนดค่า Token แต่ เอาค่า API Client id ,Secret มาวางแทน ค่าสองตัวนี้ ให้เข้าไปยังผู้ให้บริการ แล้ว copy มาวาง
ที่เหลือไม่ต้องแต่งค่า เป็นอันเสร็จ
การติดตั้ง HAProxy Package
System / Package Manager / Available Packages find a package haproxy. Click the install button and allow it to complete.
การกำหนดค่า HAProxy
HAProxy คือการกำหนดเส้นทางเพื่อให้ไปยัง server ตามที่เราต้องการ
และจะมีการทำงานแบ่งเป็น 2 ส่วน คือ
- Frontend
- Backend
โดยปกติ เราสามารถ forward ผ่านทาง firewall/net ได้ แต่มีปัญหาตรง เส้นทางในการเข้ามา ports ไม่พอ และกรณีต้องการใช้ ssl หากไม่มี Domain จริงไม่สามารถใช้ Certbot ได้ หากใช้ DDNS จะไม่รองรับ และหากไม่รองรับจะไปแต่งค่า server เพื่อรองรับ ports 443 ก็แต่งยาก เพราะต้องซื้อ เลยใช้วิธีการ ให้ Acme เข้ารหัสให้ แล้วส่งต่อมายัง HAProxy อีกที่ในการสร้างและกำหนดเส้นทางไปยัง server แต่ละตัว และอย่างที่บอก ACME จะเข้ารหัส ดังนั้น ports แรกที่จะต้องรองรับคือ 443 ดังนั้น เราต้องกำหนด frontead เป็น 443 แล้วส่งต่อให้ backend เป็น ports 80
แต่งค่า Backend ก่อน
ข้้นตอนแรก ในการปรับแต่ง คือแต่งค่า Backend ก่อน ส่วนนี้ จะติดต่อกับ Server โดยตรง โดยรับค่ามาจาก Frontend .
เส้นทาง Services /HAProxy/backend
จากภาพข้างบน จะเห็นว่า มี ชื่อ (์Name) สองชือคือ
- ตัวแรกคือ apache2 จะใช้ชื่อนี้ในการติดต่อกับ frontend และต้องกำหนดค่าตัวนี้ลงรายละเอียดเกี่ยวกับ Server ของเราซึ่งใช้ Ports 80 ในที่นี้ คือ Bot Server
- ตัวที่สอง คือ wordpress สำหรับติดต่อกับ frontend และกำหนดค่า เกี่ยวกับ Web server
กำหนดในส่วนที่ต้องการจะทำ Bot server ก่อน
มาลงรายละเอียดกัน
- ตัวแรกก่อน (ภาพด้านบน) ตัวนี้ ชื่อ apache2 เป็นชื่อในการอ้างอิงเพื่อติดต่อกับ frontend สิ่งที่เราจะต้องกำหนด คือ Server List ตามภาพ คือกำหนดค่า ให้ Forwardto ไปยัง ip Address 192.168.5.12 ซึ่งเป็น ip ของ bot Server และกำหนดว่าให้ ผ่าน port 80 นั้นแสดงว่า server เราจะต้องเปิด ports 80 ไม่ใช่ 443
- กำหนดค่า Health check method ตามภาพข้างบน
มากำหนดในส่วนที่ต้องการทำ Web server
กำหนด ในส่วนที่จะติดต่อ กับ website หมายเลขไอพี 192.158.5.15 Name= wordpress ใช้ชื่อนี้ ในการติดต่อกับ frontend และติดต่อกับ server Forwardto 80 เช่นกัน ตามภาพข้างบน
การปรับแต่ง Frontend
จากภาพ ด้านบน คือภาพที่เรากำหนดค่าเสร็จแล้ว จะเห็นว่าเรากำหนด frontend ไว้ 2 ตัว คือ
- apche ,
- website
- หมายเลขไอพี Address เหมือนกันทั้ง 2 ตัว เพราะเป็นไอพี จริงของผู้ให้บริการ ซึ่งมีแค่ไอพีเดียว และมีเครืองหมายกุญแจ แสดงว่ามีการเข้ารหัส
- หากดูตรง Type จะเข้ารหัสแบบ https
- และดูตรง Backend สองตัว ตามขั้นตอนที่ผ่านมาที่บอกว่าเป็นตัวอ้างอิง คือ apache2 และwordpress
วิธีการกำหนดค่า Bot server
จากภาพด้านบน จะเห็นว่า ได้กำหนด
- Name= apache
- Description ยังไมได้กำหนด คือคำอธิบาย
- Status=Acitve
Extenal address
- กำหนดให้ ขา wan เป็นส่วนที่รอรับการเชื่อมต่อเข้ามา
- กำหนด ports ให้เข้ามาผ่านทาง ports 443
- คลิกเลือกค่า ssl Offloading
กำหนดค่า
Access Control Sete
- Name= apache
- Value= ciasteam.duckdns.org
Actions
คือการกำหนดให้ใช้ Backend ตัวไหน จากภาพข้างบน กำหนด ให้ใช้ Backend apache2 คือกำหนดว่า ให้ไปยัง backend ที่มีชื่อว่า apach2 ที่เรากำหนดตามขั้นตอนที่ผ่านมา.
Use “forwardfor” option
ให้คลิกเลือกเลือก User forardfor
Certificate
ขั้นตอนนี้ คือการเลือก Certificate ทีเราสร้างขึ้นในขั้นตอนการปรับ แต่ง Acme ให้เลือกชื่อให้ตรงกับที่เราสร้างขึ้นมา อย่างในภาพ Certificate CsdAcme คือตัวที่เราสร้างเพื่อเข้ารหัสผ่านช่องทางของ bot
การกำหนดค่า สำหรับเชื่อมต่อกับ Web Server
การปรับแต่ง HAProxy Frontend ตัวที่ สอง คือการสร้างเส้นทางเพื่อไปยัง website
เนื่องจาก ip ที่ผ่านขา wan มีแค่ค่าเดียวคือ ip isp จ่ายมาก เราจึงกำหนดค่า Shared Frontend (ตามภาพข้างบนาฉ
หลังจากนั้น ก็เหมือนกับการสร้างตัวแรก แต่ครั้งนี้ เรากำหนดให้ Host matches ให้ตรงกับชื่อ dynamic dns ของ website คือ intteam.ddnsfree.com
ตามภาพข้าง บน เพื่อให้การเข้ารหัส แยกจากกันกับตัว bot จึงกำหนดค่า เลือกตรงตัว User Offloading แล้วเลือก Certificates ให้ตรงกับที่เราสร้างขึ้นมาสำหรับเชื่อมต่อกับเว็บไซต์ ตามภาพ จะชื่อว่า CsdCme web
เป็นอันว่า เสร็จสินการปรับแต่ง Acme HAProxy