על מנת שניתן יהיה לתקשר עם תוכנה כלשהי דרך הרשת (בפרוטוקול TCP), עליה להאזין ל PORT מסויים, שיהיה מוקדש רק לה על המחשב עליו היא רצה. (http://en.wikipedia.org/wiki/TCP_ports)
במקרה שלנו, התוכנה עליה אנו מדברים היא SQL.
הפורט שלו ה SQL מאזין משתנה בין שני מצבים התלויים בסוג ה Instance:
- במצב זה, כברירת המחדל ה SQL מאזין לפורט 1433. מכיוון שפורט זה הוא מוכר וידוע לרוב, ניתן לראות עליו נסיונות תקיפה רבים.
Named Instance - במצב זה, כברירת המחדל ה SQL מאזין לפורט דינמי.
מהו פורט דינמי? - פורט דינמי הוא פורט שמוקצה ל SQL בצורה דינאמית, זאת אומרת, הפורט לא קבוע. התהליך של הקצאת פורט דינמי הוא כדלהלן:
1. רק Named Instance יכול להשתמש בפורטים דינמיים.
2. כשה Instance עולה בפעם הראשונה הפורט מוגדר כ - 0 ,זאת אומרת שה Instance SQL מבקש ממערכת ההפעלה שתקצה לו פורט פנוי.
3. ברגע שמערכת ההפעלה מקצה ל Instance פורט, הוא מתחיל להאזין לו.
4. הפורט המוקצה נרשם ל REGISTRY
5. בכל פעם שה Instance עולה הוא ינסה להאזין לפורט שרשום ב REGISTRY.
6. אם תוכנה אחרת משתמשת בפורט, ה SQL Instance יבקש פורט אחר.
אז איך הלקוח (CLIENT) יודע לאיזה פורט להתחבר?
במקרה של Default Instance הלקוח מנסה להתחבר בפורט 1433 המוכר והידוע.
הבעיה מתחילה כשאנו משתמשים ב Named Instance ואז ישנן שתי דרכים להודיע ללקוח באיזה פורט להתחבר:
1) Connection String - ניתן לציין ב Connection String את הפורט לו מאזין ה Instance (טיפה בעייתי - מכיוון שהפורט דינמי ועשוי להשתנות). אם ברצוננו להזין את הפורט ב Connection String, עלינו להשתמש רק בשם המחשב ובמספר הפורט, ללא התחשבות בשם ה Instance. לדוגמא:
Myserver,1578 במקום Myserver/InstanceName.
כמובן שלצורך כך עלינו לדעת מה הפורט לו מאזין ה Instance, על כך בהמשך.
2) שימוש ב SQL Server Browser - זהו Service שרץ רק בסביבה עם לפחות Named Instance אחד, וכאשר הוא רץ הוא מאזין באופן קבוע לפורט UDP 1434. כאשר לקוח מנסה להתחבר ל Named Instance בצורה הבאה Myserver/InstanceName מה שקורה זה שנשלחת בקשה ל Browser על הפורט UDP 1434 ומתקבל כתשובה הפורט עליו מאזין ה Instance.
חשוב לציין, בשימוש ב Default Instance אין משמעות ל SQL Browser ולפורט UDP 1434.
בשלב הזה נשאלת השאלה - מה לכל הרוחות עושים אם רוצים לעבוד דרך FIREWALL ולא רוצים להשתמש בפורט שכולם מכירים????
האפשרויות הן:
לשנות את הפורט של ה Default Instance ולציין אותו ב Connection String- במצב כזה צריך לדאוג ב FIREWALL שהפורט הנ"ל יהיה פתוח.
לקבוע ל Named Instance פורט קבוע ולציין אותו ב Connection String- במצב כזה צריך לדאוג ב FIREWALL שהפורט הנ"ל יהיה פתוח.
לקבוע ל Named Instance פורט קבוע ולהמשיך להשתמש ב SQL Browser- במצב כזה צריך לדאוג ב FIREWALL ששני הפורטים (UDP 1434 והפורט הנ"ל) יהיו פתוחים.
במצב בו אנו משתמשים ב Named Instance עם פורט דינמי ושימוש ב Browser לא ניתן יהיה לוודא עבודה דרך ה FIREWALL מכיוון שהפורט עשוי להשתנות ולכן עדיף לא להשתמש בתצורה זו כשעובדים דרך FIREWALL.
אז איך משנים את הפורטים?
משתמשים ב SQL Server Configuration Manager... ובעצם, קוראים פה - http://msdn2.microsoft.com/en-us/library/ms177440.aspx
איך יודעים על איזה פורט מאזין ה INSTANCE?
1) לבדוק ב SQL Server Configuration Manager משם ל Network Configuration, משם ל TCP.
2) לבדוק ב REGISTRY -
SQL 2005
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL.MSSQLServer
SuperSocketNetLibTCP
SQL 2008
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL10.MSSQLServer
SuperSocketNetLibTCP
לסיכום - ב Default Instance אפשר לשנות את הפורט איתו עובדים (לצרכי אבטחה). ב Named Instance אפשר לעבוד עם פורט דינמי או פורט קבוע.
במקרה שמשנים את ערכי ברירות המחדל, צריך לציין את מספר הפורט ב Connection String:
Myserver,xxxx (כשמציינים מספר פורט, אין לציין את שם ה Instance).
אם משתמשים ב Named Instance אפשר לוותר על ציון הפורט ב Connection String ולהשתמש ב SQL Browser, שעובד בפורט UDP 1434.
במקרה שלנו, התוכנה עליה אנו מדברים היא SQL.
הפורט שלו ה SQL מאזין משתנה בין שני מצבים התלויים בסוג ה Instance:
- במצב זה, כברירת המחדל ה SQL מאזין לפורט 1433. מכיוון שפורט זה הוא מוכר וידוע לרוב, ניתן לראות עליו נסיונות תקיפה רבים.
Named Instance - במצב זה, כברירת המחדל ה SQL מאזין לפורט דינמי.
מהו פורט דינמי? - פורט דינמי הוא פורט שמוקצה ל SQL בצורה דינאמית, זאת אומרת, הפורט לא קבוע. התהליך של הקצאת פורט דינמי הוא כדלהלן:
1. רק Named Instance יכול להשתמש בפורטים דינמיים.
2. כשה Instance עולה בפעם הראשונה הפורט מוגדר כ - 0 ,זאת אומרת שה Instance SQL מבקש ממערכת ההפעלה שתקצה לו פורט פנוי.
3. ברגע שמערכת ההפעלה מקצה ל Instance פורט, הוא מתחיל להאזין לו.
4. הפורט המוקצה נרשם ל REGISTRY
5. בכל פעם שה Instance עולה הוא ינסה להאזין לפורט שרשום ב REGISTRY.
6. אם תוכנה אחרת משתמשת בפורט, ה SQL Instance יבקש פורט אחר.
אז איך הלקוח (CLIENT) יודע לאיזה פורט להתחבר?
במקרה של Default Instance הלקוח מנסה להתחבר בפורט 1433 המוכר והידוע.
הבעיה מתחילה כשאנו משתמשים ב Named Instance ואז ישנן שתי דרכים להודיע ללקוח באיזה פורט להתחבר:
1) Connection String - ניתן לציין ב Connection String את הפורט לו מאזין ה Instance (טיפה בעייתי - מכיוון שהפורט דינמי ועשוי להשתנות). אם ברצוננו להזין את הפורט ב Connection String, עלינו להשתמש רק בשם המחשב ובמספר הפורט, ללא התחשבות בשם ה Instance. לדוגמא:
Myserver,1578 במקום Myserver/InstanceName.
כמובן שלצורך כך עלינו לדעת מה הפורט לו מאזין ה Instance, על כך בהמשך.
2) שימוש ב SQL Server Browser - זהו Service שרץ רק בסביבה עם לפחות Named Instance אחד, וכאשר הוא רץ הוא מאזין באופן קבוע לפורט UDP 1434. כאשר לקוח מנסה להתחבר ל Named Instance בצורה הבאה Myserver/InstanceName מה שקורה זה שנשלחת בקשה ל Browser על הפורט UDP 1434 ומתקבל כתשובה הפורט עליו מאזין ה Instance.
חשוב לציין, בשימוש ב Default Instance אין משמעות ל SQL Browser ולפורט UDP 1434.
בשלב הזה נשאלת השאלה - מה לכל הרוחות עושים אם רוצים לעבוד דרך FIREWALL ולא רוצים להשתמש בפורט שכולם מכירים????
האפשרויות הן:
לשנות את הפורט של ה Default Instance ולציין אותו ב Connection String- במצב כזה צריך לדאוג ב FIREWALL שהפורט הנ"ל יהיה פתוח.
לקבוע ל Named Instance פורט קבוע ולציין אותו ב Connection String- במצב כזה צריך לדאוג ב FIREWALL שהפורט הנ"ל יהיה פתוח.
לקבוע ל Named Instance פורט קבוע ולהמשיך להשתמש ב SQL Browser- במצב כזה צריך לדאוג ב FIREWALL ששני הפורטים (UDP 1434 והפורט הנ"ל) יהיו פתוחים.
במצב בו אנו משתמשים ב Named Instance עם פורט דינמי ושימוש ב Browser לא ניתן יהיה לוודא עבודה דרך ה FIREWALL מכיוון שהפורט עשוי להשתנות ולכן עדיף לא להשתמש בתצורה זו כשעובדים דרך FIREWALL.
אז איך משנים את הפורטים?
משתמשים ב SQL Server Configuration Manager... ובעצם, קוראים פה - http://msdn2.microsoft.com/en-us/library/ms177440.aspx
איך יודעים על איזה פורט מאזין ה INSTANCE?
1) לבדוק ב SQL Server Configuration Manager משם ל Network Configuration, משם ל TCP.
2) לבדוק ב REGISTRY -
SQL 2005
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL.MSSQLServer
SuperSocketNetLibTCP
SQL 2008
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL10.MSSQLServer
SuperSocketNetLibTCP
לסיכום - ב Default Instance אפשר לשנות את הפורט איתו עובדים (לצרכי אבטחה). ב Named Instance אפשר לעבוד עם פורט דינמי או פורט קבוע.
במקרה שמשנים את ערכי ברירות המחדל, צריך לציין את מספר הפורט ב Connection String:
Myserver,xxxx (כשמציינים מספר פורט, אין לציין את שם ה Instance).
אם משתמשים ב Named Instance אפשר לוותר על ציון הפורט ב Connection String ולהשתמש ב SQL Browser, שעובד בפורט UDP 1434.
שי אנגלברג
חברת ואלינור
http://www.valinor.co.il
http://www.sqlserver.co.il
LinkedIn - SQLServer Valinor
חברת ואלינור
http://www.valinor.co.il
http://www.sqlserver.co.il
LinkedIn - SQLServer Valinor