پرش به مطلب اصلی

UdpListener

UdpListener نود سرور UDP است. روی یک آدرس و پورت یا بازه پورت گوش می‌دهد، packetهای ورودی را براساس remote peer گروه‌بندی می‌کند، برای هر peer یک line می‌سازد و payloadها را به نود بعدی می‌فرستد.

جایگاه رایج:

UdpListener -> ... -> UdpConnector

نمونه تنظیم

{
"name": "udp-listener",
"type": "UdpListener",
"settings": {
"address": "0.0.0.0",
"port": [20000, 20100],
"interface": "eth0",
"fwmark": 10,
"balance-group": "udp-public",
"balance-interval": 30000,
"multiport-backend": "socket",
"whitelist": [
"192.168.1.0/24",
"2001:db8::/64"
]
},
"next": "next-node-name"
}

فیلدهای ضروری

فیلدتوضیح
nameنام دلخواه نود
typeباید دقیقا UdpListener باشد
nextنودی که lineها و payloadهای UDP را دریافت می‌کند
settings.addressآدرس bind، مثل 0.0.0.0، :: یا IP مشخص
settings.portیک عدد مثل 5353 یا آرایه دو عضوی مثل [20000, 20100]

در JSON واقعی این دو کلید داخل settings با نام‌های address و port نوشته می‌شوند.

نسخه فعلی بازه پورت را به شکل آرایه دو عضوی می‌خواند، نه string.

تنظیمات اختیاری

گزینهتوضیح
interfaceمحدود کردن socket به interface محلی؛ در Linux از SO_BINDTODEVICE استفاده می‌شود
fwmarksocket mark در سیستم‌هایی که SO_MARK دارند
balance-groupگروه توزیع بین چند listener هم‌پورت
balance-intervalمدت sticky بودن peer در گروه balance، به میلی‌ثانیه
multiport-backendبرای بازه پورت: iptables یا socket
whitelistIP یا CIDRهای مجاز، IPv4 و IPv6
هشدار

در نسخه فعلی سورس، UdpListener مثل TcpListener فیلد whitelist را parse می‌کند، اما blacklist را از JSON نمی‌خواند. configهای قدیمی دارای blacklist را به whitelist یا چند listener جدا تبدیل کنید.

رفتار UDP

UDP اتصال واقعی مثل TCP ندارد، اما UdpListener برای هر remote address/port یک line نگه می‌دارد. نتیجه:

  • packetهای یک peer به همان line فرستاده می‌شوند.
  • پاسخ downstream به همان peer برگشت داده می‌شود.
  • idle peerها بعد از timeout پاک می‌شوند.

مسیر داده:

  • peer به زنجیر: datagram ورودی به upstream payload برای next
  • زنجیر به peer: downstream payload به datagram خروجی برای همان peer

whitelist و balance

"whitelist": [
"10.0.0.0/8",
"203.0.113.10/32",
"2001:db8::/64"
]

اگر whitelist تنظیم شود، فقط peerهای match شده وارد این listener می‌شوند. در سناریوهای چند listener روی یک port، می‌توانید با whitelist مسیر peerهای خاص را جدا کنید.

balance-group برای پخش peerها بین چند listener هم‌پورت استفاده می‌شود. sticky بودن براساس peer انجام می‌شود تا packetهای پشت سر هم یک peer بین چند مسیر پخش نشوند.

نکته‌های عملی

  • برای UDP، کوچک بودن payload و timeoutهای کوتاه‌تر طبیعی است؛ مقدارهای keepalive و idle را با پروتکل واقعی خود هماهنگ کنید.
  • اگر به stateless UDP واقعی بر اساس routing context نیاز دارید، به جای UdpListener نود UdpStatelessSocket را بررسی کنید.
  • برای WireGuard داخل WaterWall معمولا UdpStatelessSocket همسایه مناسب‌تری برای WireGuardDevice است.