שימוש ב-HugePages עם Oracle על RHEL4

לאחרונה נוכחתי בהרצאתו של אמיר סלע, בכנס OpenIsrael 2011. המצגת דיברה על חידושים ב-RHEL6, ביניהם
הוספה של Patch אשר הוסיף תמיכה ב-Transparent HugePages ל-RHEL6.

קצת רקע: כברירת מחדל, הקרנל מנהל את הזכרון בבלוקים של 4K. כלומר, בקשה של 4M של זכרון תגרום לקרנל להקצות 1024 דפי זכרון.
מנגנון ה-HugePages מאפשר ניהול של בלוקים של 2M בזכרון, ונועד לאפשר ניהול יעיל יותר והקצאה מהירה יותר של זכרון עבור פרוססים שדורשים הרבה זכרון (עוד על כך בהמשך)

בקרנלים ישנים יותר\גרסאות ישנות יותר של RHEL, היה צורך להגדיר מראש את כמות ה-HugePages שנקצה. התוספת (שתופסת) ל-RHEL6 מאפשר הקצאה אוטומית של HugePages כאשר פרוסס מבקש כמות גדולה של זכרון.

לנושא הפוסט. צרכן קלאסי, ואחד שיצא לי "לנהל", של זכרון הוא Oracle. החל מ-Oracle 9 ומעלה, המערכת תדע לבקש אוטומאטית HugePages בהינתן כמה דרישות קדם שיסופקו. היתרון הוא כמובן ניהול טוב יותר של הזכרון, הקצאה מהירה יותר ושיפור ביצועים כללי.

אז כדי לאפשר שימוש ב-HugePages ב-RHEL4, נתחיל בקביעת כמות הזיכרון שנרצה להקצות כ-HugePages. ההקצאה תעשה בד"כ לפי גודל ה-SGA. למשל, במערכת שה-SGA שלה הוא 4G, נצטרך להקצות 2048 בלוקים של HugePages (שהם 2M*2048 = 4G).
ההקצאה נעשית בעזרת כתיבת הערך הרצוי לתוך /proc/sys/vm/nr_hugepages.


# echo 2048 > /proc/sys/vm/nr_hugepages

אפשרות שניה היא שימוש ב-sysctl, ע"י הוספת השורה


vm.nr_hugepages = 2048

לקובץ /etc/sysctl.conf, והרצת הפקודה "sysctl -p". את התוצאה ניתן לראות בפלט של הפקודה


# cat /proc/meminfo | grep HugePages
HugePages_Total: 2048
HugePages_Free: 0

חשוב לציין כמה עובדות:
א. הזכרון שמוקצה נלקח מהמערכת הפעילה ויראה כזכרון שבשימוש, אפילו אם אף אפליקציה לא תשתמש בו
ב. במידה וביקשתם 2048 בלוקים, ואין מספיק פנויים במערכת, יוקצו רק כמות הבלוקים האפשרית. במקרה כזה קרוב לודאי שיהיה צורך לאתחל את המערכת או להוריד תהליכים אשר משתמשים בזכרון, ולנסות שוב.

דרישת קדם נוספת היא מתן הרשאה ל-oracle לנעול כמות זהה לזכרון ה-SGA ב-RAM. יש להכניס את השורות הבאות לקובץ /etc/security/limits.conf


oracle soft memlock 4194304
oracle hard memlock 4194304

כאשר הערך המספרי הוא ב-K, ובמקרה הזה הוא 2 * 2048 * 1024 (מגה * בלוקים * 1024).

אחרי העלאה של Oracle, ניתן לוודא שאכן הוא משתמש ב-HugePages:


# cat /proc/meminfo | grep HugePages
HugePages_Total: 2048
HugePages_Free: 2048

הניתן לראות כי כל הזכרון בשימוש. בבדיקה של הזכרון שבשימוש ע"י Oracle, למשל דרך ps, ניתן יהיה לראות כי Oracle הקצה את כל גודל ה-SGA

לסיכום, מומלץ להשתמש ב-HugePages, לא משנה באיזה גרסאת קרנל\RHEL אתם משתמשים.
נקודה אחת לתשומת לב היא שיש צורך להגדיל את כמות ה-HugePages ולשנות את limits.conf אם רוצים להגדיל או להקטין את ה-SGA.

Tagged , , | Leave a comment

שבתי

אפשרות האחסון הקודמת שהייתה לי לבלוג נסתיימה לה. כמובן שאין לי תלונות, זה ניתן חינם, ללא בקשת תמורה (תודה אריק). אז התחלתי לחפש לי אפשרויות אחרות לאחסון הבלוג הצנוע שלי.
לאחרונה ראיתי כי Amazon מציעים לנרשים חדשים לשרות ה"ענן" שלהם Instance פחות או יותר חינם, למשך שנה. אמנם מדובר ב-Micro Instance (עם 680M RAM וחלק ממעבד), אבל בשביל wordpress בעל תעבורה נמוכה, בהחלט מספיק.

אז נרשמתי לשרות, והתחלתי קצת ללמוד על המערכת של Amazon. התרשמתי מפשטות ההפעלה, ולמרות שמרעיפעם עליך קצת עודף של מידע, הצלחתי להרים מכונה עם Debaian Squeeze, lighhtpd, php-cgi ו-MySQL.

אני מקווה שבעתיד אוכל להקדיש קצת יותר זמן לכתיבה.

Posted in כללי | 2 Comments

הפינגווין 2

בעקבות הפוסט הקודם על כך שהפינגווין מחפש בית חדש, שמחתי לקבל כמות מרשימה של הצעות מחברי הקהילה. ההצעה הראשונה (מני רבות) שהגיע הייתה מיהודה מ-Whatsup, שהציע לארח את אתר הפינגווין אצלם. קפצתי על ההצעה, והיום הפינגווין יושב על שרתי Whatsup.

בעצם, רק רציתי להודות ליהודה ומאיר על אירוח האתר. נחמד לדעת שעדיין יש כל כך הרבה אנשים טובים.

Posted in כללי | 1 Comment

הפינגווין

השרת שמארח את אתר הפינגווין יורד לאחר הרבה זמן של אירוח בחברת Syslogics. השרת מארח גם את אתר הפינגווין וגם את שרת ה-DNS של הדומיין.

אני רוצה להודות לאריק מחברת Syslogics שאירח את האתר מזה כמה שנים ללא שום תמורה, ותוך שיתוף פעולה עימי בכל בעיה שהיתה.

אי לכך, ובהתאם לזאת, אתר הפינגווין מחפש בית חדש. אם לא יימצא חדש, כנראה שייסגר. אם יש המעוניינים לארח את האתר הוותיק (ודי ססטי) ואו את ה-DNS שלו, אשמח לשמוע ב katriel shtrudel traum org il

 

 

Posted in כללי | Leave a comment

סריקה של LUNS דרך sysfs

מקושרי ה-SAN שביננו, שעובדים עם כרטיסי qlogic, ודאי מכירים את הקיצור השימושי הבא:


"echo "scsi-qlascan" > /proc/scsi/qla2xxx/0"

המתקדמים קצת יותר ביננו, שעזבו כבר את RHEL4, יגלו שהממשק הנ"ל דרך proc נעלם, ובמקומו קיבלנו ממשק עלום אחר דרך sysfs.

אז לתוהים כדי לבצע סריקה דרך sys:


echo “- - -” > /sys/class/scsi_host/hostH/scan

יבצע סריקה של LUN-ים חדשים על כרטיס H.
הפקודה:


echo “1” > /sys/class/scsi_host/hostH/device/targetH:B:T/H:B:T:L/delete

כאשר


H = Host
B = Bus
T = Target
L = LUN

תסיר דיסק, והפקודה


echo “B T L” > /sys/class/scsi_host/hostH/scan

תוסיף LUN ספציפי.
שימושי.

Posted in Uncategorized | Tagged , , , | 1 Comment

שכפול VM ב-VirtualBox

אפשרות שימושית שלא קיימת ב-GUI של VirtualBox היא שכפול דיסקים (קבצי VDI). שכפול דיסק מאפשרת הקמת מערכת זהה באפס זמן. שימושי במיוחד אם רוצים לבצע cloning של אותה המערכת במהירות לבדיקות, ובכמות גדולה

לביצוע ה-Clone משתמשים בפקודה VBoxManage clonevdi source.vdi dest.vdi , למשל


# cd nd2
# VBoxManage clonevdi ../nd1/nd1.vdi nd2.vdi

פקודה זו תיצור דיסק חדש, שכבר מופיע ב-Virtual Media Manager, וניתן להשתמש בו בעת יצירת מכונה חדשה, ע"י בחירת "Use existing hard disk" במסך "Virtual Hard Disk"

Posted in virtualbox | Tagged , | 1 Comment

לשים גבולות – גרסת cgroups

בפוסט קודם, דיברתי על חלוקת משאבים בתוך המערכת בעזרת pam_limits. בפוסט זה, אדבר על נושא דומה, ביישום שונה.

מה זה cgroups

cgroups הוא מנגנון מובנה ב-Kernel שמאפשר לאגד ולחלק קבוצות של תהליכים , להחיל עליהם התנהגות מסוימת.  בעצם, cgroups הוא מנגנון גנרי לטיפול בקבוצה של משאבי מערכת. כל קבוצה כזו תכלול מספר תהליכים (Processes) ושיוך למשאב מערכתי.

מנגנון ה-cgroups הוא היררכי ותורשתי מטבעו. כלומר, אם נכלול את התהליך sendmail בקבוצה המגבילה את רוחב הפס, כל תהליך שיצור אותו sendmail לאחר מכן, ישויך אוטומאטית לאותה הקבוצה, ויירש את אותן ההגבלות.
ניתן להגדיר כמה קבוצות שכאלו במערכת, ותהליך יחיד יכול להיות חבר בכמה מהן. בנוסף, ניתן להגדיר כמה קבוצות תחת אותה הגבלה (למשל הגבלת זיכרון), ולהחיל הגבלות שונות על תהליכים שונים

יישום קלאסי הוא כמובן שימוש ב-cgroups להגבלת משאבים כמו CPU, זיכרון או IO.  רשימה חלקית של המודולים שניתן להכיל על קבוצות הם:

  • memory – מאפשר הגבלת כמות הזיכרון שתצרוך קבוצה
  • cpu – מאפשר שינוי עדיפויות של קבוצה בגישה ל-CPU
  • cpuset – מאפשר שיוך קבוצה ל-CPU-ים ספציפיים.
  • net_cls – מאפשר סימון של תעבורת רשת השייכת לקבוצה. ניתן בעזרת הפקודה tc לנהל את תעבורה זו לפי עדיפויות
  • devices – מאפשר חסימת (או אפשור) גישה של קבוצה להתקנים מסוימים במערכת

שימוש ב-cgroups

הכלים לניהול cgroups מגיעים היום עם רוב ההפצות החדשות (ubuntu,fedora,rhel6,arch linux).

יצירה של קבוצות אפשרית בזמן ריצה, או דרך קבצי ההגדרה (בד"כ /etc/cgroups.conf ו- /etc/cgrules.conf). הדוגמאות הבאות נוסו על Ubuntu 10.04, אך יהיו נכונות לרוב ההפצות עם שינויים קטנים.

יצירת היררכיה ראשונית

יצירה של היררכיה ראשונית, המקושרת למשאב מוגבל תעשה ע"י הפקודה mount


mkdir /mnt/cgroups/memory
mount -t cgroups -o memory memory /mnt/cgroups/memory

ניתן לקבע את פקודה זו ע"י שימוש בקובץ /etc/cgconfig.conf


mount {
memory = /mnt/cgroups/memory;
}

יצירת cgroup

יצירה של cgroup תאפשר לנו לשייך קבוצה של תהליכים להיררכיה מסוימת, עם הגבלה. כדי לצור , cgroup, ולהחיל עליו הגבלה:


cgcreate -g memory:/test
cgset -r memory.limit_in_bytes=256M test

או דרך הקובץ /etc/cgconfig.conf


group daemons/www {
memory {
memory.limit_in_bytes 256M
}
group test {
memory {
memry.limits_in_bytes 64M
}

שיוך תהליכים לcgroup

שיוך של תהליך לקבוצה יעשה בעזרת הפקודה cgclassify עבור תהליך קיים, או cgexec כדי להריץ פקודה תחת קבוצה מסויימת


cgclassify -g memory:test 12345
cgexec -g memory:test ls

אפשרות שניה, היא בעזרת השירות cgred אשר עולה בזמן עליית המערכת וקורא את הקובץ /etc/cgrules.conf כדי לשייך משתמשים/תהליכים ל-cgroups. תחביר הקובץ מזכיר קצת את /etc/limits/security.conf ומגדיר משתמש או קבוצה ולאיזה היררכיה יהיו מקושרים. כדוגמה:


@user memory users
@apache:httpd memory daemon/www

הגדרות אלו:

  • יקשרו את המשתמש user להיררכיה שתחת /mnt/cgroups/memory/users, ויחילו עליו את ההגבלות המוגדרות
  • יקשרו את התהליכים ששמם httpd ואשר הורצו ע"י משתמש apache להגבלות שתחת /mnt/cgroups/memory/daemon/www

למתעניינים, המידע המפורט ביותר שהצלחתי למצוא כרגע בנושא Cgroups הוא ע"י RedHat במדריך אודות Resource Management

Tagged | 4 Comments

לבעוט במערכת (KickStart)

להתקין מכונה אחת פעם בכל זמן, זה לא משימה גדולה.
אבל מה עושה ה-SysAdmin הממוצע כאשר הוא נתקל בצורך להתקין מערכות פעמים רבות, ולפעמים אפילו להתקין מחדש את אותה המערכת, כמה פעמים ביום? אוטומציה.
הרבה נושאים בתחום ה-System ניתן להכניס לאוטומציה בקלות יחסית. התקנת מערכות הפעלה היא אי שם באמצע. הרבה פעמים צריך להתחשב בכמה סוגים שונים של חומרה, דרישות תוכנה ועוד.
ברוב מערכות ההפעלה כיום יש דרך לבצע התקנה אוטומטית: יש לנו את SuSE עם AutoYast, את דביאןאובונטו עם preseeding ו-RedHat עם מנגנון ה-KickStart.
כל הפתרונות האלו מאפשרים התקנה של מערכת ההפעלה, ללא מגע יד אדם, ובד"כ בצורה די גמישה. אני אתמקד דווקא ב-KickStart, כלי ההתקנה של Red Hat. כור מחצבתי, והכלי הראשון שבאמת עבדתי אתו כדי להתקין מערכות הפעלה בצורה אוטומטית.

אז מה מאפשר KickStart
בקובץ KickStart אין חלוקה ברורה בין השלבים, לכן החלטתי להתייחס אליו ב-4 חלקים: מערכת הפעלה, חלוקה למחיצותמערכות קבצים, חבילות וסקריפטים. חלקו הראשון והבסיסי הוא בעצם מענה על כל שאלות ההתקנה: מאיפה להתקין (רשת, CD, דיסק קשיח), הגדרות רשת, שפה, אבטחה וכו'. חלקו השני של הקובץ מתייחס לחלוקה למחיצות, מערכות קבצים ועוד. חלקו השלישי מאפשר בחירת קבוצות של חבילות או חבילות בודדות. חלק זה מאפשר התקנה של קבוצה שלמה, למשל "Development Tools" אשר כולל בתוכו את GCC, glibc-devel, kernel-devel ועוד. חלקו הרביעי (והאופציונאלי) של הקובץ, מאפשר הרצה של סקריפטים בנקודות עוגן שונות במהלך ההתקנה: לפני שההתקנה מתחילה ולאחריה.

הגדרות מערכת הפעלה


install
url --url http://192.168.4.112/rhel4/esu4
lang en_US.UTF-8
langsupport --default=en_US.UTF-8 en_US.UTF-8
network --device eth0 --bootproto static --ip 192.168.4.199 --netmask 255.255.255.0 --gateway 192.168.4.1 --hostname temphost
rootpw --iscrypted $1$g5CMJ64x$SDl4NK0711gLMR6bk2VRy1
firewall --disabled
selinux --disabled
authconfig --enableshadow --enablemd5
timezone Asia/Jerusalem
bootloader --location=mbr --append="console=tty0 console=ttyS0"

  • install – אומר ל-Installer כי ברצוננו לבצע התקנה חדשה, ולא שדרוג
  • url – אפשרות זו מכוונת את ה-Installer למקור קבצי ההתקנה. ניתן להפנות למקור FTP/HTTP, NFS או CIFS.
  • lang/langsupport – הגדרות מקלדתשפה.
  • network – הגדרות התקשורת של המערכת. בחלק זה ניתן לציין האם לתת למחשב כתובת קבועה, או לעבוד מול DHCP, שם המכונה ועוד
  • rootpw – אפשרות זו קובעת את סיסמת המשתמש root לאחר ההתקנה. ללא האפשרות –uscrytpted ניתן לציין סיסמה ללא הצפנתה
  • firewall – ל-Installer יש יכולת להפעיל הגדרות Firewall בסיסיות שיעזרו להגן על המחשב בעליה ראשונה.
  • selinux – מסמן למערכת האם לאפשר את השימוש ב-SELinux, ובאיזה Policy להשתמש
  • authconfig – הגדרות אבטחה כמו סיסמת root ועוד.
  • timezone – הגדרת אזור זמן
  • bootloader – הגדרות ה-bootloader. למשל: האם להגן עליו בסיסמה, איפה להתקין אותו ועוד.

הגדרות חלוקה למחיצות

clearpart --all --initlabel
part / --fstype ext3 --size=1 --grow 0--ondisk=sda
part swap --size=512

  • clearpart – אפשרות זו אומרת ל-Installer כי ברצוננו לנקות את כל המחיצות הקיימות במערכת (–all). ניתן לבקש רק מחיקה של מחיצות Linux, או מחיקה מדיסק מסוים
  • part – הגדרת מחיצה. ניתן להגדיר מחיצות שונות, מסוגים ונים. למשל, ניתן להגדיר מחיצה שתהיה מסוג PV (או Physical Volume), ותשמש לעבודה עם LVM

בחירת חבילות

בחלק זה ניתן לבצע 2 סוגים של בחירה: קבוצות וחבילות בודדות. בחירה בקבוצת חבילות תתקין כמובן את כל הבחילות בקבוצה, ואת התלויות שלהן. בחירת חבילה יחידה תתקין רק אותה, ואת התלויות שלה

%packages
@ admin-tools
@ editors
@ server-cfg
@ development-tools
grub
kernel-devel
e2fsprogs
kernel

הרצת סקריפטים

%post
chkconfig sendmail off
wget http://10.0.0.1/someprogram.rpm -C /tmp/some.rpm
rpm -ivh /tmp/some.rpm
rm -f /tmp/some.rpm

סקריפטים אלו ירוצו כבר בתוך מערכת ההפעלה המותקנת (בעזרת chroot). בחלק זה ניתן לבצע שינויים והתאמות למערכת ההפעלה, להתקין חבילות ועוד.
אפשרות נוספת היא שימוש בתגית "pre%" אשר מאפשר הרצת סקריפטים בעת טעינת ה-Installer ולפני התחלת ההתקנה עצמה.

למתעניינים, תיעוד מלא של כל האפשרויות של KickStart ניתן למצוא תיעוד באתר Fedora

Posted in Uncategorized | Tagged , , | 3 Comments

OpenVPN עם תעודות CA Cert

אחד מהכלים האהובים עלי (אחרי Bash כמובן) בעולם הקוד הפתוח הוא OpenVPN. כלי נוח שמאפשר הקמת VPN בצורה פשוטה (אבל גמישה מאוד) בין 2 מחשבים או אתרים.

בעוד השימוש ב-Pre-Shared Key מאפשר פשטות, השימוש ב-TLS מאפשר הזדהות חזקה שאינה מבוססת ססמה, אלא על תעודות SSL. שימוש בתעודות SSL מאפשר זיהוי בצורה חד-חד ערכית על פי רוב, ללא צורך בהפצת הסיסמא לכל מען דבאי. אבל, פה גם טמונה בעיה.

זיהוי של משתמש על בסיס קבלת תעודה חתומה ע"י גורם מאושר, גורם ל-OpenVPN לנטות לכיוון עבודה עם CA עצמאי. במצב זה, המשתמש מייצר את התעודותיו בעצמו. המצב מסתבך כאשר רוצים לעבוד עם תעודות שמפיק רשם ידוע (נאמר Thawte). ייתכן מצב שמשתמש יוכל להתחבר לשרת שלנו עם תעודה שנחתמה ע"י , פשוט כי אנו סומכים על כל התעודות שנחתמו ע"י Thawte.

מסתבר שב-OpenVPN חשבו על הבעיה, והוסיפו שתי אפשרויות: tls-verify ו-tls-remote. שימוש ב-tls-remote, מאפשר הגבלת שם התעודה המרוחקת לשם ה-X509 מתוך התעודה.
בעוד השימוש ב-tls-verify, מאפשר הרצת סקריפט חיצוני שמקבל את שם התעודה (CN), ומחזיר return code של 0 או 1, אשר קובע האם התעודה תתקבל.

נתחיל ביצירת התעודת עבור השרת והלקוח. יש לייצר קודם כל בקשה לחתימה (CSR):

openssl req -newkey rsa:1024 -keyout server.key -out server.csr
openssl req -newkey rsa:1024 -keyout client.key -out client.csr

תוכן ה-CSR משמש ליצירת התעודה באתר CACert. באתר מדריכים והסברים כיצד לצור את התעודות.

בשלב זה גם כדאי יהיה להוריד ולשמור את ה-RootCA Cert של CACert. התעודה זמינה בקישור הבא. את התעודה שנוריד, נשמור במקום מרכזי בשרת ובלקוח, בד"כ בספריה

/etc/ssl/certs

הגדרות הלקוח

לאחר שהעתקנו את ה-RootCA ותעודת המשתמש למחשב הלקוח, נגדיר את הלקוח כך:

client
remote [server ip address]
ca /etc/ssl/certs/CACert-root.crt
cert /etc/ssl/private/user@mydomain.org.crt
key /etc/ssl/private/user@mydomain.org.key
tls-remote /CN=server.mydomain.org
dev tun
ping 15
ping-restart 45

הגדרות מתקדמות יותר, לפי הצורך כמובן.
ה"קסם" מתרחש בהגדרה tls-remote, שאומרת שהלקוח יתחבר רק לשרת אשר יזהה את עצמו עם תעודה, שהשם שלה הוא server.mydomain.org

הגדרות שרת

בעוד הלקוח מתחבר רק לשרת אחד, לשרת עשויים להתחבר כמה משתמשים. כדי לאפשר זאת, יש לזהות 2 דברים:

  • למשתמש יש תעודה שחתומה ע"י CACert, בדיקה זו מתבצעת ע"י המנגנונים הפנימיים של OpenVPN
  • המשתמש מאושר להתחבר לשרת לפי שם תעודת הלקוח שלו. שלב זה מתבצע ע"י סקריפט חיצוני שמוגדר תחת האפשרות tls-verify

קובץ קונפיגורציה של שרת יראה כך:

server 10.0.0.0 255.255.255.0
ca /etc/ssl/certs/CACert-root.crt
cert /etc/ssl/private/server.crt
key /etc/ssl/private/server.key
dh /etc/ssl/dh1024.pem
script-security 2
tls-verify tls-verify.sh
dev tun
ping 15
ping-restart 45

את הסקריפט tls-verify.sh נשים ב

/etc/openvpn

הסקריפט verify-cn מקבל פרמטרים סטנדרטיים מ-OpenVPN, בפורמט הבא (מתוך man openvpn):

certificate_depth X509_NAME_oneline

כאשר certificate_depth מייצג את עומק התעודה: החל מה-RootCA ועד תעודת המשתמש, בעומק 0. תעודה רגילה שחתומה ע"י CACert תתחיל בעומק 1, שייצג את התעודה החותמת (של CACert), ותסתיים בעומק 0, תעודת הלקוח. השדה  X509_NAME_online מייצג את שם התעודה בעומק הנוכחי.

סקריפט tls-verify.sh עשוי להראות כך:

#!/bin/bash
domain=mydomain.org
CA="/O=Root_CA/OU=http://www.cacert.org/CN=CA_Cert_Signing_Authority/emailAddress=support@cacert.org"
if [ $# -ne 2 ]; then echo "usage: tls-verify.sh [depth] [x509 name]"; exit 1; fi
case "$1" in
1) if [ "$2" == "$CA" ]; then exit 0; fi ;;
0) echo $2 | grep -q $
domain && exit 0 ;;
esac
exit 1

המשתנה domain מגדיר את שם הדומיין שממנו יתקבלו תעודות משתמש. שם תעודת לקוח סטנדרטי שמונפק ע"י CACert יראה כך:

/CN=CAcert WoT User/emailAddress=user@mydomain.org

השימוש ב-CA="/O=Root_CA…cacert.org" יגביל את ההתחברות לתעודות שנחתמו ע"י CACert.
השימוש ב-domain=mydomain.org יגביל את ההתחברות רק למשתמש עם תעודה המכילה את mydomain.org בשם התעודה.

אפשרות אחרת היא שימוש בקובץ אשר יכיל רשימת שמות משתמשים. במקרה זה, ניתן להשתמש בסקריפט:

#!/bin/bash
users_file=/etc/openvpn/users.txt
CA="/O=Root_CA/OU=http://www.cacert.org/CN=CA_Cert_Signing_Authority/emailAddress=support@cacert.org"
if [ $# -ne 2 ]; then echo "usage: tls-verify.sh [depth] [x509 name]"; exit 1; fi
case "$1" in
1) if [ "$2" == "$CA" ]; then exit 0; fi ;;
0) echo $2 | grep -q -f $
users_file && exit 0 ;;
esac
exit 1

במקרה זה, תאומת שם התעודה במלואה מול הקובץ המצויין בסקריפט.

כל שנשאר עכשיו הוא להפעיל את שני צדי ה-VPN ולנסות את הקונפיגורציה החדשה. בשימוש בהגדרות שמעל, ניתן לבדוק את התקשורת ע"י פקודת ping פשוטה מהלקוח:


# ping 10.0.0.1 -c 1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.62 ms
...
1 packets transmitted, 1 received, 0% packet loss, time 0ms

בהצלחה!

מאזין ל: Amy Winehouse – You know I'm no good

64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.62 ms

Posted in linux | Tagged , , | 2 Comments

השילוש הקדוש: Bonding, Bridging ו-VLANs

לאחרונה נדרשתי להגדיר מערכת, שתחזיק כמה שרתים וירטואליים מסוגים שונים. השרת המארח צריך לספק שרידות ברמת כרטיסי הרשת, ולהתאים עצמו לסביבה מבוססת (ומרובת) VLAN's.

רוב תוכנות הוירטואליזציה ללינוקס, כאשר הן מאפשרות גישה ישירה של ה-VM לרשת, הן בעצם מצרפות את כרטיס הרשת הפיזי של המכונה ל-Bridge, ומאפשרות גישור של ה-VM-ים לאותו ה-Bridge. גישה זו מאפשר ל-VM לגשת ל-Lan שאליו מחוברת המכונה המארחת. בתצורה שאותה אפרט בהמשך, תתאפשר גישה לכמה רשותות, מכרטיס רשת אחד.

סכימה כללית תראה כך:

|------|                   |-----------|  |-------|  |-----|
| eth0 |--|             |--| bond0.100 |--| br100 |--| vm1 |
|------|  |  |-------|  |  |-----------|  |-------|  |-----|
          |--| bond0 |--|
|------|  |  |-------|  |  |-----------|  |-------|  |-----|
| eth1 |--|             |--| bond0.200 |--| br200 |--| vm2 |
|------|                   |-----------|  |-------|  |-----|

תודו שהשקעתי ב acsii art.

שלב הראשון הוא הגדרת ה-Bonding על 2 כרטיסי הרשת הפעילים. התצורה של כרטיסי הרשת נקבעת ע"י עריכת הקבצים:

/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth1

יש להכניס את הקונפיגורציה הבאה, שם ה-Device צריך לתאום את שם הקובץ, למשל עבור ifcfg-eth0, נשתמש בערכים:

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
SLAVE=yes
MASTER=bond0

כדי ליצור את הקונפיגורציה של כרטיס ה-bonding, נערוך את הקובץ

/etc/sysconfig/network-scripts/ifcfg-bond0

ונזין את הערכים הבאים. שימו לב כי אין לכרטיס כתובת IP, זאת משום שהכתובות יהיו על ה-Bridge:

DEVICE=bond0
BOOTPROTO=static
ONBOOT=yes

וכמובן, שאסור לשכוח את התוספות לקובץ

/etc/modprobe.conf

ההגדרות הבאות קובעות כי הכרטיס bond0, הוא כרטיס מסוג bonding, וכי יש להשתמש בתצורה של Active/Standby, עם החלפת כרטיס פעיל בעת זיהוי נפילת Link (בדיקה בכל 100 מילישניות)

alias bond0 bonding
options bonding mode=1 miimon=100

שלב הבא יהיה הגדרת ה-VLAN על כרטיס ה-Bonding. הגדרות אלו יאפשרו לנו לצרף כל כרטיס ל-Bridge אחר, וכך לספק גישה למכונות וירטואליות לרשתות שונות.

כדוגמה, נגדיר VLAN שמספרו 100 ונקשר אותו ל-Bridge ששמו br100. בתור התחלה, נגדיר את ה-VLAN ע"י יצירת הקובץ:

/etc/sysconfig/network-scripts/ifcfg-bond0.100

ובו הערכים הבאים:

DEVICE=bond0.100
BOOTPROTO=static
ONBOOT=yes
BRIDGE=br100
VLAN=yes

כעת ניתן להגדיר את ה-Bridge, ל"כרטיס" זה נגדיר כתובת רשת.  הגדרה זו תאפשר גישה לשרת המארח. אם יש לשרת כרטיס רשת יעודי לניהול, אז גם הגדרת כתובת IP אינה הכרחית.

יש לערוך את הקובץ

/etc/sysconfig/network-scripts/ifcfg-br100

ולהזין את הערכים הבאים:

DEVICE=br100
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.0.0.1
NETMASK=255.255.255.0
GATEWAY=10.0.0.254

בשלב הזה כל שנותר הוא לאתחל את הרשת בעזרת הפקודה

service network restart

ולהתחיל ליצור VM-ים שמקושרים ל-Bridge.
שמקושר ל-VLAN.
שמקושר ל-Bond.
שמקושר לכרטיסי רשת אמיתיים.

מאזין ל: Kaki King

Posted in כללי | 3 Comments