راه اندازی سرور Mosquitto MQTT بر روی سرور مجازی VPS (جلسه هفتم)

تاریخ انتشار : 2020/08/10

اهداف

در جلسه قبل تاپیک ها در پروتکل MQTT را بررسی کردیم. تا به اینجای کار، مفاهیم اصلی پروتکل MQTT در طول شش جلسه به طور مفصل مورد بحث قرار گرفتند. از این جلسه به بعد می توانیم بر روی راه اندازی و استفاده عملیاتی از این پروتکل تمرکز کنیم. در این جلسه راه اندازی سرور Mosquitto MQTT بر روی سرور مجازی VPS با سیستم عامل لینوکس نسخه ۱۶٫۰۴ را آموزش خواهیم داد. 

Mosquitto MQTT broker

 

مقدمه

Mosquitto یک سرور محبوب MQTT (بروکر MQTT) است که از جامعه پشتیبانی بسیار خوبی برخوردار است و نصب و پیکربندی آن نیز آسان است. در این آموزش نحوه نصب Mosquitto بر روی سرور مجازی VPS اوبونتو جهت راه اندازی یک بروکر MQTT را بررسی خواهیم کرد. قبل از شروع آموزش شما نیاز دارید:

  • یک سرور اوبونتو ۱۶٫۰۴ با کاربر غیر روت (non-root user)، سودو (sudo) فعال، و فایروال تنظیم شده اولیه
  • یک نام دامنه که به سرور اوبونتوی شما اشاره کند. در کل این آموزش ما از نام دامنه mqtt.example.com استفاده خواهیم کرد. 

 

گام اول: نصب Mosquitto

اوبونتو ۱۶٫۰۴ نسخه نسبتاً جدیدی از Mosquitto را به صورت پیش فرض در مخزن نرم افزار خود دارد. با کاربر غیر روت خود وارد شده و Mosquitto را با دستور apt-get نصب کنید.

 $ sudo apt-get install mosquitto mosquitto-clients

اوبونتو به طور پیش فرض خدمات Mosquitto را پس از نصب شروع می کند. برای تست بروکر، از کلاینتی که به تازگی نصب کرده ایم استفاده خواهیم کرد. به یاد داشته باشید که خدمات MQTT در این صورت لوکال می باشد و برای خدمات آنلاین می بایست آدرس دامین خریداری شده به آی پی سرور شما اشاره کند. 

یک بار دیگر به سرور اوبونتوی خود وارد شده و برای مشاهده نتایج ارسال و دریافت پیام دو ترمینال را کنار هم باز کنید. برای اشتراک در یک تاپیک تست (برای یادگیری مفهوم تاپیک در پروتکل MQTT کلیک کنید) از دستور mosquitto_sub استفاده کنید. در طول این آموزش ما از تاپیک آزمایشی test استفاده خواهیم کرد.

 $ mosquitto_sub -h localhost -t test 

در دستور بالا h- نشان دهنده نام سرور (hostname) و t- نام تاپیک (topic) می باشد. اکنون کلاینت شما آماده دریافت پیام بر روی تاپیک test می باشد. حال در ترمینال دیگری باید پیامی را بر روی همین تاپیک ارسال کنیم. برای اینکار از دستور زیر استفاده می کنیم:

 $ mosquitto_pub -h localhost -t test -m "hello world" 

گزینه های موجود برای دستور mosquitto_pub همانند گزینه های mosquitto_sub می باشد با این تفاوت که در اینجا یک گزینه دیگر m- را داریم که محتوای پیام ارسالی را مشخص میکند. با زدن دکمه Enter باید پیام hello world را در ترمینال دیگر ببینید. تبریک! با اینکار شما اولین پیام MQTT خود را ارسال کردید. 

ترمینال دوم را با زدن CTR+C ببندید ولی ترمینال اول را برای ادامه پیکربندی باز نگه دارید.

 

گام دوم: نصب Certbot برای دریافت گواهی Let’s Encrypt

سرویس Let’s Encrypt یک سرویس جدیدی است که برای صدور گواهی نامه های SSL رایگان از طریق یک API به کار می رود. کلاینت های بسیاری می توانند با این API ارتباط برقرار کنند. اوبونتو یک کلاینت رسمی در مخزن خود دارد ولی این نسخه تقریبا قدیمی بوده و چند ویژگی مهمی که ما نیاز داریم در این کلاینت وجود ندارد. برای حل این مشکل، ما از PPA اوبونتو یا همان بایگانی پکیج های شخصی استفاده خواهیم کرد. ابتدا مخزن زیر را اضافه کنید:

 $ sudo add-apt-repository ppa:certbot/certbot 

سپس لیست پکیج ها را با دستور زیر آپدیت کنید تا اطلاعات پکیج جدید را در مخزن اوبونتو داشته باشید:

 $ sudo apt-get update 

در نهایت کلاینت رسمی Let’s Encrypt را با نام certbot نصب کنید:

 $ sudo apt-get install certbot 

حال که certbot را نصب کردیم، باید آن را اجرا کنیم تا گواهی نامه خود را دریافت کنیم.

 

گام سوم: اجرای Certbot

برای اثبات اینکه ما دامنه خود را کنترل می کنیم، certbot باید به یک چالش رمزنگاری صادر شده توسط API پاسخ دهد. برای این منظور certbot از پورت ۸۰ (HTTP) و / یا ۴۴۳ (HTTPS) استفاده می کند. ما فقط از پورت یا درگاه ۸۰ استفاده خواهیم کرد و با دستور زیر این پورت را مجاز می کنیم:

 $ sudo ufw allow http 

خروجی این دستور به صورت Rule added خواهد بود.

اکنون می توانیم Certbot را برای دریافت گواهینامه خود اجرا کنیم. دستور standalone– حل چالش رمزنگاری صادر شده توسط API را به خود certbot واگذار می کند. دستور standalone-suported-challenges hhtp-01– نیز ارتباطات را فقط به پورت ۸۰ محدود می کند. عبارت d- نام دامنه ای که می خواهیم گواهینامه برایش صادر شود را مشخص کرده و عبارت certonly به certbot می گوید عملیات اخذ گواهی نامه را بدون انجام پیکربندی های اضافی انجام دهد.

 $ sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com 

هنگام اجرای این دستور از شما خواسته می شود که آدرس ایمیلتان را وارد کنید و با شرایط خدمات موافقت کنید. پس از انجام این کار، باید پیامی را ببینید که به شما می گوید روند صدور گواهی نامه موفقیت آمیز بوده و مکان های موجود در گواهی نامه های شما ذخیره شده است. این پیام به این معنی است که گواهی نامه برای ما ارسال شده است. در گام بعدی، به certbot می گوییم هر گاه زمان انقضای گواهی نامه ها رو به اتمام است آنها را به صورت خودکار تمدید کند. 

 

گام چهارم: تنظیمات certbot برای تمدید خودکار گواهی نامه

گواهی نامه های Let’s Encrypt فقط برای ۹۰ روز معتبر هستند. این کار جهت تشویق مشترکین برای تجدید گواهی نامه هایشان است. برای بررسی انقضا و تمدید گواهی نامه ها نیاز داریم دستوراتی را به طور مرتب در سرور اجرا کنیم. برای بررسی روزانه گواهی نامه ها، از عبارت cron که یک سرویس سیستم استاندارد برای اجرای وظایف دوره ای است استفاده می کنیم. دستور زیر را وارد کنید:

 $ sudo crontab -e 

با اجرای این دستور به یک ویرایشگر متن وارد خواهید شد. این فایل حاوی دستورات پیشفرض است. شما باید دستور زیر را در انتهای متن پیش فرض وارد کرده، ذخیره کنید و از آن خارج شوید. 

 ۱۵ ۳ * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto" 

با ذخیره پرونده بالا تمدید گواهی نامه ها به صورت خودکار صورت خواهد گرفت. در گام بعدی، تنظیمات مربوط به امنیت بروکر را بررسی خواهیم کرد.

 

گام پنجم: پیکربندی پسوورد MQTT

بدیهی است که در کاربردهای تجاری MQTT نیاز به پسوورد یک امر ضروری می باشد. Mosquitto شامل ابزاری برای تولید یک فایل رمز عبور ویژه به نام mosquitto_passwd است. این دستور به شما اجازه می دهد تنظیمات مربوط نام کاربری و رمز عبور را مشخص کرده و در دایرکتوری /etc/mosquitto/passwd قرار دهید. 

 $ sudo mosquitto_passwd -c /etc/mosquitto/passwd TechBee 

اکنون یک فایل پیکربندی دیگری از Mosquitto را باز می کنیم و در آن دستوری را می نویسیم که مشخص می کند برای همه اتصالات از نام کاربری و رمز عبور بالا استفاده کند:

 $ sudo nano /etc/mosquitto/conf.d/default.conf 

با این دستور به یک فایل خالی وارد می شود. متن زیر را در داخل فایل کپی کنید:

 allow_anonymous false 

 password_file /etc/mosquitto/passwd 

عبارت allow_anonymous false همه اتصالات غیرمعتبر (بدون نام کاربری و رمز عبور) را می بندد. عبارت password_file نیز مسیری که اطلاعات نام کاربری و رمز عبور در آن قرار دارد را مشخص می کند. حال نیاز است Mosquitto را ریستارت کرده و نتیجه تغییرات را در آن ببینیم:

 $ sudo systemctl restart mosquitto 

یک پیام بدون نام کاربری و رمز عبور ارسال کنید:

 $ mosquitto_pub -h localhost -t "test" -m "hello world" 

بروکر اتصال را رد کرده و با پیام زیر مواجه خواهید شد:

 Connection Refused: not authorised. Error: The connection was refused. 

قبل از اینکه دوباره با رمز عبور امتحان کنیم، دوباره به پنجره ترمینال دوم خود بروید و اینبار با استفاده از نام کاربری و رمزعبور در تاپیک  “test” سابسکرایب کنید:

 $ mosquitto_sub -h localhost -t test -u "TechBee" -P "password" 

حال با ترمینال اولیه یک پیام با نام کاربری و رمز عبور ارسال کنید:

 $ mosquitto_pub -h localhost -t "test" -m "hello world" -u "TechBee" -P "password" 

خروجی این دستور می بایست همانند خروجی گام اول باشد. حال ما رمز عبور را برای بروکر اضافه کردیم. با این حال، این رمز بدون رمزنگاری در اینترنت ارسال می شود. برای حل این مشکل می بایست رمزنگاری SSL را به بروکر اضافه کنیم. 

 

گام ششم: اضافه کردن SSL به Mosquitto

برای فعال کردن رمزگذاری SSL باید به Mosquitto بگوییم که گواهی نامه های رمزگذاری شده Let’s Encrypt کجا ذخیره شده اند. فایل پیکربندی را که قبلاً شروع کرده ایم باز کنید:

 $ sudo nano /etc/mosquitto/conf.d/default.conf 

در انتهای فایل متن زیر را بدون دستکاری متن قبلی وارد کنید:

. . .
listener 1883 localhost
listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

در اینجا ما دو بلوک مجزای گوش دهنده (listener) به پیکربندی اضافه کردیم. بلوک اولی از طریق پورت ۱۸۸۳ اتصالات را گوش می دهد که این یک پورت استاندارد غیررمزنگاری شده است. توجه داشته باشید که این listener قادر به شنیدن پیام های بیرونی نبوده و فقط پیام های لوکال را گوش می دهد (چیزی که تا الان در آموزش از آن استفاده می کردیم). عبارت listener 8883 به صورت رمزنگاری شده به پورت ۸۸۸۳ گوش می دهد. پورت ۸۸۸۳ یک پورت استاندارد برای پروتکل MQTT + گواهی SSL می باشد که گاها به آن MQTTS اطلاق می شود. سه خط نهایی هر سه به Mosquitto مسیر گواهی های SSL را مشخص می کنند. پرونده را ذخیره کرده و ببندید و سپس Mosquitto را ریستارت کنید تا تنظیمات آپدیت شوند:

 $ sudo systemctl restart mosquitto 

فایروال را به روز کنید تا امکان اتصال به درگاه ۸۸۸۳ فراهم شود:

 $ sudo ufw allow 8883 

با اجرای دستور بالا خروجی Rule added را مشاهده خواهید کرد. اکنون دوباره با استفاده از دستور mosquitto_pub و با چند گزینه مختلف برای SSL ارسال پیام را تست می کنیم:

 $ mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "TechBee" -P "password" 

توجه داشته باشید که در دستور جدید به جای localhost از نام کامل سرور mqtt.example.com استفاده می کنیم. اگر سعی کنید یک پیام رمزنگاری شده را از طریق localhost ارسال کنید با پیام خطا مواجه خواهید شد. عبارت p- نشان دهنده پورت ارتباطی، u- نام کاربری و P- رمز عبور می باشد. اگر مراحل بالا به درستی انجام شده باشند، در ترمینالی که دستور mosquitto_sub را اجرا کرده اید پیام hello again را مشاهده خواهید کرد. این بدان معنی است که سرور شما به طور کامل پیکربندی شده و آماده استفاده می باشد. اگر می خواهید پروتکل MQTT را برای کار با وب سوکت ها گسترش دهید می توانید مرحله نهایی را نیز دنبال کنید.

 

گام هفتم: تنظیمات وب سوکت (اختیاری)

پروتکل MQTT از وب سوکت به منظور ارتباط جاوااسکریپت از طریق مرورگر وب استفاده می کند. برای مثال وقتی سیستم اینترنت اشیای شما برای کنترل دستگاه ها از وب اپلیکیشن استفاده می کند، باید این گزینه را در پیکربندی بروکر خود اضافه کنید. برای اینکار نیاز است یک بلوک listener دیگری به فایل پیکربندی Mosquitto اضافه کنیم. فایل پیکربندی را با دستور زیر باز کنید:

 $ sudo nano /etc/mosquitto/conf.d/default.conf 

بلوک listener 8083 را بدون دستکاری متن قبلی اضافه کنید:

. . .
listener 1883 localhost
listener 8883
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

همانگونه که واضح است، ما یک بلوک listener با پورت ۸۰۸۳ و پروتکل آن (که وب سوکت است) را به فایل پیکربندی اضافه کردیم. برای وب سوکت هیچ پورت استانداردی وجود ندارد با این حال پورت ۸۰۸۳ بیشتر از همه معمول است. فایل پیبندی را ذخیره کرده و از آن خارج شوید. با دستور زیر Mosquitto را آپدیت کنید:

 $ sudo systemctl restart mosquitto 

سپس پورت ۸۰۸۳ را در فایروال باز کنید:

 $ sudo ufw allow 8083 

برای تست این قابلیت از یک کلاینت MQTT مبتنی بر مرورگر استفاده خواهیم کرد. کلاینت Paho را از این لینک در مرورگر خود باز کنید. موارد زیر را مشاهده خواهید کرد:

paho client

 

اطلاعات خواسته شده برای ایجاد ارتباط را مطابق زیر تکمیل کنید:

 

  • هاست (Host): باید برابر با نام کامل سرور Mosquitto شما باشد. در این آموزش ما از mqtt.example.com استفاده کردیم که باید نام سرور خودتان را جایگزین کنید. 
  • پورت (Port): باید برابر با ۸۰۸۳ باشد.
  • شناسه کلاینت (ClientID): برابر با مثدار پیش فرض (js-utility-DI1m6).
  • پچ (Patch): برابر با پیش فرض (ws/). 
  • نام کاربری (Username): نام کاربری بروکر Mosquitto که در این آموزش ما از نام کاربری TechBee استفاده کردیم.
  • رمز عبور (Password): رمز عبوری که برای بروکر Mosquitto انتخاب کرده اید.

 

موارد باقی مانده نیز می توانند در مقدار پیش فرض باقی بمانند. 

با زدن گزینه connect، کلاینت Paho به بروکر شما وصل خواهد شد. برای ارسال پیام و مشاهده آن در مرورگر، می توانید همانند دستور ارسال پیام گام ششم عمل کنید. در این صورت نیاز دارید در کلاینت Paho به تاپیکی که پیام بر روی آن ارسال می شود سابسکرایب کنید. 

 

نتیجه گیری

در این جلسه ما راه اندازی سرور Mosquitto MQTT بر روی سرور مجازی VPS را در هفت گام آموزش دادیم. در جلسه بعد پروتکل MQTT با استفاده از پلتفرم آردوینو را آموزش خواهیم داد. 

2 دیدگاه برای “راه اندازی سرور Mosquitto MQTT بر روی سرور مجازی VPS (جلسه هفتم)”

  1. ali گفت:

    salam
    dar game 3 baad az vared kardan email error DNS midahad
    age mishe rah hal roo begid. mmanoon
    NS problem: NXDOMAIN looking up A for mqtt.eclipse.com

برخی از مشتریان

لوگو شریف
لوگو آمد
لوگو شهرداری تهران
لوگو دانشگاه تهران
لوگو ساتکاپ
لوگو دانشگاه ارومیه
logofa