اطلاعیه

بستن
No announcement yet.

Hidden Sip packet as TCP-UDP – مخفی کردن بسته های SIP در قالب TCP و UDP در اینترنت

بستن
این موضوع بسته شده است.
X
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

  • Hidden Sip packet as TCP-UDP – مخفی کردن بسته های SIP در قالب TCP و UDP در اینترنت

    مخفی کردن بسته های SIP در قالب TCP و UDP در اینترنتسلام. احتمالا شنیده اید که بسته های پروتکل SIP در برخی کشورها Drop می شوند. در این صورت هیچ تماسی بین UA ها برقرار نخواهد شد. پروتکل SIP یک پروتکل لایه Application می باشد و جهت انتقال از UDP یا TCP استفاده می کند. برای رفع این محدودیت چنانچه ما استاندارد پروتکل SIP را تغییر دهیم(کدگذاری کنیم), و بسته ها در قالب بسته های UDP یا TCP ارسال شوند، دیگر محدودیتی در برقراری تماس نخواهیم داشت و هیچ بسته ای Drop نخواهد شد.برای انجام این روش باید در هر ۲ سمت UAC و UAS تغییراتی انجام شود. ما به سمت UAC کاری نخواهیم داشت چون می تواند از هر softphone استفاده کرد و با اعمال تغییراتی اندک در ارسال بسته، بسته ها را کد شده به صورت UDP یا TCP ارسال کرد. در سمت Asterisk شما باید به Source code استریسک مراجعه کنید. در اینجا ما با فایل chan_sip.c کار می کنیم.توجه داشته باشید بهتر است از نسخه Asterisk 1.8.24 به بالا یا از Asterisk11 استفاده کنید.ما باید تغییراتی در کد این فایل انجام دهیم:۱- در ابتدا به سراغ تابع sip_tcp_read می رویم که مسئول دریافت و خواندن بافر ورودی در TCP می باشد. و تغییرات زیر را انجام می دهیم:
    static int sip_tcp_read(struct sip_request *req, struct ast_tcptls_session_instance *tcptls_session,
    int authenticated, time_t start)
    {
    .
    .
    .
    Encrypt_Decrypt_SIP(readbuf, res);
    readbuf[res] = ”;
    .
    .
    }
    2- Fتابع __sip_xmit را پیدا کنید. این تابع مسئول ارسال بسته ها از طریق UDP و TCP می باشد. و تغییرات زیر را انجام دهید:
    static int __sip_xmit(struct sip_pvt *p, struct ast_str *data)
    {
    .
    .
    if (p->socket.type == SIP_TRANSPORT_UDP) {
    Encrypt_Decrypt_SIP (data->str, ast_str_strlen(data));
    res = ast_sendto(p->socket.fd, data->str, ast_str_strlen(data), 0, dst);
    } else if (p->socket.tcptls_session) {
    Encrypt_Decrypt_SIP (data->str, ast_str_strlen(data));
    res = sip_tcptls_write(p->socket.tcptls_session, data->str, ast_str_strlen(data));
    } else {
    ast_debug(2, “Socket type is TCP but no tcptls_session is present to write to\n”);
    return XMIT_ERROR;
    }
    .
    .
    }
    ۳- در انتها تابع sipsock_read را پیدا کنید. این تابع مسئول دریافت و خواندن بافر ورودی در UDP می باشد و تغییرات زیر را انجام دهید:
    static int sipsock_read(int *id, int fd, short events, void *ignore)
    {
    .
    .
    Encrypt_Decrypt_SIP(readbuf, res);
    readbuf[res] = ”;
    .
    .
    }
    حالا تابع Encrypt_Decrypt_SIP را پیاده سازی کنید:
    static int Encrypt_Decrypt_SIP(char *buffer, int packet_len)
    {
    if (buffer == NULL) {
    return -1;
    }
    char *keysecret = “ABCD”;
    int Keylen = strlen(keysecret);
    for (int i = 0; j < packet_len; j++) {
    buffer [i] = (char) (buffer [i] ^ keysecret[i % Keylen]);
    }
    buffer[j] = ”;
    return 0;
    }
    حالا باید استریسک را مجددا کامپایل نمایید. برای این منظور ابتدا فایل های Chan_sip.o و chan_sip.so را پاک کنید.
    rm /usr/src/asterisk/channels/chan_sip.o
    rm /usr/src/asterisk/channels/chan_sip.so
    سپس استریسک را دوباره کامپایل کنید:
    make; make install;
    توجه داشته باشید برای تغییر در Softphone مورد نظر باید همین کارها را انجام دهید تا بتوانید یک تماس موفق و بدون Drop داشته باشید.برای RTP صوت و تصویر هم می توانید در صورت نیاز از همین روش استفاده کنید.موفق باشید.

    نویسنده : مجتبی اسفندیاری
در حال انجام ...
X