[{"data":1,"prerenderedAt":1656},["ShallowReactive",2],{"blogs-fa":3},[4,177],{"id":5,"title":6,"body":7,"date":164,"description":165,"draft":166,"extension":167,"image":168,"meta":169,"navigation":170,"path":171,"seo":172,"stem":173,"tags":174,"__hash__":176},"content_fa/birthday-problem.md","Birthday-paradox",{"type":8,"value":9,"toc":155},"minimark",[10,14,20,23,26,29,35,38,41,44,47,50,54,57,60,63,66,69,75,78,81,86,89,92,97,100,103,106,109,114,117,122,125,128,133,136,139,142,145],[11,12,13],"p",{},"چند وقت پیش دوستی یه مسئله جالب روزمره اش رو برای من تعریف کرد.",[15,16,17],"blockquote",{},[11,18,19],{},"سرکلاس بودیم فهمیدیم دونفر تولدشون ۲۲ بهمنه!",[11,21,22],{},"(درمورد اهمیت خاص این‌ روز نمیخوایم صحبت کنیم)",[11,24,25],{},"بعد من یاد یک مسئله جالبی مرتبط با امار و احتمال افتادم که قبلا مختصری درموردش خوندم. اون موقع خیلی سریع ازش گذشتم و قانع نشدم که چرا همچین چیزی هست.",[11,27,28],{},"مسئله به این صورته:",[11,30,31],{},[32,33,34],"strong",{},"فرض کنید که توی یه اتاق هستید. چند نفر رو توی اتاق نیاز دارید که احتمال یکسان بودن روز تولدتون با حداقل یکی از اونها ۵۰ درصد باشه؟",[11,36,37],{},"جواب شما به این مسئله تو چه محدوده ایه؟",[11,39,40],{},"هممم، حدود ۲۰۰ نفر؟ نه. جواب صحیح عدد بسیار کمتریه.",[11,42,43],{},"۱۸۲؟ پایین تر!",[11,45,46],{},"در حقیقت، جواب صحیح عدد ۲۳ هست! ۲۳ کجا ۳۶۵ کجا! عدد ۲۳ به نظر نمیاد که جواب صحیحی باشه،‌ یه عددِ اولی که به نظر نمیاد ارتباطی هم با تعداد روز های سال داشته باشه.",[11,48,49],{},"بیایید بررسی کنیم",[51,52,53],"h2",{"id":53},"شرح",[11,55,56],{},"فکر کردن به مسئله اصلی میتونه کمی گیج گننده باشه. برای اینکه کمی مسئله رو کمی قابل درک‌تر بشه، باید زاویه دید خودتون رو تغییر بدید:",[11,58,59],{},"به طور کلی، مسئله « احتمال یکسان بودن تولد » برعکسِ مسئله « احتمال اینکه هیچکس تولدش یکسان نباشه» هست.\nیعنی هردو باهم نمیتونن صادق باشن. ولی حداقل یکی از اینها باید صادق باشه!",[11,61,62],{},"این یعنی ما میتونیم احتمال یکی از این حالت‌ها رو، با تفریق کردن دیگری از ۱ بدست بیاریم:",[11,64,65],{},"با توجه به مسئله اصلی،‌ اول بیایید از یک مسئله ساده تر شروع کنیم. احتمال منحصر به فرد بودن تولد بین ۵ نفر چقدره؟\nبیایید فرض کنیم سال کبیسه هست.",[11,67,68],{},"احتمال اینکه نفر اول تاریخ تولد یکسانی نداشته باشه ۳۶۶/۳۶۶ (معادل ۱) هست. و این احتمال برای نفر دوم ۳۶۵/۳۶۶ (معادل حدود ۰.۹۹۷) هست. همچنین برای نفر سوم ۳۶۴/۳۶۶ و …\nاین الگو همینطور ادامه پیدا میکنه تا نفر پنجم.\nبرای محاسبه احتمال یکسان نبودن تولد این پنج نفر، این پنج عدد رو درهم ضرب میکنیم. چون با یک پیشامد شرطی مستقل طرف هستیم:",[70,71,72],"bidi",{},[11,73,74],{},"(366/366) * (365 / 366) * (364 / 366) * (363 / 366) * (362 / 366) = 0.973",[11,76,77],{},"پس احتمال اینکه همه این پنج نفر تولد متفاوتی داشته باشن بالاست:‌ 0.973",[11,79,80],{},"حالا، احتمال اینکه از این پنج نفر حداقل دو نفر تولد مشترک داشته باشند چقدره؟ برای بدست اوردن این احتمال،‌صرفا عدد بالا رو از ۱ تفریق میکنیم:",[70,82,83],{},[11,84,85],{},"1 – 0.973 = 0.027",[11,87,88],{},"احتمال حدود ۲ درصد که مطابق انتظار، بسیار کمه.",[11,90,91],{},"این الگو برای تعداد افراد بالاتر هم ادامه داره. پس برای اینکه ببینیم چه زمانی این احتمال به ۵۰ درصد میرسه، این الگو رو با تعداد افراد بالاتر ادامه بدید.",[93,94,96],"h3",{"id":95},"روش-دوم","روش دوم",[11,98,99],{},"یک روش دیگه برای حل این مسئله این هست که، احتمال یکسان نبودن تولد بین دو نفر رو به توانِ \"تعداد جفت های موجود در کلاس\" برسونید! تعداد جفت های موجود در کلاس از فرمول ترکیب (N Choose K) بدست میاد.",[11,101,102],{},"نمونه:",[11,104,105],{},"احتمال یکسان نبودن تولد بین دو نفر:‌ ۳۶۵/۳۶۶",[11,107,108],{},"تعداد کلاس : 21",[70,110,111],{},[11,112,113],{},"21 Choose 2 : 210",[11,115,116],{},"جواب اخر:",[70,118,119],{},[11,120,121],{},"(365/366)^210 = 0.562",[11,123,124],{},"پس احتمال اینکه بین ۲۱ نفر، هیچکس تولد مشترکی نداشته باشه: حدود ۵۶ درصده.",[11,126,127],{},"و احتمال اینکه بین این ۲۱ نفر، حداقل یک نفر روز تولد مشترک داشته باشند:",[70,129,130],{},[11,131,132],{},"1 – 0.562 = 0.438",[11,134,135],{},"حدود ۴۰ درصد.",[11,137,138],{},"اگر برای این عدد هدف نگرفته بودید، میتونید با بالا یا پایین بردن تعداد نفرات، به احتمال مورد نظر خودتون برسید…",[93,140,141],{"id":141},"نتیجه",[11,143,144],{},"پند هایی که از این مسئله میتونیم بگیریم اینکه:",[146,147,148,152],"ol",{},[149,150,151],"li",{},"اکثر از افراد وقتی در مورد احتمال حرف می‌زنند، به طور شهودی (Common sense) فکر می‌کنند که اگر تعداد افراد بیشتر بشه، احتمال وقوع یک اتفاق خاص (مثلاً مشابه بودن روز تولد) به طور ــ مستقیم و خطی ــ افزایش پیدا می‌کنه. اما در مسائلی مثل تولد که «جفت ها» موضوعیت دارن، این موضوع درست نیست.",[149,153,154],{},"اگر توی مکانی با حدود ۲۰ نفر نشستید و حرف خوبی هم برای زدن نیست، تاریخ تولد همدیگه رو بپرسید و درمورد این مسئله صحبت کنید.",{"title":156,"searchDepth":157,"depth":157,"links":158},"",2,[159],{"id":53,"depth":157,"text":53,"children":160},[161,163],{"id":95,"depth":162,"text":96},3,{"id":141,"depth":162,"text":141},"2025-12-05T00:00:00.000Z","Intuition and probability doesn't always mix up",false,"md","/blog-images/cows.webp",{"alt":156},true,"/birthday-problem",{"title":6,"description":165},"birthday-problem",[175],"Internet","8w8sbWcz5pvoSpAo-ldUXh8lPWgIv_vHfdlNaeH3cF8",{"id":178,"title":179,"body":180,"date":1645,"description":1646,"draft":166,"extension":167,"image":1647,"meta":1648,"navigation":170,"path":1649,"seo":1650,"stem":1651,"tags":1652,"__hash__":1655},"content_fa/01.opengfw.md","OpenGFW",{"type":8,"value":181,"toc":1637},[182,185,188,196,211,214,217,221,224,227,230,233,272,282,286,289,297,300,307,515,524,530,533,540,549,631,634,637,645,648,689,692,819,824,833,837,840,843,846,865,874,877,880,975,978,981,1430,1433,1436,1457,1460,1627,1630,1633],[11,183,184],{},"توی این پست با یک ابزار فایروال اشنا میشیم. با استفاده از این ابزار میتونید یه تشکیلات فنی سانسورشیپ حرفه ای توی شبکه خودتون راه بندازید. منظور من از فایروال چیزی مثل iptables هست. اما تفاوت عمده این فایروال این هست که قابلیت بررسی عمیق الگو ها و بسته های شبکه رو در لایه های مختلف رو دراختیار شما قرار میده. شبیه به تشکیلاتی که در زیرساخت فنی کشور هایی مثل ایران، ترکیه، چین و روسیه وجود داره. بسیاری از ابزارهای سانسور قبلاً فقط برای افراد خاص سازمان‌ها در دسترس بود. سازنده‌های این فایروال دوست دارن که هر کسی بتونه به این ابزار دسترسی داشته باشه.",[51,186,179],{"id":187},"opengfw",[11,189,190,191,195],{},"پروژه ",[192,193],"a",{"href":194},"gfw.dev"," به منظور دموکراتیزه کردن سانسورشیپ برای افراد عادی ساخته شده. چندمورد از کاربرد های دیگه ای که این نرم افزار میتونه داشته باشه اینها هست:",[197,198,199,202,205,208],"ul",{},[149,200,201],{},"مراقبت والدین از فرزندان",[149,203,204],{},"مسدود سازی تبلیغات‌ و بدافزار",[149,206,207],{},"جلوگیری از هرگونه سواستفاده در شبکه خصوصی",[149,209,210],{},"کمک به ارضای انگیزه های دیکتاتوری شما",[11,212,213],{},"ذاتِ این پروژه ممکنه برای برخی از افراد عجیب به نظر بیاد. اما به هر حال، اگر به مسائلی مثل «حق دسترسی به اینترنت» و «اینترنت ازاد برای همه» باور دارید، وجود همچین چیزی خیلی نمیتونه علیه این موضوع باشه. چه بسا که بتونید با درک این مسائل کمک بزرگی به این داستان بکنید. این هم ذکر کنم که سازندگان این فایروال، همزمان سازنده پروتکل VPN قدرتمند Hysteria2 هم هستند!",[11,215,216],{},"و برعکس، اگر باور دارید که مصلحت نیست افراد به برخی از منابع اینترنتی دسترسی داشته باشند، میتونید سانسور رو حتی از اینی هم که هست بالاتر بکشید 🚀",[51,218,220],{"id":219},"چطور-کار-میکنه","چطور کار میکنه؟",[11,222,223],{},"فایروال ها رو معمولا روی کامپیوتر های شخصی بالا نمیارن. اما برای تست و اشنایی با نحوه راه اندازی اون، میتونید اون رو توی کامپیوتر خودتون هم تست کنید. با این کار، درحالت عادی فقط جریان شبکه کامپیوتر خودتون تحت تاثیر قرار میگیره. فعلا با این رویه جلو میریم…",[93,225,226],{"id":226},"نصب",[11,228,229],{},"فایروال نرم افزار با زبان Golang نوشته شده. برای نصب کردن اون دو راه دارید.",[11,231,232],{},"۱. پروژه رو clone کنید و خودتون با گولنگ Build کنید:",[234,235,239],"pre",{"className":236,"code":237,"language":238,"meta":156,"style":156},"language-bash shiki shiki-themes github-dark","export CGO_ENABLED=0\ngo build\n","bash",[240,241,242,262],"code",{"__ignoreMap":156},[243,244,247,251,255,258],"span",{"class":245,"line":246},"line",1,[243,248,250],{"class":249},"snl16","export",[243,252,254],{"class":253},"s95oV"," CGO_ENABLED",[243,256,257],{"class":249},"=",[243,259,261],{"class":260},"sDLfK","0\n",[243,263,264,268],{"class":245,"line":157},[243,265,267],{"class":266},"svObZ","go",[243,269,271],{"class":270},"sU2Wk"," build\n",[11,273,274,275,281],{},"۲. فایل باینری نرم افزار رو ",[192,276,280],{"href":277,"rel":278},"https://github.com/apernet/OpenGFW/releases",[279],"nofollow","مستقیم از گیت هاب"," پروژه دانلود کنید.",[93,283,285],{"id":284},"راه-اندازی-و-اجرا","راه اندازی و اجرا",[11,287,288],{},"قبل از اجرا نرم افزار نیاز هست که یک سری ماژول های کرنل لینوکس رو در سیستم عامل خودتون نصب داشته باشید که در اینجا لیست میکنم:",[197,290,291,294],{},[149,292,293],{},"kmod-nft-queue",[149,295,296],{},"kmod-nf-conntrack-netlink",[11,298,299],{},"خبر خوب این هست که اگر از توزیع های متعارف مثل Fedora و Ubuntu استفاده میکنید، این ماژول ها به احتمال زیاد همراه با سیستم عامل شما نصب شدند. نصب دستی این ماژول ها بیشتر برای سیستم عامل های خاص مثل OpenWRT موضوعیت داره. ( به دلایل مختلف، که احتمالا محدود بودن سخت افزار روتر میتونه جزش باشه)",[11,301,302,303,306],{},"بعد از چک کردن این موضوع، فایل پیکربندی نرم افزار رو با نام ‍‍‍",[240,304,305],{},"config.yaml‍"," ایجاد میکنیم. نمونه کانفیگی که لازم دارید رو قرار میدم:",[234,308,312],{"className":309,"code":310,"language":311,"meta":156,"style":156},"language-yaml shiki shiki-themes github-dark","io:\n  queueSize: 1024\n  queueNum: 100 \n  table: opengfw \n  connMarkAccept: 1001 \n  connMarkDrop: 1002 \n  rcvBuf: 4194304\n  sndBuf: 4194304\n  local: true \n  rst: false \n\nworkers:\n  count: 4 \n  queueSize: 64\n  tcpMaxBufferedPagesTotal: 65536\n  tcpMaxBufferedPagesPerConn: 16\n  tcpTimeout: 10m \n  udpMaxStreams: 4096\n","yaml",[240,313,314,323,334,347,359,372,385,396,406,419,432,438,446,459,469,480,491,504],{"__ignoreMap":156},[243,315,316,320],{"class":245,"line":246},[243,317,319],{"class":318},"s4JwU","io",[243,321,322],{"class":253},":\n",[243,324,325,328,331],{"class":245,"line":157},[243,326,327],{"class":318},"  queueSize",[243,329,330],{"class":253},": ",[243,332,333],{"class":260},"1024\n",[243,335,336,339,341,344],{"class":245,"line":162},[243,337,338],{"class":318},"  queueNum",[243,340,330],{"class":253},[243,342,343],{"class":260},"100",[243,345,346],{"class":253}," \n",[243,348,350,353,355,357],{"class":245,"line":349},4,[243,351,352],{"class":318},"  table",[243,354,330],{"class":253},[243,356,187],{"class":270},[243,358,346],{"class":253},[243,360,362,365,367,370],{"class":245,"line":361},5,[243,363,364],{"class":318},"  connMarkAccept",[243,366,330],{"class":253},[243,368,369],{"class":260},"1001",[243,371,346],{"class":253},[243,373,375,378,380,383],{"class":245,"line":374},6,[243,376,377],{"class":318},"  connMarkDrop",[243,379,330],{"class":253},[243,381,382],{"class":260},"1002",[243,384,346],{"class":253},[243,386,388,391,393],{"class":245,"line":387},7,[243,389,390],{"class":318},"  rcvBuf",[243,392,330],{"class":253},[243,394,395],{"class":260},"4194304\n",[243,397,399,402,404],{"class":245,"line":398},8,[243,400,401],{"class":318},"  sndBuf",[243,403,330],{"class":253},[243,405,395],{"class":260},[243,407,409,412,414,417],{"class":245,"line":408},9,[243,410,411],{"class":318},"  local",[243,413,330],{"class":253},[243,415,416],{"class":260},"true",[243,418,346],{"class":253},[243,420,422,425,427,430],{"class":245,"line":421},10,[243,423,424],{"class":318},"  rst",[243,426,330],{"class":253},[243,428,429],{"class":260},"false",[243,431,346],{"class":253},[243,433,435],{"class":245,"line":434},11,[243,436,437],{"emptyLinePlaceholder":170},"\n",[243,439,441,444],{"class":245,"line":440},12,[243,442,443],{"class":318},"workers",[243,445,322],{"class":253},[243,447,449,452,454,457],{"class":245,"line":448},13,[243,450,451],{"class":318},"  count",[243,453,330],{"class":253},[243,455,456],{"class":260},"4",[243,458,346],{"class":253},[243,460,462,464,466],{"class":245,"line":461},14,[243,463,327],{"class":318},[243,465,330],{"class":253},[243,467,468],{"class":260},"64\n",[243,470,472,475,477],{"class":245,"line":471},15,[243,473,474],{"class":318},"  tcpMaxBufferedPagesTotal",[243,476,330],{"class":253},[243,478,479],{"class":260},"65536\n",[243,481,483,486,488],{"class":245,"line":482},16,[243,484,485],{"class":318},"  tcpMaxBufferedPagesPerConn",[243,487,330],{"class":253},[243,489,490],{"class":260},"16\n",[243,492,494,497,499,502],{"class":245,"line":493},17,[243,495,496],{"class":318},"  tcpTimeout",[243,498,330],{"class":253},[243,500,501],{"class":270},"10m",[243,503,346],{"class":253},[243,505,507,510,512],{"class":245,"line":506},18,[243,508,509],{"class":318},"  udpMaxStreams",[243,511,330],{"class":253},[243,513,514],{"class":260},"4096\n",[11,516,517,518,523],{},"این فایل پیکربندی یک سری از پارامتر های داخلی برنامه رو تنظیم میکنه. پاراگراف اول (بخش io)، پیکربندی های مرتبط با تعامل فایروال داخلی سیستم عامل شما (یعنی nftables یا iptables) رو مشخص میکنه و پاراگراف دوم (بخش workers) مربوط به cuncurrency نرم افزار میشه. توضیحات مختصری درمورد این فیلد ها در ",[192,519,522],{"href":520,"rel":521},"https://gfw.dev/docs/build-run/#config-example",[279],"مستندات پروژه"," وجود داره که میتونید مطالعه کنید. اما اگر اشنا نیست میتونید از همین حالت های پیش فرض استفاده کنید.",[525,526,527],"info",{},[11,528,529],{},"با توجه به معماری سیستم عامل های لینوکسی، OpenGFW نرم افزاری هست که در بخش User space کامپیوتر شما فعالیت میکنه. برنامه هایی که در User space فعالیت میکنن نمیتونن فعالیت های اینچنینی رو بدون تعامل با کتابخانه های مرتبط با کرنل انجام بدن. پاراگراف io از فایل پیکربندی هم دقیقا مرتبط با همین موضوع هست.",[11,531,532],{},"در اینده دوست دارم که بتونم درمورد نحوه کار این نرم افزار از لحاظ فنی هم بنویسم. اما فعلا بیایید نرم افزار رو راه بندازیم!",[11,534,535,536,539],{},"میرسیم به بخش جذاب: ایجاد فایل قوانین ",[240,537,538],{},"rules.yaml"," برای تعیین سیاست نرم افزار در مواجهه با بسته های شبکه!",[11,541,542,543,548],{},"توی این فایل شما مجموعه ای از قوانین رو تعریف میکنید که در مواجه با کانکشن های مختلف چه عملی انجام بشه. فایل rules رو باید با سینتکس زبان ",[192,544,547],{"href":545,"rel":546},"https://github.com/expr-lang/expr",[279],"expr"," بنویسید. این زبان به شما کمک میکنه که توی تعریف قوانین بتونید تا جای ممکن انعطاف پذیر عمل کنید. یه نمونه از تکنیک های ساده ی مسدودسازی، تکنیک DNS poison هست. بیاید برای شروع سایت علی بابا رو در نظر بگیریم و انجامش بدیم:",[234,550,552],{"className":309,"code":551,"language":311,"meta":156,"style":156},"- name: I hate alibaba!\n  action: modify\n  modifier:\n    name: dns\n    args:\n      a: \"0.0.0.0\"\n      aaaa: \"::\"\n  expr: dns != nil && dns.qr && any(dns.questions, {.name endsWith \"alibaba.ir\"})\n",[240,553,554,567,577,584,594,601,611,621],{"__ignoreMap":156},[243,555,556,559,562,564],{"class":245,"line":246},[243,557,558],{"class":253},"- ",[243,560,561],{"class":318},"name",[243,563,330],{"class":253},[243,565,566],{"class":270},"I hate alibaba!\n",[243,568,569,572,574],{"class":245,"line":157},[243,570,571],{"class":318},"  action",[243,573,330],{"class":253},[243,575,576],{"class":270},"modify\n",[243,578,579,582],{"class":245,"line":162},[243,580,581],{"class":318},"  modifier",[243,583,322],{"class":253},[243,585,586,589,591],{"class":245,"line":349},[243,587,588],{"class":318},"    name",[243,590,330],{"class":253},[243,592,593],{"class":270},"dns\n",[243,595,596,599],{"class":245,"line":361},[243,597,598],{"class":318},"    args",[243,600,322],{"class":253},[243,602,603,606,608],{"class":245,"line":374},[243,604,605],{"class":318},"      a",[243,607,330],{"class":253},[243,609,610],{"class":270},"\"0.0.0.0\"\n",[243,612,613,616,618],{"class":245,"line":387},[243,614,615],{"class":318},"      aaaa",[243,617,330],{"class":253},[243,619,620],{"class":270},"\"::\"\n",[243,622,623,626,628],{"class":245,"line":398},[243,624,625],{"class":318},"  expr",[243,627,330],{"class":253},[243,629,630],{"class":270},"dns != nil && dns.qr && any(dns.questions, {.name endsWith \"alibaba.ir\"})\n",[11,632,633],{},"در فیلد name، نام قانون رو مشخص میکنید. فیلد action میتونه یکی از مقدار های allow, block, drop, modify رو دریافت کنه.\nدر تکنیک dns poision معمولا در مواجهه با دیتاگرام dns غیرمجاز، اون بسته دستکاری میشه تا از دسترسی به پاسخ صحیح جلوگیری بشه. پس ما اینجا از عمل modify استفاده کردیم تا بسته دستکاری بشه.",[11,635,636],{},"در فیلد بعدی یعنی modifier، مشخص میکنیم که بسته dns مورد نظر به چه مقداری تغییر کنه. مقدار این فیلد ها میتونه هر چیز غیرمنطقی ای باشه. مثل ادرس یک ip محلی به جای ip public.",[11,638,639,640,644],{},"و در اخر، در فیلد expr، شرط مورد نظر رو برای مطابقت دادن با سایت مورد نظر خودمون مینویسیم. ما اینجا این محدودیت رو برای بسته های کوئری dns با نام ”alibaba.ir” اعمال کردیم. برای بررسی فیلد های موجود به مستندات ",[192,641,179],{"href":642,"rel":643},"https://gfw.dev/docs/analyzers/",[279]," مراجعه کنید.",[11,646,647],{},"حالا نرم افزار رو با ارگومان های config.yaml و rules.yaml اجرا میکنیم:",[234,649,651],{"className":236,"code":650,"language":238,"meta":156,"style":156},"$ sudo ./OpenGFW-linux-amd64 -c config.yaml rules.yaml \n2025-10-18T21:25:53+03:30   INFO    engine started\n",[240,652,653,675],{"__ignoreMap":156},[243,654,655,658,661,664,667,670,673],{"class":245,"line":246},[243,656,657],{"class":266},"$",[243,659,660],{"class":270}," sudo",[243,662,663],{"class":270}," ./OpenGFW-linux-amd64",[243,665,666],{"class":260}," -c",[243,668,669],{"class":270}," config.yaml",[243,671,672],{"class":270}," rules.yaml",[243,674,346],{"class":253},[243,676,677,680,683,686],{"class":245,"line":157},[243,678,679],{"class":266},"2025-10-18T21:25:53+03:30",[243,681,682],{"class":270},"   INFO",[243,684,685],{"class":270},"    engine",[243,687,688],{"class":270}," started\n",[11,690,691],{},"اگر اروری مشاهده نکردید، میتونید کارایی نرم افزار رو بررسی کنید. من اینجا از ابزار dig برای پیدا کردن ایپی ادرس سایت alibaba.ir استفاده میکنم. نتیجه باید چیزی شبیه به زیر باشه:",[234,693,695],{"className":236,"code":694,"language":238,"meta":156,"style":156},"$ dig alibaba.ir\n\n; \u003C\u003C>> DiG 9.18.39 \u003C\u003C>> alibaba.ir\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER\u003C\u003C- opcode: QUERY, status: NOERROR, id: 21880\n;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 65494\n;; QUESTION SECTION:\n;alibaba.ir.            IN  A\n\n;; ANSWER SECTION:\nalibaba.ir.     0   IN  A   0.0.0.0\n\n;; Query time: 674 msec\n;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)\n;; WHEN: Sat Oct 18 21:38:21 +0330 2025\n;; MSG SIZE  rcvd: 65\n",[240,696,697,707,711,735,740,745,750,755,759,764,769,774,779,783,788,793,797,802,807,813],{"__ignoreMap":156},[243,698,699,701,704],{"class":245,"line":246},[243,700,657],{"class":266},[243,702,703],{"class":270}," dig",[243,705,706],{"class":270}," alibaba.ir\n",[243,708,709],{"class":245,"line":157},[243,710,437],{"emptyLinePlaceholder":170},[243,712,713,716,719,722,725,728,731,733],{"class":245,"line":162},[243,714,715],{"class":253},"; ",[243,717,718],{"class":249},"\u003C\u003C",[243,720,721],{"class":270},">>",[243,723,724],{"class":266}," DiG",[243,726,727],{"class":260}," 9.18.39",[243,729,730],{"class":249}," \u003C\u003C",[243,732,721],{"class":270},[243,734,706],{"class":266},[243,736,737],{"class":245,"line":349},[243,738,739],{"class":270},";; global options: +cmd\n",[243,741,742],{"class":245,"line":361},[243,743,744],{"class":270},";; Got answer:\n",[243,746,747],{"class":245,"line":374},[243,748,749],{"class":270},";; ->>HEADER\u003C\u003C- opcode: QUERY, status: NOERROR, id: 21880\n",[243,751,752],{"class":245,"line":387},[243,753,754],{"class":270},";; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\n",[243,756,757],{"class":245,"line":398},[243,758,437],{"emptyLinePlaceholder":170},[243,760,761],{"class":245,"line":408},[243,762,763],{"class":270},";; OPT PSEUDOSECTION:\n",[243,765,766],{"class":245,"line":421},[243,767,768],{"class":270},"; EDNS: version: 0, flags:; udp: 65494\n",[243,770,771],{"class":245,"line":434},[243,772,773],{"class":270},";; QUESTION SECTION:\n",[243,775,776],{"class":245,"line":440},[243,777,778],{"class":270},";alibaba.ir.            IN  A\n",[243,780,781],{"class":245,"line":448},[243,782,437],{"emptyLinePlaceholder":170},[243,784,785],{"class":245,"line":461},[243,786,787],{"class":270},";; ANSWER SECTION:\n",[243,789,790],{"class":245,"line":471},[243,791,792],{"class":270},"alibaba.ir.     0   IN  A   0.0.0.0\n",[243,794,795],{"class":245,"line":482},[243,796,437],{"emptyLinePlaceholder":170},[243,798,799],{"class":245,"line":493},[243,800,801],{"class":270},";; Query time: 674 msec\n",[243,803,804],{"class":245,"line":506},[243,805,806],{"class":270},";; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)\n",[243,808,810],{"class":245,"line":809},19,[243,811,812],{"class":270},";; WHEN: Sat Oct 18 21:38:21 +0330 2025\n",[243,814,816],{"class":245,"line":815},20,[243,817,818],{"class":270},";; MSG SIZE  rcvd: 65\n",[525,820,821],{},[11,822,823],{},"به خاطر داشته باشید که روش dns poison دربرابر پروتکل DNS Over HTTPS کارایی نداره. در همچین شرایطی میتونید از فیلتر کردن بر اساس فیلد sni در بسته TLS استفاده کنید.",[11,825,826,827,832],{},"ما صرفا با انالیزور DNS فایروال کردیم. به علت عدم رمزنگاری، پروتکل DNS در حالت سنتی اش راهکاری عالی برای سانسور هست. کانکشن‌های رمزنگاری‌شده مثل پروتکل های VPN چطور؟ خبر جذاب اینه که این فایروال از ",[192,828,831],{"href":829,"rel":830},"https://gfw.dev/docs/analyzers/#fet-fully-encrypted-traffic",[279],"برخی از پروتکل های VPN رمزنگاری شده"," هم پشتیبانی میکنه!‌ میتونید انالیزور های مختلف و نحوه کار اونها رو از مستندات پروژه مشاهده کنید.",[51,834,836],{"id":835},"چطور-فایروال-رو-در-شبکه-خودم-پیاده-سازی-کنم","چطور فایروال رو در شبکه خودم پیاده سازی کنم؟",[11,838,839],{},"تا الان فایروال رو در کامپیوتر شخصی تست کردیم. اما برای اینکه این سیستم کاربردی تر باشه، احتمالا دوست دارید که این رو توی router شبکه مورد نظرتون راه اندازی کنید. این فایروال نیاز به یک روتر با سیستم عامل مبتنی بر لینوکس داره که ازادی عمل خوبی هم به شما بده. گزینه معروف برای این کار، سیستم عامل OpenWRT هست. برخی از روتر های بازار این سیستم عامل رو برای نصب پشتیبانی میکنن. من دسترسی به روتر مناسب اینکار ندارم.",[11,841,842],{},"اما خوشبختانه سیستم عامل OpenWRT روی ابزار های مجازی ساز مثل qemu قابل اجرا هست. به عبارتِ دیگه، OpenWRT تقریبا روی هر کامپیوتری اعم از کامپیوتر های شخصی قابل نصب هست. در ادامه از پلتفرم QEMU برای شبیه سازی نصب این فایروال روی OpenWRT استفاده میکنیم…",[11,844,845],{},"در قدم اول باید مجموعه ابزار های مرتبط با QEMU رو در کامپیوتر خودتون نصب کنید:",[234,847,849],{"className":236,"code":848,"language":238,"meta":156,"style":156},"sudo apt-get install qemu\n",[240,850,851],{"__ignoreMap":156},[243,852,853,856,859,862],{"class":245,"line":246},[243,854,855],{"class":266},"sudo",[243,857,858],{"class":270}," apt-get",[243,860,861],{"class":270}," install",[243,863,864],{"class":270}," qemu\n",[11,866,867,868,873],{},"بعد، image سیستم عامل OpenWRT رو از ",[192,869,872],{"href":870,"rel":871},"https://downloads.openwrt.org/",[279],"سایت مرجع"," دانلود کنید. پیشنهاد من ورژن 23.05 هست. در ورژن جدید تر یعنی 24.10، ماژول های کرنلِ لازم برای کار این نرم افزار وجود نداره. (یا حداقل، من پیدا نکردم)",[11,875,876],{},"بعد از انتخاب ورژن مورد نظر، از دایرکتوری Targets/x86/64 میتونید image های موجود رو مشاهده کنید. من از image نوع generic-ext4-combined استفاده میکنم. ایمیج رو دانلود کنید و با دستور gunzip اون رو از حالت فشرده خارج کنید.",[11,878,879],{},"حالا باید با کمک qemu، ایمیج رو اجرا کنید. چون اپشن ها و ارگومان های qemu کمی طولانیه، بهتره اون رو داخل یه شل اسکریپت قرار بدید:",[234,881,883],{"className":236,"code":882,"language":238,"meta":156,"style":156},"#!/usr/bin/bash\nqemu-system-x86_64 \\\n  -M q35 \\\n  -drive file=openwrt-23.05.6-x86-64-generic-ext4-combined.img,format=raw,if=virtio \\\n  -m 512 \\\n  -nographic -enable-kvm \\\n  -device virtio-net,netdev=lan0 \\\n  -netdev user,id=lan0 \\\n  -device virtio-net,netdev=wan0 \\\n  -netdev user,id=wan0,hostfwd=tcp::11122-:22,hostfwd=tcp::8085-:80\n",[240,884,885,891,899,909,919,929,939,949,959,968],{"__ignoreMap":156},[243,886,887],{"class":245,"line":246},[243,888,890],{"class":889},"sAwPA","#!/usr/bin/bash\n",[243,892,893,896],{"class":245,"line":157},[243,894,895],{"class":266},"qemu-system-x86_64",[243,897,898],{"class":260}," \\\n",[243,900,901,904,907],{"class":245,"line":162},[243,902,903],{"class":260},"  -M",[243,905,906],{"class":270}," q35",[243,908,898],{"class":260},[243,910,911,914,917],{"class":245,"line":349},[243,912,913],{"class":260},"  -drive",[243,915,916],{"class":270}," file=openwrt-23.05.6-x86-64-generic-ext4-combined.img,format=raw,if=virtio",[243,918,898],{"class":260},[243,920,921,924,927],{"class":245,"line":361},[243,922,923],{"class":260},"  -m",[243,925,926],{"class":260}," 512",[243,928,898],{"class":260},[243,930,931,934,937],{"class":245,"line":374},[243,932,933],{"class":260},"  -nographic",[243,935,936],{"class":260}," -enable-kvm",[243,938,898],{"class":260},[243,940,941,944,947],{"class":245,"line":387},[243,942,943],{"class":260},"  -device",[243,945,946],{"class":270}," virtio-net,netdev=lan0",[243,948,898],{"class":260},[243,950,951,954,957],{"class":245,"line":398},[243,952,953],{"class":260},"  -netdev",[243,955,956],{"class":270}," user,id=lan0",[243,958,898],{"class":260},[243,960,961,963,966],{"class":245,"line":408},[243,962,943],{"class":260},[243,964,965],{"class":270}," virtio-net,netdev=wan0",[243,967,898],{"class":260},[243,969,970,972],{"class":245,"line":421},[243,971,953],{"class":260},[243,973,974],{"class":270}," user,id=wan0,hostfwd=tcp::11122-:22,hostfwd=tcp::8085-:80\n",[11,976,977],{},"توی اسکریپت بالا، بعد از یک سری اپشن های کلی مثل تعیین نوع ماشین و مقدار مموری، کارت های شبکه مجازی ماشین رو مشخص میکنیم. استفاده از netdev user در پورت wan ماشین، امکان دسترسی به اینترنت رو به OpenWRT میده. (درواقع دسترسی به اینترنت از طریق کامپیوتر هاست تامین میشه)",[11,979,980],{},"حالا اسکریپت رو اجرا کنید و منتظر باشید تا سیستم عامل بوت بشه. بعد، دسترسی به اینترنت ماشین رو چک کنید:",[234,982,984],{"className":236,"code":983,"language":238,"meta":156,"style":156},"BusyBox v1.36.1 (2025-08-14 18:27:40 UTC) built-in shell (ash)\n\n  _______                     ________        __\n |       |.-----.-----.-----.|  |  |  |.----.|  |_\n |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|\n |_______||   __|_____|__|__||________||__|  |____|\n          |__| W I R E L E S S   F R E E D O M\n -----------------------------------------------------\n OpenWrt 23.05.6, r24232-539228933c\n -----------------------------------------------------\n=== WARNING! =====================================\nThere is no root password defined on this device!\nUse the \"passwd\" command to set up a new password\nin order to prevent unauthorized SSH logins.\n--------------------------------------------------\nroot@OpenWrt:/# ping 1.1.1.1\nPING 1.1.1.1 (1.1.1.1): 56 data bytes\n64 bytes from 1.1.1.1: seq=0 ttl=255 time=77.994 ms\n64 bytes from 1.1.1.1: seq=1 ttl=255 time=78.461 ms\n64 bytes from 1.1.1.1: seq=2 ttl=255 time=78.280 ms\n64 bytes from 1.1.1.1: seq=3 ttl=255 time=78.034 ms\n",[240,985,986,1012,1016,1027,1058,1099,1143,1192,1197,1208,1212,1223,1252,1284,1289,1294,1305,1316,1351,1377,1403],{"__ignoreMap":156},[243,987,988,991,994,997,1000,1003,1006,1009],{"class":245,"line":246},[243,989,990],{"class":266},"BusyBox",[243,992,993],{"class":270}," v1.36.1",[243,995,996],{"class":253}," (2025-08-14 ",[243,998,999],{"class":270},"18:27:40",[243,1001,1002],{"class":270}," UTC",[243,1004,1005],{"class":253},") built-in shell (",[243,1007,1008],{"class":266},"ash",[243,1010,1011],{"class":253},")\n",[243,1013,1014],{"class":245,"line":157},[243,1015,437],{"emptyLinePlaceholder":170},[243,1017,1018,1021,1024],{"class":245,"line":162},[243,1019,1020],{"class":266},"  _______",[243,1022,1023],{"class":270},"                     ________",[243,1025,1026],{"class":270},"        __\n",[243,1028,1029,1032,1035,1038,1041,1044,1046,1048,1051,1053,1055],{"class":245,"line":349},[243,1030,1031],{"class":249}," |",[243,1033,1034],{"class":249},"       |",[243,1036,1037],{"class":266},".-----.-----.-----.",[243,1039,1040],{"class":249},"|",[243,1042,1043],{"class":249},"  |",[243,1045,1043],{"class":249},[243,1047,1043],{"class":249},[243,1049,1050],{"class":266},".----.",[243,1052,1040],{"class":249},[243,1054,1043],{"class":249},[243,1056,1057],{"class":266},"_\n",[243,1059,1060,1062,1065,1068,1071,1073,1076,1078,1081,1083,1085,1088,1091,1094,1096],{"class":245,"line":361},[243,1061,1031],{"class":249},[243,1063,1064],{"class":266},"   -",[243,1066,1067],{"class":249},"   ||",[243,1069,1070],{"class":266},"  _",[243,1072,1043],{"class":249},[243,1074,1075],{"class":266},"  -__",[243,1077,1040],{"class":249},[243,1079,1080],{"class":249},"     ||",[243,1082,1043],{"class":249},[243,1084,1043],{"class":249},[243,1086,1087],{"class":249},"  ||",[243,1089,1090],{"class":266},"   _",[243,1092,1093],{"class":249},"||",[243,1095,1090],{"class":266},[243,1097,1098],{"class":249},"|\n",[243,1100,1101,1103,1106,1108,1111,1113,1116,1118,1121,1123,1125,1127,1130,1132,1134,1136,1138,1141],{"class":245,"line":374},[243,1102,1031],{"class":249},[243,1104,1105],{"class":266},"_______",[243,1107,1093],{"class":249},[243,1109,1110],{"class":266},"   __",[243,1112,1040],{"class":249},[243,1114,1115],{"class":266},"_____",[243,1117,1040],{"class":249},[243,1119,1120],{"class":266},"__",[243,1122,1040],{"class":249},[243,1124,1120],{"class":266},[243,1126,1093],{"class":249},[243,1128,1129],{"class":266},"________",[243,1131,1093],{"class":249},[243,1133,1120],{"class":266},[243,1135,1040],{"class":249},[243,1137,1043],{"class":249},[243,1139,1140],{"class":266},"____",[243,1142,1098],{"class":249},[243,1144,1145,1148,1150,1152,1155,1158,1161,1164,1167,1169,1172,1174,1177,1179,1181,1183,1186,1189],{"class":245,"line":387},[243,1146,1147],{"class":249},"          |",[243,1149,1120],{"class":266},[243,1151,1040],{"class":249},[243,1153,1154],{"class":266}," W",[243,1156,1157],{"class":270}," I",[243,1159,1160],{"class":270}," R",[243,1162,1163],{"class":270}," E",[243,1165,1166],{"class":270}," L",[243,1168,1163],{"class":270},[243,1170,1171],{"class":270}," S",[243,1173,1171],{"class":270},[243,1175,1176],{"class":270},"   F",[243,1178,1160],{"class":270},[243,1180,1163],{"class":270},[243,1182,1163],{"class":270},[243,1184,1185],{"class":270}," D",[243,1187,1188],{"class":270}," O",[243,1190,1191],{"class":270}," M\n",[243,1193,1194],{"class":245,"line":398},[243,1195,1196],{"class":266}," -----------------------------------------------------\n",[243,1198,1199,1202,1205],{"class":245,"line":408},[243,1200,1201],{"class":266}," OpenWrt",[243,1203,1204],{"class":270}," 23.05.6,",[243,1206,1207],{"class":270}," r24232-539228933c\n",[243,1209,1210],{"class":245,"line":421},[243,1211,1196],{"class":266},[243,1213,1214,1217,1220],{"class":245,"line":434},[243,1215,1216],{"class":270},"===",[243,1218,1219],{"class":270}," WARNING!",[243,1221,1222],{"class":270}," =====================================\n",[243,1224,1225,1228,1231,1234,1237,1240,1243,1246,1249],{"class":245,"line":440},[243,1226,1227],{"class":266},"There",[243,1229,1230],{"class":270}," is",[243,1232,1233],{"class":270}," no",[243,1235,1236],{"class":270}," root",[243,1238,1239],{"class":270}," password",[243,1241,1242],{"class":270}," defined",[243,1244,1245],{"class":270}," on",[243,1247,1248],{"class":270}," this",[243,1250,1251],{"class":270}," device!\n",[243,1253,1254,1257,1260,1263,1266,1269,1272,1275,1278,1281],{"class":245,"line":448},[243,1255,1256],{"class":266},"Use",[243,1258,1259],{"class":270}," the",[243,1261,1262],{"class":270}," \"passwd\"",[243,1264,1265],{"class":270}," command",[243,1267,1268],{"class":270}," to",[243,1270,1271],{"class":270}," set",[243,1273,1274],{"class":270}," up",[243,1276,1277],{"class":270}," a",[243,1279,1280],{"class":270}," new",[243,1282,1283],{"class":270}," password\n",[243,1285,1286],{"class":245,"line":461},[243,1287,1288],{"class":253},"in order to prevent unauthorized SSH logins.\n",[243,1290,1291],{"class":245,"line":471},[243,1292,1293],{"class":266},"--------------------------------------------------\n",[243,1295,1296,1299,1302],{"class":245,"line":482},[243,1297,1298],{"class":266},"root@OpenWrt:/#",[243,1300,1301],{"class":270}," ping",[243,1303,1304],{"class":260}," 1.1.1.1\n",[243,1306,1307,1310,1313],{"class":245,"line":493},[243,1308,1309],{"class":266},"PING",[243,1311,1312],{"class":260}," 1.1.1.1",[243,1314,1315],{"class":253}," (1.1.1.1): 56 data bytes\n",[243,1317,1318,1321,1324,1327,1330,1333,1336,1339,1342,1345,1348],{"class":245,"line":506},[243,1319,1320],{"class":266},"64",[243,1322,1323],{"class":270}," bytes",[243,1325,1326],{"class":270}," from",[243,1328,1329],{"class":270}," 1.1.1.1:",[243,1331,1332],{"class":270}," seq=",[243,1334,1335],{"class":260},"0",[243,1337,1338],{"class":270}," ttl=",[243,1340,1341],{"class":260},"255",[243,1343,1344],{"class":270}," time=",[243,1346,1347],{"class":260},"77.994",[243,1349,1350],{"class":270}," ms\n",[243,1352,1353,1355,1357,1359,1361,1363,1366,1368,1370,1372,1375],{"class":245,"line":809},[243,1354,1320],{"class":266},[243,1356,1323],{"class":270},[243,1358,1326],{"class":270},[243,1360,1329],{"class":270},[243,1362,1332],{"class":270},[243,1364,1365],{"class":260},"1",[243,1367,1338],{"class":270},[243,1369,1341],{"class":260},[243,1371,1344],{"class":270},[243,1373,1374],{"class":260},"78.461",[243,1376,1350],{"class":270},[243,1378,1379,1381,1383,1385,1387,1389,1392,1394,1396,1398,1401],{"class":245,"line":815},[243,1380,1320],{"class":266},[243,1382,1323],{"class":270},[243,1384,1326],{"class":270},[243,1386,1329],{"class":270},[243,1388,1332],{"class":270},[243,1390,1391],{"class":260},"2",[243,1393,1338],{"class":270},[243,1395,1341],{"class":260},[243,1397,1344],{"class":270},[243,1399,1400],{"class":260},"78.280",[243,1402,1350],{"class":270},[243,1404,1406,1408,1410,1412,1414,1416,1419,1421,1423,1425,1428],{"class":245,"line":1405},21,[243,1407,1320],{"class":266},[243,1409,1323],{"class":270},[243,1411,1326],{"class":270},[243,1413,1329],{"class":270},[243,1415,1332],{"class":270},[243,1417,1418],{"class":260},"3",[243,1420,1338],{"class":270},[243,1422,1341],{"class":260},[243,1424,1344],{"class":270},[243,1426,1427],{"class":260},"78.034",[243,1429,1350],{"class":270},[11,1431,1432],{},"(اگر دستگاه به اینترنت دسترسی نداشت، با دستور ip در OpenWRT، پیکربندی شبکه ماشین رو چک کنید. احتمالا gateway اولین چیزیه که میخواید چک کنید)",[11,1434,1435],{},"وقتی از اتصال اینترنت مطمعن شدید، پیش نیاز های مورد نیاز رو از پکیج منیجر مخصوص OpenWRT نصب کنید:",[234,1437,1439],{"className":236,"code":1438,"language":238,"meta":156,"style":156},"opkg install nftables kmod-nft-queue kmod-nf-conntrack-netlink\n",[240,1440,1441],{"__ignoreMap":156},[243,1442,1443,1446,1448,1451,1454],{"class":245,"line":246},[243,1444,1445],{"class":266},"opkg",[243,1447,861],{"class":270},[243,1449,1450],{"class":270}," nftables",[243,1452,1453],{"class":270}," kmod-nft-queue",[243,1455,1456],{"class":270}," kmod-nf-conntrack-netlink\n",[11,1458,1459],{},"عالیه! حالا فایل باینری رو OpenGFW رو به نحوی به دستگاه منتقل کنید (با wget میتونید این کار رو انجام بدید که به طور پیشفرض در سیستم عامل موجوده) و بعد از اون، دقیقا مثل بخش های قبل، فایل rule.yaml و config.yaml رو اماده کنید و برنامه رو اجرا کنید:",[234,1461,1463],{"className":236,"code":1462,"language":238,"meta":156,"style":156},"root@OpenWrt:~/gfw# ll\ndrwxr-xr-x    2 root     root          4096 Oct 10 11:55 ./\ndrwxr-xr-x    3 root     root          4096 Oct 10 11:44 ../\n-rw-r--r--    1 root     root           562 Oct 10 11:45 config.yaml\n-rwx------    1 root     root      13627544 Oct 10 11:54 opengfw*\n-rw-r--r--    1 root     root           198 Oct 10 13:48 rule.yaml\nroot@OpenWrt:~/gfw# ./opengfw -c config.yaml rule.yaml \n2025-10-18T18:22:08Z    INFO    engine started\n",[240,1464,1465,1473,1501,1524,1549,1576,1599,1615],{"__ignoreMap":156},[243,1466,1467,1470],{"class":245,"line":246},[243,1468,1469],{"class":266},"root@OpenWrt:~/gfw#",[243,1471,1472],{"class":270}," ll\n",[243,1474,1475,1478,1481,1483,1486,1489,1492,1495,1498],{"class":245,"line":157},[243,1476,1477],{"class":266},"drwxr-xr-x",[243,1479,1480],{"class":260},"    2",[243,1482,1236],{"class":270},[243,1484,1485],{"class":270},"     root",[243,1487,1488],{"class":260},"          4096",[243,1490,1491],{"class":270}," Oct",[243,1493,1494],{"class":260}," 10",[243,1496,1497],{"class":270}," 11:55",[243,1499,1500],{"class":270}," ./\n",[243,1502,1503,1505,1508,1510,1512,1514,1516,1518,1521],{"class":245,"line":162},[243,1504,1477],{"class":266},[243,1506,1507],{"class":260},"    3",[243,1509,1236],{"class":270},[243,1511,1485],{"class":270},[243,1513,1488],{"class":260},[243,1515,1491],{"class":270},[243,1517,1494],{"class":260},[243,1519,1520],{"class":270}," 11:44",[243,1522,1523],{"class":270}," ../\n",[243,1525,1526,1529,1532,1534,1536,1539,1541,1543,1546],{"class":245,"line":349},[243,1527,1528],{"class":266},"-rw-r--r--",[243,1530,1531],{"class":260},"    1",[243,1533,1236],{"class":270},[243,1535,1485],{"class":270},[243,1537,1538],{"class":260},"           562",[243,1540,1491],{"class":270},[243,1542,1494],{"class":260},[243,1544,1545],{"class":270}," 11:45",[243,1547,1548],{"class":270}," config.yaml\n",[243,1550,1551,1554,1556,1558,1560,1563,1565,1567,1570,1573],{"class":245,"line":361},[243,1552,1553],{"class":266},"-rwx------",[243,1555,1531],{"class":260},[243,1557,1236],{"class":270},[243,1559,1485],{"class":270},[243,1561,1562],{"class":260},"      13627544",[243,1564,1491],{"class":270},[243,1566,1494],{"class":260},[243,1568,1569],{"class":270}," 11:54",[243,1571,1572],{"class":270}," opengfw",[243,1574,1575],{"class":260},"*\n",[243,1577,1578,1580,1582,1584,1586,1589,1591,1593,1596],{"class":245,"line":374},[243,1579,1528],{"class":266},[243,1581,1531],{"class":260},[243,1583,1236],{"class":270},[243,1585,1485],{"class":270},[243,1587,1588],{"class":260},"           198",[243,1590,1491],{"class":270},[243,1592,1494],{"class":260},[243,1594,1595],{"class":270}," 13:48",[243,1597,1598],{"class":270}," rule.yaml\n",[243,1600,1601,1603,1606,1608,1610,1613],{"class":245,"line":387},[243,1602,1469],{"class":266},[243,1604,1605],{"class":270}," ./opengfw",[243,1607,666],{"class":260},[243,1609,669],{"class":270},[243,1611,1612],{"class":270}," rule.yaml",[243,1614,346],{"class":253},[243,1616,1617,1620,1623,1625],{"class":245,"line":398},[243,1618,1619],{"class":266},"2025-10-18T18:22:08Z",[243,1621,1622],{"class":270},"    INFO",[243,1624,685],{"class":270},[243,1626,688],{"class":270},[11,1628,1629],{},"اگر با اروری مواجه نشدید، عملکرد فایروال رو میتونید با چیزی مثل curl یا dig (توی خود روتر) چک کنید. با عملکرد صحیح فایروال میتونید نتیجه بگیرید که دستگاه هایی که به این روتر متصل میشن هم از فیلتر مورد نظر شما رد میشن.",[11,1631,1632],{},"ادامه این داستان با شماست.",[1634,1635,1636],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":156,"searchDepth":157,"depth":157,"links":1638},[1639,1640,1644],{"id":187,"depth":157,"text":179},{"id":219,"depth":157,"text":220,"children":1641},[1642,1643],{"id":226,"depth":162,"text":226},{"id":284,"depth":162,"text":285},{"id":835,"depth":157,"text":836},"2025-10-18T00:00:00.000Z","It's time to give power to the people and democratize censorship.","/blog-images/cat.jpg",{},"/opengfw",{"title":179,"description":1646},"01.opengfw",[1653,1654],"linux","firewall","tAmZWXOy3_vv7OWHBEOUbNDP5W3oa69UPR-fJ3ZD80U",1772192624434]