<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی مزرعه ملایی</title>
        <link>https://virgool.io/feed/@m_57458844</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-04-15 01:37:16</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1442089/avatar/yMwnQ5.jpeg?height=120&amp;width=120</url>
            <title>مهدی مزرعه ملایی</title>
            <link>https://virgool.io/@m_57458844</link>
        </image>

                    <item>
                <title>بررسی نحوه عملکرد تحریم شکن</title>
                <link>https://virgool.io/@m_57458844/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%86%D8%AD%D9%88%D9%87-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D8%AA%D8%AD%D8%B1%DB%8C%D9%85-%D8%B4%DA%A9%D9%86-%D9%87%D8%A7-xgpcdxr2sdap</link>
                <description>کم و بیش در زندگی روزمره ممکن است از تحریم شکن هایی مثل شکن و ... استفاده کرده باشین.در این پست کوتاه قصد دارم نحوه عملکرد این نوع تحریم شکن هارو بررسی کنیم.Forward Proxy پراکسی فوروارد یا Forward Proxy سروری هست که بین گروهی از ماشینهای سرویس گیرنده و اینترنت قرار میگیرد. وقتی کلاینتها request هایشان را ارسال میکنند، Forward-Proxy بعنوان یک واسط عمل میکند و request ها را از کلاینت ها میگیرد و در سمت دیگر، به سمت وب سرورهای مقصدشان میفرستد و در نهایت پاسخ وب سرورها را گرفته و به کلاینتها بر میگرداند.سوال اینجاست که این نوع پراکسی به چه دردی میخورد یا به عبارتی در کجا کاربرد دارد؟در جواب باید گفت که این نوع از پراکسی، از اطلاعات هویتی کلاینتها یا به اصطلاح خودمان، از identity کلاینتها حفاظت میکند. به این صورت که اگر از یک فوروارد پراکسی استفاده کنیم، در آن صورت فقط آدرس IP کلاینتها حفظ میشود و در request header که به سمت وب سرور در نهایت ارسال میشود، آدرس IP پراکسی قابل مشاهده است.تنها کاری که نیاز هست انجام بشه اینه که تمام درخواست های DNS ما به آدرس سرور ForwardProxy تبدیل بشود.import sys, socket, argparse
from dnslib import DNSRecord, DNSHeader, RR, A, QTYPE, DNSError
from os import environ
from socketserver import ThreadingUDPServer, DatagramRequestHandler

allow_all = False
w_list = []
args = None
class PacketHandler(DatagramRequestHandler):  # DatagramRequestHandler
    def handle(self) -&gt; None:
        data = self.rfile.read(512)  # Maximum UDP Packet Size is 512 Byte
        if args.debug:  # Show Client Address (if debug)
                print(&amp;quotAccept Request from : &amp;quot, self.client_address[0])
        try:
                packet = DNSRecord.parse(data)  # Parse DNS Packet
                for question in packet.questions:  # Iterate over questions ( however most of DNS        Servers even BIND support single question)
                        requested_domain_name = question.get_qname()  # Get the requested name
                        reply_packet = packet.reply()  # Generate Reply packet
                        if (not allow_all) and (w_list != [] and (
                                                not any(s[1:] in str(requested_domain_name) for s in w_list))):  # Check the Whitelist
                        try:
                                                realip = socket.gethostbyname(requested_domain_name.idna())  # Get Real IP Address
                        except Exception as e:
                                                if args.debug:
                                                                        print(e)
                                                                        realip = args.ipreply_packet.add_answer(                        RR(requested_domain_name, rdata=A(realip), ttl=60))  # Append Address to replies                    if args.debug:                        print(&amp;quotRequest: %s --&gt; %s&amp;quot % (requested_domain_name.idna(), realip))                else:                    reply_packet.add_answer(RR(requested_domain_name, rdata=A(args.ip), ttl=60))  # Fake the address                    if args.debug:                        print(&amp;quotRequest: %s --&gt; %s&amp;quot % (requested_domain_name.idna(), args.ip))                self.wfile.write(reply_packet.pack())  # send Packed UDP Response to the client        except DNSError as err:            if args.debug:                print(err)if __name__ == &#039;__main__&#039;:    parser = argparse.ArgumentParser(description=&#039;Process input&#039;)    parser.add_argument(&amp;quot--ip&amp;quot, help=&amp;quotset listen ip address, set to ENV to get it from PUB_IP Env Variable&amp;quot,                        action=&amp;quotstore&amp;quot, type=str, default=&amp;quot0.0.0.0&amp;quot)    parser.add_argument(&amp;quot--whitelist&amp;quot,                        help=&amp;quotWhitelisted Domain. use ALL or DNS_ALLOW_ALL=YES Env variable for access all domain&amp;quot,                        action=&amp;quotstore&amp;quot, type=str, default=&amp;quotEmpty&amp;quot)    parser.add_argument(&amp;quot--port&amp;quot, help=&amp;quotset listen port&amp;quot, action=&amp;quotstore&amp;quot, type=int, default=53)    parser.add_argument(&amp;quot--debug&amp;quot, help=&amp;quotenable debug logging&amp;quot, action=&amp;quotstore_true&amp;quot)    args = parser.parse_args()    if str(args.ip).upper() == &amp;quotENV&amp;quot:        args.ip = environ.get(&amp;quotPUB_IP&amp;quot)    if args.debug:        print(&#039;IP: %s Port: %s&#039; % (args.ip, args.port))    if environ.get(&amp;quotDNS_ALLOW_ALL&amp;quot) == &amp;quotYES&amp;quot or args.whitelist == &amp;quotALL&amp;quot:        allow_all = True    else:        if args.whitelist != &amp;quotEmpty&amp;quot:            with open(args.whitelist) as f:                w_list.extend(f.read().splitlines())    try:        udp_sock = ThreadingUDPServer((&amp;quot0.0.0.0&amp;quot, args.port), PacketHandler)        udp_sock.serve_forever()    except KeyboardInterrupt:        if args.debug:            print(&amp;quotdone.&amp;quot)python3 test.py --ip 185.x.x.xتنظیم nginx به عنوان Forward proxynano /etc/nginx/nginx.conf

user  www-data;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 65535;
events {
    worker_connections  4096;
    multi_accept on;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  &#039;$remote_addr - $remote_user [$time_local] &amp;quot$request&amp;quot &#039;
                      &#039;$status $body_bytes_sent &amp;quot$http_referer&amp;quot &#039;
                      &#039;&amp;quot$http_user_agent&amp;quot &amp;quot$http_x_forwarded_for&amp;quot&#039;;
    add_header Strict-Transport-Security &amp;quotmax-age=31536000; includeSubDomains&amp;quot always;
    add_header Cache-Control &amp;quotno-cache, no-store, must-revalidate&amp;quot always;
    add_header Pragma &amp;quotno-store&amp;quot always;
    add_header X-Content-Type-Options &amp;quotnosniff&amp;quot always;
    add_header X-Xss-Protection &amp;quot1; mode=block&amp;quot always;
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;
    #ssl_protocols TLSv1.2 TLSv1.3;
    #ssl_prefer_server_ciphers on;
    #ssl_ciphers &#039;ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM
SHA256:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK&#039;;
    #ssl_ecdh_curve secp384r1;
    #ssl_session_cache shared:SSL:10m;
    #ssl_session_timeout 10m;
    add_header Strict-Transport-Security &amp;quotmax-age=15552000; includeSubDomains&amp;quot always;
    client_max_body_size 2G;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}
stream {
    server {
        resolver 8.8.8.8 ipv6=off;
        listen 443;
        ssl_preread on;
        proxy_pass $ssl_preread_server_name:443;
    }
}
nano /etc/nginx/conf.d/base.conf

server {
            listen 80 default_server;
            listen [::]:80 default_server;
            server_name _;
            return 301 https://$host$request_uri;
}منابع:https://www.baeldung.com/nginx-forward-proxyhttps://github.com/mosajjal/byoshhttps://virgool.io/@ptabari/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-forward-proxy-%D8%A8%D8%A7-reverse-proxy-vjmp3fkovfbv</description>
                <category>مهدی مزرعه ملایی</category>
                <author>مهدی مزرعه ملایی</author>
                <pubDate>Sun, 24 Mar 2024 11:12:12 +0330</pubDate>
            </item>
                    <item>
                <title>ذخیره داده های لاروال در Elastic و RabbitMQ</title>
                <link>https://virgool.io/avasam-laravel-edu/%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D9%84%D8%A7%D8%B1%D9%88%D8%A7%D9%84-%D8%AF%D8%B1-elastic-%D9%88-rabbitmq-x5iaypqi4ppq</link>
                <description>در این پست بطور خلاصه ذخیره اطلاعات از لاروال به RabbitMQ و از آن به Elasticsearch با استفاده از logstash رو بطور خیلی خلاصه بررسی میکنیم.در اینجا از RabbitMQ به منظور حفظ داده ها در زمان لود بالای elastic و یا غیرفعال بودن سرویس به منظور جلوگیری از دست رفتن داده استفاده میکنیم.docker run -d --hostname rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 docker.arvancloud.ir/rabbitmq:3-managementایجاد Exchange و Queue در RabbitMQاضافه کردن کدهاcomposer require php-amqplib/php-amqplib.env
   RABBITMQ_HOST=127.0.0.1
   RABBITMQ_PORT=5672
   RABBITMQ_VHOST=/
   RABBITMQ_LOGIN=admin
   RABBITMQ_PASSWORD=adminnano app/RabbitMQService.php
&lt;?php
namespace App;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

class RabbitMQService {
    protected $connection;
    protected $channel;

    public function __construct()
      {
            $this-&gt;connection = new AMQPStreamConnection(
            env(&#039;RABBITMQ_HOST&#039;),
            env(&#039;RABBITMQ_PORT&#039;),
            env(&#039;RABBITMQ_LOGIN&#039;),
            env(&#039;RABBITMQ_PASSWORD&#039;),
            env(&#039;RABBITMQ_VHOST&#039;)
            );
     }

      public function publish($msg,$values)
       {
           $this-&gt;channel = $this-&gt;connection-&gt;channel();
           $this-&gt;channel-&gt;exchange_declare($values[&amp;quotexchange&amp;quot], &#039;direct&#039;, false, true, false);
           $this-&gt;channel-&gt;queue_declare($values[&amp;quotqueue&amp;quot], false, true, false, false);
           $this-&gt;channel-&gt;queue_bind($values[&amp;quotqueue&amp;quot], $values[&amp;quotexchange&amp;quot], $values[&amp;quotkey&amp;quot]);
           $msg = new AMQPMessage($msg);
           $this-&gt;channel-&gt;basic_publish($msg,$values[&amp;quotexchange&amp;quot], $values[&amp;quotkey&amp;quot]);
       }

public function __destruct() {
     $this-&gt;channel-&gt;close();
     $this-&gt;connection-&gt;close();
   }
}استفاده از تابع در کنترلرهای مدنظرuse App\RabbitMQService;
---
$message = $request-&gt;input(&#039;message&#039;);
$values = [
        &#039;exchange&#039; =&gt; &#039;main&#039;,
         &#039;queue&#039; =&gt; &#039;auth-logs&#039;,
         &#039;key&#039; =&gt; &#039;auth-logs&#039;
];
$rabbitMQService = new RabbitMQService();
$rabbitMQService-&gt;publish($message,$values);
return response(&#039;Message published to RabbitMQ&#039;);ایجاد logstash pipeline  برای ارسال لاگها به Elasticnano /opt/logstash/rabbit.conf
input {
     rabbitmq {
           id =&gt; &amp;quotinput_rabbit&amp;quot
           host =&gt; &amp;quot127.0.0.1&amp;quot
           port =&gt; 5672
           user =&gt; &amp;quotadmin&amp;quot
           password =&gt; &amp;quotadmin&amp;quot
           exchange  =&gt; &amp;quotmain&amp;quot
           exchange_type =&gt; &amp;quotdirect&amp;quot
           queue  =&gt; &amp;quotauth-logs&amp;quot
           durable =&gt; true
           key =&gt; &amp;quotauth-logs&amp;quot
           prefetch_count =&gt; 2000
           threads =&gt; 1
           tags =&gt; input_rabbit
}
}
output {
    if &amp;quotinput_rabbit&amp;quot in [tags]{
        elasticsearch {
           user =&gt; admin
           password =&gt; admin
           ssl =&gt; true
           ssl_certificate_verification =&gt; false
           index =&gt; auth-logs
    }
}
}docker run -d --hostname logstash --name logstash -it --add-host=elastics:172.17.0.1 -v /opt/logstash/rabbit.conf:/usr/share/logstash/pipeline/rabbit.conf docker.arvancloud.ir/logstash:8.10.2</description>
                <category>مهدی مزرعه ملایی</category>
                <author>مهدی مزرعه ملایی</author>
                <pubDate>Tue, 14 Nov 2023 23:40:13 +0330</pubDate>
            </item>
                    <item>
                <title>اتصال لاراول به اکتیودایرکتوری</title>
                <link>https://virgool.io/@m_57458844/%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%D9%87-%D8%A7%DA%A9%D8%AA%DB%8C%D9%88%D8%AF%D8%A7%DB%8C%D8%B1%DA%A9%D8%AA%D9%88%D8%B1%DB%8C-tdvqqcmqduii</link>
                <description>سلاممختصر میخایم پروژه لاراولیمون رو وصل کنیم به سرور اکتیودایرکتوری و از اون برای Auth استفاده کنیم.برای نصب پکیج ما از adldap2/adldap2-laravel استفاده میکنیم.composer require adldap2/adldap2-laravel
php artisan vendor:publish --provider=&amp;quotAdldap\Laravel\AdldapServiceProvider&amp;quotبعد از اتمام نصب از مسیر config/ldap.php تنظیمات اولیه را میتونیم ببینیم. قسمت هایی که برای ما مهم هستن:LDAP_TIMEOUT
LDAP_PORT
LDAP_HOSTS
LDAP_BASE_DN
LDAP_USERNAME
LDAP_PASSWORD
LDAP_USE_SSLبا توجه به اینکه این موارد لینک شدن به env - ما هم این مقادیر را توی این فایل اضافه میکنیم.تنظیم برای اتصال با پروتکل LDAPدقت شود برای اتصال نیازی به کاربری با سطح دسترسی ادمین در اکتیودایرکتوری نیست و یک کاربر معمولی هم میتواند برای اتصال کافی باشد.LDAP_TIMEOUT=5
LDAP_PORT=389
LDAP_HOSTS=192.168.1.11
LDAP_BASE_DN=dc=sparrow,dc=local
LDAP_USERNAME=foad
LDAP_PASSWORD=password
LDAP_USE_SSL=falseبعد از تنظیم موارد :php artisan config:clear
php artisan config:cacheتست ارتباط با سرور :use Adldap\Laravel\Facades\Adldap;
if(Adldap::auth()-&gt;attempt(&amp;quot${LDAP_USERNAME}@${LDAP_DOMAIN}&amp;quot, $LDAP_PASSWORD))} return response()-&gt;json([&amp;quotsuccess&amp;quot=&gt;&#039;Successfully Connected!&#039;], 200);{
else{
return response()-&gt;json([&amp;quotsuccess&amp;quot=&gt;&#039;Failed!&#039;], 200);
}
تنظیم برای اتصال با پروتکل LDAPSLDAP_TIMEOUT=5 
LDAP_PORT=636 
LDAP_HOSTS=sparrow.local
LDAP_BASE_DN=dc=sparrow,dc=local 
LDAP_USERNAME=foad 
LDAP_PASSWORD=password 
LDAP_USE_SSL=trueو تنظیم موارد زیر از مسیر /etc/ldap/ldap.conf# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/ldaps.crt
TLS_REQCERT hard
php artisan config:clear
php artisan config:cache
systemctl restart php8.1-fpm</description>
                <category>مهدی مزرعه ملایی</category>
                <author>مهدی مزرعه ملایی</author>
                <pubDate>Wed, 30 Aug 2023 20:58:01 +0330</pubDate>
            </item>
                    <item>
                <title>Recover MySql Tables From innoDB &amp; FRM File</title>
                <link>https://virgool.io/@m_57458844/recover-mysql-tables-from-innodb-frm-file-qwvyyrli3hji</link>
                <description>تقریبا چهارشنبه شب بود که یکی از دوستان برای انتقال سرور به دلیل مشکلات سخت افزاری بجای خروجی .sql برای فایل های دیتابیس از مسیر زیر فایلهای .ibd &amp; .frm کپی گرفتند و به امید برگردوندن فایلها از این طریق سرور رو  پاک کردند./var/lib/mysql/DB_Nameخلاصه درگیری دو سه روزه ما برای برگردانی جداول که نتیجه داد هم اینجوریه که:قدم اول : پیدا کردن ساختار table ها با استقاده از ابزار MySql Recovery Tools و ایجاد جدول جدیدی با این ساختار در سرور جدید:قدم دوم: به جدول بگیم بی خیال دیتاهای فعلیش بشه:ALTER TABLE Table_Name DISCARD TABLESPACE;قدم سوم: کپی کردن فایل  قدیم ibd در مسیر جدید جدولو در نهایت فراخوانی دیتا ها از فایل قدیم:ALTER TABLE Table_Name IMPORT TABLESPACE;</description>
                <category>مهدی مزرعه ملایی</category>
                <author>مهدی مزرعه ملایی</author>
                <pubDate>Sat, 04 Jun 2022 22:54:10 +0430</pubDate>
            </item>
                    <item>
                <title>ایزوله کردن مرورگر با داکر</title>
                <link>https://virgool.io/@m_57458844/%D8%A7%DB%8C%D8%B2%D9%88%D9%84%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D9%85%D8%B1%D9%88%D8%B1%DA%AF%D8%B1-%D8%A8%D8%A7-%D8%AF%D8%A7%DA%A9%D8%B1-pmouykmsjbfj</link>
                <description>Isolate browser with Docker Containerخب در این قسمت میخواین با استفاده از کانتینر Ubuntu یک کانتینر ایزوله برای مرورگر کروم ایجاد کنیم. در قدم اول باید داکر بدونین. بقیه قدم ها اینقدر مهم نیست پس میشه پرید :) قبل از شروع بد نیست بگم اگه با گرفتن پکیج ها از dockerhub مشکل دارین:docker_vm# echo &amp;quotnameserver 185.51.200.2&amp;quot &gt;&gt; /etc/resolv.conf
docker_vm# echo &#039;{ &amp;quotregistry-mirrors&amp;quot: [&amp;quothttps://registry.docker.ir&amp;quot] }&#039; &gt;&gt; /etc/docker/daemon.json
docker_vm# systemctl daemon-reload 
docker_vm# systemctl restart dockerبه ی کانتینر اوبونتو 18.04 نیاز داریمdocker_vm# docker pull ubuntu:18.04یک داکر فایل با محتوای زیر ایجاد میکنیم:FROM ubuntu:18.04ENV USER=rootENV PASSWORD=fo@d_mol@eeENV DEBIAN_FRONTEND=noninteractive ENV DEBCONF_NONINTERACTIVE_SEEN=trueRUN apt-get update &amp;&amp; \	echo &amp;quottzdata tzdata/Areas select Asia&amp;quot &gt; ~/tx.txt &amp;&amp; \	echo &amp;quottzdata tzdata/Zones/Asia select Tehran&amp;quot &gt;&gt; ~/tx.txt &amp;&amp; \	debconf-set-selections ~/tx.txt &amp;&amp; \	apt-get install -y abiword gnupg apt-transport-https wget software-properties-common ratpoison novnc websockify libxv1 libglu1-mesa xauth x11-utils xorg tightvncserver &amp;&amp; \	wget https://sourceforge.net/projects/virtualgl/files/2.6.3/virtualgl_2.6.3_amd64.deb &amp;&amp; \	wget https://sourceforge.net/projects/turbovnc/files/2.2.4/turbovnc_2.2.4_amd64.deb &amp;&amp; \	wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb &amp;&amp; \	apt install -y ./google-chrome-stable_current_amd64.deb	&amp;&amp; \	dpkg -i virtualgl_*.deb &amp;&amp; \	dpkg -i turbovnc_*.deb &amp;&amp; \	mkdir ~/.vnc/ &amp;&amp; \	mkdir ~/.dosbox &amp;&amp; \	echo $PASSWORD | vncpasswd -f &gt; ~/.vnc/passwd &amp;&amp; \	chmod 0600 ~/.vnc/passwd &amp;&amp; \	echo &amp;quotset border 1&amp;quot &gt; ~/.ratpoisonrc  &amp;&amp; \	echo &amp;quotexec google-chrome --no-sandbox&amp;quot&gt;&gt; ~/.ratpoisonrc &amp;&amp; \	openssl req -x509 -nodes -newkey rsa:2048 -keyout ~/novnc.pem -out ~/novnc.pem -days 3650 -subj &amp;quot/C=US/ST=NY/L=NY/O=NY/OU=NY/CN=NY emailAddress=test@foad.local&amp;quotEXPOSE 80CMD /opt/TurboVNC/bin/vncserver &amp;&amp; websockify -D --web=/usr/share/novnc/ 
--cert=~/novnc.pem 80 localhost:5901 &amp;&amp; tail -f /dev/nullDockerfileدر قدم بعد سراغ build کردن کانتینر خود مینمائیم:docker_vm# docker build . -t chromeدر نهایت هم یک پورت دلخواه به کانتینرمون میدیم و اجراش میکنیم برای اتصال:docker_vm# docker run -itd -p 8080:80 chromeخب الان اگر آیپی سرورتون رو با پورت 8080 توی مرورگر بزنین یچیزایی شبیه تصویر زیر باید داشته باشین:اگر vnc.html کلیک کنین صفحه لاگین vnc براتون نمایش داده میشه.دیگه چه مَلَقی میشه توش زد؟بریم تو shell این کانتینر ببینیم په خبره:docker_vm# docker exec -it e7581edd58e9 /bin/bashاگر وارد مسیر /usr/share/novnc/ بشیم و اسم فایل vnc.html رو به index.html تغییر بدیم ، وقتی آیپی و پورت رو میدیم مستقیم وارد vnc میشینفایلهای مربوط به view vnc نیز در همین دایرکتوری قرار گرفته است که میتونین تغییر بدین</description>
                <category>مهدی مزرعه ملایی</category>
                <author>مهدی مزرعه ملایی</author>
                <pubDate>Thu, 24 Feb 2022 17:09:17 +0330</pubDate>
            </item>
                    <item>
                <title>کانفیگ تانل IPSec در روتر سیسکو</title>
                <link>https://virgool.io/@m_57458844/%DA%A9%D8%A7%D9%86%D9%81%DB%8C%DA%AF-%D8%AA%D8%A7%D9%86%D9%84-ipsec-%D8%AF%D8%B1-%D8%B1%D9%88%D8%AA%D8%B1-%D8%B3%DB%8C%D8%B3%DA%A9%D9%88-dbjmhquvdbal</link>
                <description>Site-To-Site IPSec برای کانفیگ تانل Site-to-Site در IPSec مطابق سناریو بالا در روتر Router_A:Router_A(config)#  crypto isakmp policy 10Router_A(config-isakmp)# encr 3desRouter_A(config-isakmp)# hash sha256Router_A(config-isakmp)# authentication pre-shareRouter_A(config-isakmp)# group 2Router_A(config-isakmp)# lifetime 28800

Router_A(config)# crypto isakmp key Virgool.secret address 20.20.20.20

Router_A(config)# ip access-list extended Virgool_ACL
Router_A(config-ext-nacl)# permit ip 172.16.0.0 0.0.255.255 192.168.0.0 0.0.255.255

Router_A(config)# crypto ipsec transform-set Virgool_TS esp-3des esp-sha256-hmac

Router_A(config)# crypto map Virgool_MAP 10 ipsec-isakmp 
Router_A(config-crypto-map)# set peer 20.20.20.20 
Router_A(config-crypto-map)# set transform-set Virgool_TS
Router_A(config-crypto-map)# match address Virgool_ACL

Router_A(config)# interface gig 0/0  { WAN port }
Router_A(config- if)# crypto map Virgool_MAPو سپس کانفیگ Router_B:Router_B(config)#  crypto isakmp policy 10Router_B(config-isakmp)# encr 3desRouter_B(config-isakmp)# hash sha256Router_B(config-isakmp)# authentication pre-shareRouter_B(config-isakmp)# group 2Router_B(config-isakmp)# lifetime 28800

Router_B(config)# crypto isakmp key Virgool.secret address 10.10.10.10
Router_B(config)# ip access-list extended Virgool_ACL
Router_B(config-ext-nacl)# permit ip 192.168.0.0 0.0.255.255 172.16.0.0 0.0.255.255

Router_B(config)# crypto ipsec transform-set Virgool_TS esp-3des esp-sha256-hmac

Router_B(config)# crypto map Virgool_MAP 10 ipsec-isakmp 
Router_B(config-crypto-map)# set peer 10.10.10.10 
Router_B(config-crypto-map)# set transform-set Virgool_TS
Router_B(config-crypto-map)# match address Virgool_ACL

Router_B(config)# interface gig 0/0  { WAN port }
Router_B(config- if)# crypto map Virgool_MAP
برای اعتبار سنجی و دیباگ کردن نیز:Router_A#show crypto ipsec saRouter_A#show crypto isakmp sadst             src             state          conn-id slot status
20.20.20.20        10.10.10.10      QM_IDLE              1    0 ACTIVERouter_A#debug crypto isakmp</description>
                <category>مهدی مزرعه ملایی</category>
                <author>مهدی مزرعه ملایی</author>
                <pubDate>Fri, 18 Feb 2022 14:10:42 +0330</pubDate>
            </item>
                    <item>
                <title>امن سازی کرنل لینوکس (پارت اول)</title>
                <link>https://virgool.io/@m_57458844/%D8%A7%D9%85%D9%86-%D8%B3%D8%A7%D8%B2%DB%8C-%DA%A9%D8%B1%D9%86%D9%84-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D9%BE%D8%A7%D8%B1%D8%AA-%D8%A7%D9%88%D9%84-dms0ezvxr2gy</link>
                <description>Linux Kernelچرا حالا امن سازی کرنل؟ شاید بنظرم اومد برای شروع امن کردن سرورمون بهتر از هسته یا کرنلش شروع کنیم  تا به سطح ایمن سازی سرویس هاشم برسیم.خود کرنل به خودی خود نمیگیم نا امنه اما خب توش مَلَقم خیلی میشه زد بطوری که هم سرویسهامون دچار مشکل بشه هم سرور دیگه حال سرویس دهی نداشته باشه.گمونم چون نشستین دارین امن سازی کرنل لینوکس میخونین ، میدونین لینوکس چیه و محتویات زیرشاخه هاش چی هستن . ( ت پرانتز فقط زیرشاخه proc رو بگم که پراسس های ما و بطور کلی  kernel module Parameter ها ک میشن پارامترهای کرنل توی این زیرشاخه دسته بندی شدن )بحث امن سازی کرنل حول محور proc میچرخه . sysctl که اکثرا بحث مارو پوشش میده هم رابط ما برای تغییر یا دیدن پارامترهاییه که برای کرنل تعریف شده.مشاهده پرامترهای کرنل : sysctl -a  یاls /proc/sys/kernelبرای تغییر هم بهتره خودتون رو تو زحمت نندازین ک محتوای مسیر /proc/sys/kernel رو عوض کنین چون محتویات proc موقتی هستن و با ریبوت از بین میرن...برای فیلتر یک پارامتر خاص در sysctl :sysctl -ar [ parameter ]sysctl -ar version   یا cat /proc/sys/kernel/version مقدار دهی موقت (Temporary) به کرنل پارامترها : sysctl -w kernel.domainname=&#039;local&#039;یاecho &#039;local&#039; &gt; /proc/sys/kernel/domainnameبرای تغییر دائمی تغییرات باید از دو مسیر زیر فایل کانفیگها رو تغییر یا ایجاد کنیم:/etc/sysctl.conf/etc/sysctl.dحالا که با کلیات اینکه sysctl چیه آشنا شدیم بریم سراغ اصل داستان:ASLR - Address Space Layout Randomizationاین تکنیک از سال 2001 برای رندومایز کردن محل اجرای برنامه ها جهت بکار گرفته شد تا از آسیب پذیری های حافظه جلوگیری شود.بطور دیفالت ASLR در توزیع های لینوکسی فعال است . برای دیدن پارامتر ASLR :2 یا 1: فعال0: غیرفعالcat /proc/sys/kernel/randomize_va_space
sysctl -ar randomizeبرای غیرفعال کردن یا فعال کردن ASLR:echo 0 &gt; /proc/sys/kernel/randomize_va_space sysctl -w kernel.randomize_va_space=&#039;0&#039;برای دائمی کردن تغییرات :echo kernel.randomize_va_space=&#039;0&#039; &gt; /etc/sysctl.conf
sysctl --systemتصویر زیر محل اجرایی bash رو دو حالت برای فعال بودن و غیرفعال بود پارامتر randomize نشان می دهد.Randomize IP Spoofing :یکی از شایعترین نوع حملات در شبکه است که مهاجم با تغییر Source IP در Header پکت ها ، سعی در Bypass کردن رولهای OS برای اخلال در شبکه را دارد. این مورد در مواقعی که از OS به عنوان فایروال یا روتر نمود دارد.با فعال سازی این قابلیت ، سورس آدرس پکت ها با جدول روتینگ OS سنجیده میشود و در صورت صحت مبدا ، پکت عبور میکند.مشاهده ، فعال سازی موقت و فعال سازی دائمی :sysctl -ar net.ipv4.conf.default.rp_filtersysctl -ar net.ipv4.conf.all.rp_filtersysctl -w net.ipv4.conf.default.rp_filter=&#039;1&#039;sysctl -w net.ipv4.conf.all.rp_filter=&#039;1&#039;echo net.ipv4.conf.default.rp_filter=1 &gt; /etc/sysctl.confecho net.ipv4.conf.all.rp_filter=1 &gt; /etc/sysctl.confSYN Flooding : [ ابر آروان : ]حمله‌ی SYN flood در دسته‌ی حمله‌های DDoS قرار می‌گیرد و مانند این حمله‌ها، سعی می‌کند با ارسال درخواست و مشغول نگه‌ داشتن سرور، ظرفیت سرور برای پاسخ‌گویی به درخواست‌ها را به حداقل ممکن برساند و مانع دسترسی کاربران به سرویس شود. بیشتر بخوانید...برای جلوگیری از حملات SYN Flood :sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=3072
sysctl -w net.ipv4.tcp_synack_retries=0
sysctl -w net.ipv4.tcp_syn_retries=0
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.all.forwarding=0
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1</description>
                <category>مهدی مزرعه ملایی</category>
                <author>مهدی مزرعه ملایی</author>
                <pubDate>Fri, 07 Jan 2022 12:07:51 +0330</pubDate>
            </item>
            </channel>
</rss>