<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های مهدی مزرعه ملایی</title><link>https://virgool.ir/feed/@m_57458844</link><description></description><language>fa</language><pubDate>2026-11-10 23:15:02</pubDate><image><url>https://files.virgool.ir/upload/users/1442089/avatar/yMwnQ5.jpeg</url><title>مهدی مزرعه ملایی</title><link>https://virgool.ir/@m_57458844</link></image><item><title>بررسی نحوه عملکرد تحریم شکن</title><link>https://virgool.ir/@m_57458844/بررسی-نحوه-عملکرد-تحریم-شکن-ها-xgpcdxr2sdap</link><description>کم و بیش در زندگی روزمره ممکن است از تحریم شکن هایی مثل شکن و ... استفاده کرده باشین.در این پست کوتاه قصد دارم نحوه عملکرد این نوع تحریم شکن هارو بررسی کنیم.Forward Proxy پراکسی فوروارد یا Forward Proxy سروری هست که بین گروهی از ماشینهای سرویس گیرنده و اینترنت قرار میگیرد. وقتی کلاینتها request هایشان را ارسال میکنند، Forward-Proxy بعنوان یک واسط عمل میکند و request ها را از کلاینت ها میگیرد و در سمت دیگر، به سمت وب سرورهای مقصدشان میفرستد و در نهایت پاسخ وب سرورها را گرفته و به کلاینتها بر میگرداند.سوال اینجاست که این نوع پراکسی به چه دردی میخورد یا به عبارتی در کجا کاربرد دارد؟در جواب باید گفت که این نوع از پراکسی، از اطلاعات هویتی کلاینتها یا به اصطلاح خودمان، از identity کلاینتها حفاظت میکند. به این صورت که اگر از یک فوروارد پراکسی استفاده کنیم، در آن صورت فقط آدرس IP کلاینتها حفظ میشود و در request header که به سمت وب سرور در نهایت ارسال میشود، آدرس IP پراکسی قابل مشاهده است.تنها کاری که نیاز هست انجام بشه اینه که تمام درخواست های DNS ما به آدرس سرور ForwardProxy تبدیل بشود.import sys, socket, argparse&#xA;from dnslib import DNSRecord, DNSHeader, RR, A, QTYPE, DNSError&#xA;from os import environ&#xA;from socketserver import ThreadingUDPServer, DatagramRequestHandler&#xA;&#xA;allow_all = False&#xA;w_list = []&#xA;args = None&#xA;class PacketHandler(DatagramRequestHandler):  # DatagramRequestHandler&#xA;    def handle(self) -&gt; None:&#xA;        data = self.rfile.read(512)  # Maximum UDP Packet Size is 512 Byte&#xA;        if args.debug:  # Show Client Address (if debug)&#xA;                print(&#34;Accept Request from : &#34;, self.client_address[0])&#xA;        try:&#xA;                packet = DNSRecord.parse(data)  # Parse DNS Packet&#xA;                for question in packet.questions:  # Iterate over questions ( however most of DNS        Servers even BIND support single question)&#xA;                        requested_domain_name = question.get_qname()  # Get the requested name&#xA;                        reply_packet = packet.reply()  # Generate Reply packet&#xA;                        if (not allow_all) and (w_list != [] and (&#xA;                                                not any(s[1:] in str(requested_domain_name) for s in w_list))):  # Check the Whitelist&#xA;                        try:&#xA;                                                realip = socket.gethostbyname(requested_domain_name.idna())  # Get Real IP Address&#xA;                        except Exception as e:&#xA;                                                if args.debug:&#xA;                                                                        print(e)&#xA;                                                                        realip = args.ipreply_packet.add_answer(                        RR(requested_domain_name, rdata=A(realip), ttl=60))  # Append Address to replies                    if args.debug:                        print(&#34;Request: %s --&gt; %s&#34; % (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(&#34;Request: %s --&gt; %s&#34; % (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__ == &#39;__main__&#39;:    parser = argparse.ArgumentParser(description=&#39;Process input&#39;)    parser.add_argument(&#34;--ip&#34;, help=&#34;set listen ip address, set to ENV to get it from PUB_IP Env Variable&#34;,                        action=&#34;store&#34;, type=str, default=&#34;0.0.0.0&#34;)    parser.add_argument(&#34;--whitelist&#34;,                        help=&#34;Whitelisted Domain. use ALL or DNS_ALLOW_ALL=YES Env variable for access all domain&#34;,                        action=&#34;store&#34;, type=str, default=&#34;Empty&#34;)    parser.add_argument(&#34;--port&#34;, help=&#34;set listen port&#34;, action=&#34;store&#34;, type=int, default=53)    parser.add_argument(&#34;--debug&#34;, help=&#34;enable debug logging&#34;, action=&#34;store_true&#34;)    args = parser.parse_args()    if str(args.ip).upper() == &#34;ENV&#34;:        args.ip = environ.get(&#34;PUB_IP&#34;)    if args.debug:        print(&#39;IP: %s Port: %s&#39; % (args.ip, args.port))    if environ.get(&#34;DNS_ALLOW_ALL&#34;) == &#34;YES&#34; or args.whitelist == &#34;ALL&#34;:        allow_all = True    else:        if args.whitelist != &#34;Empty&#34;:            with open(args.whitelist) as f:                w_list.extend(f.read().splitlines())    try:        udp_sock = ThreadingUDPServer((&#34;0.0.0.0&#34;, args.port), PacketHandler)        udp_sock.serve_forever()    except KeyboardInterrupt:        if args.debug:            print(&#34;done.&#34;)python3 test.py --ip 185.x.x.xتنظیم nginx به عنوان Forward proxynano /etc/nginx/nginx.conf&#xA;&#xA;user  www-data;&#xA;worker_processes  auto;&#xA;error_log  /var/log/nginx/error.log notice;&#xA;pid        /var/run/nginx.pid;&#xA;worker_rlimit_nofile 65535;&#xA;events {&#xA;    worker_connections  4096;&#xA;    multi_accept on;&#xA;}&#xA;http {&#xA;    include       /etc/nginx/mime.types;&#xA;    default_type  application/octet-stream;&#xA;    log_format  main  &#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; &#39;&#xA;                      &#39;$status $body_bytes_sent &#34;$http_referer&#34; &#39;&#xA;                      &#39;&#34;$http_user_agent&#34; &#34;$http_x_forwarded_for&#34;&#39;;&#xA;    add_header Strict-Transport-Security &#34;max-age=31536000; includeSubDomains&#34; always;&#xA;    add_header Cache-Control &#34;no-cache, no-store, must-revalidate&#34; always;&#xA;    add_header Pragma &#34;no-store&#34; always;&#xA;    add_header X-Content-Type-Options &#34;nosniff&#34; always;&#xA;    add_header X-Xss-Protection &#34;1; mode=block&#34; always;&#xA;    access_log  /var/log/nginx/access.log  main;&#xA;    sendfile        on;&#xA;    #tcp_nopush     on;&#xA;    tcp_nodelay on;&#xA;    keepalive_timeout 65;&#xA;    types_hash_max_size 2048;&#xA;    server_tokens off;&#xA;    #ssl_protocols TLSv1.2 TLSv1.3;&#xA;    #ssl_prefer_server_ciphers on;&#xA;    #ssl_ciphers &#39;ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM&#xA;SHA256:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK&#39;;&#xA;    #ssl_ecdh_curve secp384r1;&#xA;    #ssl_session_cache shared:SSL:10m;&#xA;    #ssl_session_timeout 10m;&#xA;    add_header Strict-Transport-Security &#34;max-age=15552000; includeSubDomains&#34; always;&#xA;    client_max_body_size 2G;&#xA;    #gzip  on;&#xA;    include /etc/nginx/conf.d/*.conf;&#xA;}&#xA;stream {&#xA;    server {&#xA;        resolver 8.8.8.8 ipv6=off;&#xA;        listen 443;&#xA;        ssl_preread on;&#xA;        proxy_pass $ssl_preread_server_name:443;&#xA;    }&#xA;}&#xA;nano /etc/nginx/conf.d/base.conf&#xA;&#xA;server {&#xA;            listen 80 default_server;&#xA;            listen [::]:80 default_server;&#xA;            server_name _;&#xA;            return 301 https://$host$request_uri;&#xA;}منابع: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.ir/avasam-laravel-edu/ذخیره-داده-های-لاروال-در-elastic-و-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&#xA;   RABBITMQ_HOST=127.0.0.1&#xA;   RABBITMQ_PORT=5672&#xA;   RABBITMQ_VHOST=/&#xA;   RABBITMQ_LOGIN=admin&#xA;   RABBITMQ_PASSWORD=adminnano app/RabbitMQService.php&#xA;&lt;?php&#xA;namespace App;&#xA;use PhpAmqpLib\Connection\AMQPStreamConnection;&#xA;use PhpAmqpLib\Message\AMQPMessage;&#xA;&#xA;class RabbitMQService {&#xA;    protected $connection;&#xA;    protected $channel;&#xA;&#xA;    public function __construct()&#xA;      {&#xA;            $this-&gt;connection = new AMQPStreamConnection(&#xA;            env(&#39;RABBITMQ_HOST&#39;),&#xA;            env(&#39;RABBITMQ_PORT&#39;),&#xA;            env(&#39;RABBITMQ_LOGIN&#39;),&#xA;            env(&#39;RABBITMQ_PASSWORD&#39;),&#xA;            env(&#39;RABBITMQ_VHOST&#39;)&#xA;            );&#xA;     }&#xA;&#xA;      public function publish($msg,$values)&#xA;       {&#xA;           $this-&gt;channel = $this-&gt;connection-&gt;channel();&#xA;           $this-&gt;channel-&gt;exchange_declare($values[&#34;exchange&#34;], &#39;direct&#39;, false, true, false);&#xA;           $this-&gt;channel-&gt;queue_declare($values[&#34;queue&#34;], false, true, false, false);&#xA;           $this-&gt;channel-&gt;queue_bind($values[&#34;queue&#34;], $values[&#34;exchange&#34;], $values[&#34;key&#34;]);&#xA;           $msg = new AMQPMessage($msg);&#xA;           $this-&gt;channel-&gt;basic_publish($msg,$values[&#34;exchange&#34;], $values[&#34;key&#34;]);&#xA;       }&#xA;&#xA;public function __destruct() {&#xA;     $this-&gt;channel-&gt;close();&#xA;     $this-&gt;connection-&gt;close();&#xA;   }&#xA;}استفاده از تابع در کنترلرهای مدنظرuse App\RabbitMQService;&#xA;---&#xA;$message = $request-&gt;input(&#39;message&#39;);&#xA;$values = [&#xA;        &#39;exchange&#39; =&gt; &#39;main&#39;,&#xA;         &#39;queue&#39; =&gt; &#39;auth-logs&#39;,&#xA;         &#39;key&#39; =&gt; &#39;auth-logs&#39;&#xA;];&#xA;$rabbitMQService = new RabbitMQService();&#xA;$rabbitMQService-&gt;publish($message,$values);&#xA;return response(&#39;Message published to RabbitMQ&#39;);ایجاد logstash pipeline  برای ارسال لاگها به Elasticnano /opt/logstash/rabbit.conf&#xA;input {&#xA;     rabbitmq {&#xA;           id =&gt; &#34;input_rabbit&#34;&#xA;           host =&gt; &#34;127.0.0.1&#34;&#xA;           port =&gt; 5672&#xA;           user =&gt; &#34;admin&#34;&#xA;           password =&gt; &#34;admin&#34;&#xA;           exchange  =&gt; &#34;main&#34;&#xA;           exchange_type =&gt; &#34;direct&#34;&#xA;           queue  =&gt; &#34;auth-logs&#34;&#xA;           durable =&gt; true&#xA;           key =&gt; &#34;auth-logs&#34;&#xA;           prefetch_count =&gt; 2000&#xA;           threads =&gt; 1&#xA;           tags =&gt; input_rabbit&#xA;}&#xA;}&#xA;output {&#xA;    if &#34;input_rabbit&#34; in [tags]{&#xA;        elasticsearch {&#xA;           user =&gt; admin&#xA;           password =&gt; admin&#xA;           ssl =&gt; true&#xA;           ssl_certificate_verification =&gt; false&#xA;           index =&gt; auth-logs&#xA;    }&#xA;}&#xA;}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>Wed, 15 Nov 2023 00:40:13 +0330</pubDate></item><item><title>اتصال لاراول به اکتیودایرکتوری</title><link>https://virgool.ir/@m_57458844/اتصال-لاراول-به-اکتیودایرکتوری-tdvqqcmqduii</link><description>سلاممختصر میخایم پروژه لاراولیمون رو وصل کنیم به سرور اکتیودایرکتوری و از اون برای Auth استفاده کنیم.برای نصب پکیج ما از adldap2/adldap2-laravel استفاده میکنیم.composer require adldap2/adldap2-laravel&#xA;php artisan vendor:publish --provider=&#34;Adldap\Laravel\AdldapServiceProvider&#34;بعد از اتمام نصب از مسیر config/ldap.php تنظیمات اولیه را میتونیم ببینیم. قسمت هایی که برای ما مهم هستن:LDAP_TIMEOUT&#xA;LDAP_PORT&#xA;LDAP_HOSTS&#xA;LDAP_BASE_DN&#xA;LDAP_USERNAME&#xA;LDAP_PASSWORD&#xA;LDAP_USE_SSLبا توجه به اینکه این موارد لینک شدن به env - ما هم این مقادیر را توی این فایل اضافه میکنیم.تنظیم برای اتصال با پروتکل LDAPدقت شود برای اتصال نیازی به کاربری با سطح دسترسی ادمین در اکتیودایرکتوری نیست و یک کاربر معمولی هم میتواند برای اتصال کافی باشد.LDAP_TIMEOUT=5&#xA;LDAP_PORT=389&#xA;LDAP_HOSTS=192.168.1.11&#xA;LDAP_BASE_DN=dc=sparrow,dc=local&#xA;LDAP_USERNAME=foad&#xA;LDAP_PASSWORD=password&#xA;LDAP_USE_SSL=falseبعد از تنظیم موارد :php artisan config:clear&#xA;php artisan config:cacheتست ارتباط با سرور :use Adldap\Laravel\Facades\Adldap;&#xA;if(Adldap::auth()-&gt;attempt(&#34;${LDAP_USERNAME}@${LDAP_DOMAIN}&#34;, $LDAP_PASSWORD))} return response()-&gt;json([&#34;success&#34;=&gt;&#39;Successfully Connected!&#39;], 200);{&#xA;else{&#xA;return response()-&gt;json([&#34;success&#34;=&gt;&#39;Failed!&#39;], 200);&#xA;}&#xA;تنظیم برای اتصال با پروتکل LDAPSLDAP_TIMEOUT=5 &#xA;LDAP_PORT=636 &#xA;LDAP_HOSTS=sparrow.local&#xA;LDAP_BASE_DN=dc=sparrow,dc=local &#xA;LDAP_USERNAME=foad &#xA;LDAP_PASSWORD=password &#xA;LDAP_USE_SSL=trueو تنظیم موارد زیر از مسیر /etc/ldap/ldap.conf# TLS certificates (needed for GnuTLS)&#xA;TLS_CACERT      /etc/ssl/ldaps.crt&#xA;TLS_REQCERT hard&#xA;php artisan config:clear&#xA;php artisan config:cache&#xA;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.ir/@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 23:54:10 +0430</pubDate></item><item><title>ایزوله کردن مرورگر با داکر</title><link>https://virgool.ir/@m_57458844/ایزوله-کردن-مرورگر-با-داکر-pmouykmsjbfj</link><description>Isolate browser with Docker Containerخب در این قسمت میخواین با استفاده از کانتینر Ubuntu یک کانتینر ایزوله برای مرورگر کروم ایجاد کنیم. در قدم اول باید داکر بدونین. بقیه قدم ها اینقدر مهم نیست پس میشه پرید :) قبل از شروع بد نیست بگم اگه با گرفتن پکیج ها از dockerhub مشکل دارین:docker_vm# echo &#34;nameserver 185.51.200.2&#34; &gt;&gt; /etc/resolv.conf&#xA;docker_vm# echo &#39;{ &#34;registry-mirrors&#34;: [&#34;https://registry.docker.ir&#34;] }&#39; &gt;&gt; /etc/docker/daemon.json&#xA;docker_vm# systemctl daemon-reload &#xA;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; \&#x9;echo &#34;tzdata tzdata/Areas select Asia&#34; &gt; ~/tx.txt &amp;&amp; \&#x9;echo &#34;tzdata tzdata/Zones/Asia select Tehran&#34; &gt;&gt; ~/tx.txt &amp;&amp; \&#x9;debconf-set-selections ~/tx.txt &amp;&amp; \&#x9;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; \&#x9;wget https://sourceforge.net/projects/virtualgl/files/2.6.3/virtualgl_2.6.3_amd64.deb &amp;&amp; \&#x9;wget https://sourceforge.net/projects/turbovnc/files/2.2.4/turbovnc_2.2.4_amd64.deb &amp;&amp; \&#x9;wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb &amp;&amp; \&#x9;apt install -y ./google-chrome-stable_current_amd64.deb&#x9;&amp;&amp; \&#x9;dpkg -i virtualgl_*.deb &amp;&amp; \&#x9;dpkg -i turbovnc_*.deb &amp;&amp; \&#x9;mkdir ~/.vnc/ &amp;&amp; \&#x9;mkdir ~/.dosbox &amp;&amp; \&#x9;echo $PASSWORD | vncpasswd -f &gt; ~/.vnc/passwd &amp;&amp; \&#x9;chmod 0600 ~/.vnc/passwd &amp;&amp; \&#x9;echo &#34;set border 1&#34; &gt; ~/.ratpoisonrc  &amp;&amp; \&#x9;echo &#34;exec google-chrome --no-sandbox&#34;&gt;&gt; ~/.ratpoisonrc &amp;&amp; \&#x9;openssl req -x509 -nodes -newkey rsa:2048 -keyout ~/novnc.pem -out ~/novnc.pem -days 3650 -subj &#34;/C=US/ST=NY/L=NY/O=NY/OU=NY/CN=NY emailAddress=test@foad.local&#34;EXPOSE 80CMD /opt/TurboVNC/bin/vncserver &amp;&amp; websockify -D --web=/usr/share/novnc/ &#xA;--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 18:09:17 +0330</pubDate></item><item><title>کانفیگ تانل IPSec در روتر سیسکو</title><link>https://virgool.ir/@m_57458844/کانفیگ-تانل-ipsec-در-روتر-سیسکو-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&#xA;&#xA;Router_A(config)# crypto isakmp key Virgool.secret address 20.20.20.20&#xA;&#xA;Router_A(config)# ip access-list extended Virgool_ACL&#xA;Router_A(config-ext-nacl)# permit ip 172.16.0.0 0.0.255.255 192.168.0.0 0.0.255.255&#xA;&#xA;Router_A(config)# crypto ipsec transform-set Virgool_TS esp-3des esp-sha256-hmac&#xA;&#xA;Router_A(config)# crypto map Virgool_MAP 10 ipsec-isakmp &#xA;Router_A(config-crypto-map)# set peer 20.20.20.20 &#xA;Router_A(config-crypto-map)# set transform-set Virgool_TS&#xA;Router_A(config-crypto-map)# match address Virgool_ACL&#xA;&#xA;Router_A(config)# interface gig 0/0  { WAN port }&#xA;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&#xA;&#xA;Router_B(config)# crypto isakmp key Virgool.secret address 10.10.10.10&#xA;Router_B(config)# ip access-list extended Virgool_ACL&#xA;Router_B(config-ext-nacl)# permit ip 192.168.0.0 0.0.255.255 172.16.0.0 0.0.255.255&#xA;&#xA;Router_B(config)# crypto ipsec transform-set Virgool_TS esp-3des esp-sha256-hmac&#xA;&#xA;Router_B(config)# crypto map Virgool_MAP 10 ipsec-isakmp &#xA;Router_B(config-crypto-map)# set peer 10.10.10.10 &#xA;Router_B(config-crypto-map)# set transform-set Virgool_TS&#xA;Router_B(config-crypto-map)# match address Virgool_ACL&#xA;&#xA;Router_B(config)# interface gig 0/0  { WAN port }&#xA;Router_B(config- if)# crypto map Virgool_MAP&#xA;برای اعتبار سنجی و دیباگ کردن نیز:Router_A#show crypto ipsec saRouter_A#show crypto isakmp sadst             src             state          conn-id slot status&#xA;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 15:10:42 +0330</pubDate></item><item><title>امن سازی کرنل لینوکس (پارت اول)</title><link>https://virgool.ir/@m_57458844/امن-سازی-کرنل-لینوکس-پارت-اول-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=&#39;local&#39;یاecho &#39;local&#39; &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&#xA;sysctl -ar randomizeبرای غیرفعال کردن یا فعال کردن ASLR:echo 0 &gt; /proc/sys/kernel/randomize_va_space sysctl -w kernel.randomize_va_space=&#39;0&#39;برای دائمی کردن تغییرات :echo kernel.randomize_va_space=&#39;0&#39; &gt; /etc/sysctl.conf&#xA;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=&#39;1&#39;sysctl -w net.ipv4.conf.all.rp_filter=&#39;1&#39;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&#xA;sysctl -w net.ipv4.tcp_max_syn_backlog=3072&#xA;sysctl -w net.ipv4.tcp_synack_retries=0&#xA;sysctl -w net.ipv4.tcp_syn_retries=0&#xA;sysctl -w net.ipv4.conf.all.send_redirects=0&#xA;sysctl -w net.ipv4.conf.all.accept_redirects=0&#xA;sysctl -w net.ipv4.conf.all.forwarding=0&#xA;sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1</description><category>مهدی مزرعه ملایی</category><author>مهدی مزرعه ملایی</author><pubDate>Fri, 07 Jan 2022 13:07:51 +0330</pubDate></item></channel></rss>