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

TcpUdpListener

TcpUdpListener یک wrapper در ابتدای chain است که TcpListener و UdpListener را زیر یک نود جمع می‌کند. با تنظیمات یکسان، یک listener داخلی برای TCP و یکی برای UDP می‌سازد تا یک ورودی WaterWall بتواند هر دو نوع ترافیک را روی address و مجموعه port یکسان بپذیرد.

این نود TCP را به UDP یا UDP را به TCP تبدیل نمی‌کند؛ فقط ترافیک ورودی هر دو adapter را به یک نود بعدی مشترک می‌فرستد.

جایگاه رایج

وقتی یک ورودی باید هم TCP و هم UDP را بپذیرد، از TcpUdpListener استفاده کنید:

TcpUdpListener -> SpeedTestServer
TcpUdpListener -> SniffRouter -> TcpUdpConnector
TcpUdpListener -> Router -> ...

نود بعدی باید توان کار با ترافیک ورودی را داشته باشد. اگر در محیط production هر دو نوع TCP و UDP وارد می‌شوند، نود بعدی باید هم lineهای معمولی TCP و هم lineهای peer در UDP را پشتیبانی کند، یا آن‌ها را بر اساس protocol مسیریابی کند.

نمونه ساده

[
{
"name": "mixed-in",
"type": "TcpUdpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true,
"large-send-buffer": true,
"large-recv-buffer": true
},
"next": "mixed-out"
},
{
"name": "mixed-out",
"type": "TcpUdpConnector",
"settings": {
"address": "127.0.0.1",
"port": 8443,
"reuseaddr": true,
"nodelay": true
}
}
]

در این مثال، TcpListener داخلی ترافیک TCP پورت 443 را می‌فرستد و UdpListener داخلی ترافیک UDP همان پورت را. TcpUdpConnector در انتهای chain با توجه به protocol ثبت‌شده در metadata هر line، خروجی TCP یا UDP را انتخاب می‌کند.

نمونه multiport

{
"name": "mixed-public-entry",
"type": "TcpUdpListener",
"settings": {
"address": "0.0.0.0",
"port": [
443,
8443
],
"nodelay": true,
"large-send-buffer": true,
"large-recv-buffer": true,
"interface": "eth0",
"fwmark": 10,
"balance-group": "public-mixed",
"balance-interval": 30000,
"multiport-backend": "socket",
"whitelist": [
"192.0.2.0/24",
"2001:db8::/64"
],
"blacklist": [
"192.0.2.99/32"
]
},
"next": "next-node"
}

همین فهرست port برای TCP و UDP به کار می‌رود. پورت TCP شماره 443 و پورت UDP شماره 443 دو socket جدا هستند و می‌توانند هم‌زمان bind شوند.

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

فیلدهای سطح بالا:

فیلدنوعتوضیح
namestringنام دلخواه نود. باید داخل فایل config یکتا باشد.
typestringباید دقیقاً "TcpUdpListener" باشد.
settingsobjectتنظیمات مشترک هر دو listener داخلی؛ باید objectی غیرخالی باشد.
nextstringنودی که هم TCP lineها و هم UDP peer lineها را دریافت می‌کند.

فیلدهای ضروری داخل settings:

فیلدنوعتوضیح
addressstringآدرس bind محلی برای هر دو child listener.
port یا port-rangeعدد، آرایه، یا آرایه بازهportهایی که هر دو listener TCP و UDP استفاده می‌کنند. باید دقیقاً یکی از این دو فیلد را بنویسید.

تنظیم پورت

syntax تعریف پورت در TcpUdpListener همان syntax مورد استفاده TcpListener و UdpListener است.

یک پورت

{
"settings": {
"address": "0.0.0.0",
"port": 443
}
}

لیست پورت مشخص

{
"settings": {
"address": "0.0.0.0",
"port": [
443,
8443,
2083
]
}
}

این حالت فقط روی پورت‌های لیست‌شده برای هر دو TCP و UDP گوش می‌دهد.

بازه پیوسته

{
"settings": {
"address": "0.0.0.0",
"port-range": [
40000,
40100
]
}
}

port-range باید یک آرایه دو عضوی باشد: [min, max].

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

چون object یکسان settings به هر دو listener داخلی داده می‌شود، بیشتر گزینه‌ها همان‌هایی هستند که در صفحه‌های TcpListener و UdpListener توضیح داده شده‌اند.

گزینهروی کدام child اثر داردتوضیح
nodelayTCP childفعال‌سازی TCP_NODELAY روی socketهای TCP پذیرفته‌شده.
large-send-bufferTCP و UDP childrenتنظیم SO_SNDBUF در صورت پشتیبانی.
large-recv-bufferTCP و UDP childrenتنظیم SO_RCVBUF در صورت پشتیبانی.
interfaceTCP و UDP childrenمحدود کردن socketها به یک interface محلی در صورت پشتیبانی.
fwmarkTCP و UDP childrenاعمال socket mark به سبک Linux در صورت پشتیبانی.
balance-groupTCP و UDP childrenlistenerهای سازگار و هم‌پورت را برای توزیع sticky در یک گروه قرار می‌دهد.
balance-intervalTCP و UDP childrenمدت حفظ شدن client یا peer تکراری روی یک عضو از balance group.
initial-idle-timeout-msTCP childtimeout اولیه idle قبل از فعالیت payload TCP سمت listener.
active-idle-timeout-msTCP childtimeout idle بعد از شروع فعالیت TCP.
multiport-backendTCP و UDP childrenbackend برای port-range پیوسته: "iptables" یا "socket".
whitelistTCP و UDP childrenIPها و محدوده‌های CIDR مجاز برای client یا peer.
blacklistTCP و UDP childrenIPها و محدوده‌های CIDR مسدود برای client یا peer.

برای جزئیات گزینه‌های socket، پیش‌فرض timeoutها و تنظیمات multiport، به صفحه‌های TcpListener و UdpListener مراجعه کنید.

جریان runtime

هنگام راه‌اندازی، TcpUdpListener دو tunnel داخلی می‌سازد:

  • TcpListener با نامی شبیه <node-name>.tcp-listener
  • UdpListener با نامی شبیه <node-name>.udp-listener

هر دو نود داخلی در chain قرار می‌گیرند و مالک socketهای واقعی و lifecycle مربوط به lineهای خود هستند:

  • TcpListener داخلی socketهای TCP را می‌پذیرد و lineهای TCP را می‌سازد
  • UdpListener داخلی برای peerهای UDP line می‌سازد
  • callbackهای upstream هر دو نود داخلی وارد TcpUdpListener می‌شوند
  • TcpUdpListener callbackهای upstream شامل Init، Payload، Pause، Resume، Est و Finish را به next می‌فرستد

در مسیر downstream، callback نود بعدی به TcpUdpListener می‌رسد. wrapper سپس source protocol ثبت‌شده روی line را بررسی می‌کند:

metadata protocol sourcechild downstream
TCPchild داخلی TcpListener
UDPchild داخلی UdpListener
protocol نامشخص یا flag مبهم TCP/UDPخطای fatal در config یا routing

به همین دلیل، نودهای بعد از TcpUdpListener باید metadata مربوط به source protocol را روی line حفظ کنند.

مالکیت line

TcpUdpListener خودش per-line state ندارد، line نمی‌سازد و lineDestroy() را هم فراخوانی نمی‌کند.

مالکیت هر line در اختیار همان adapter داخلی می‌ماند که آن را ساخته است:

  • TCP lineها متعلق به child داخلی TcpListener هستند
  • UDP peer lineها متعلق به child داخلی UdpListener هستند

متادیتای نود

ویژگیمقدار
Node flagkNodeFlagChainHead
نود قبلیمجاز نیست
نود بعدیلازم است
layer groupkNodeLayer4
required_padding_left0
اندازه line state0

اشتباه‌های رایج

  • از TcpUdpListener به‌عنوان protocol converter استفاده نکنید؛ هر دو protocol را می‌پذیرد، اما یکی را به دیگری تبدیل نمی‌کند.
  • آن را به نود بعدی که فقط TCP را می‌فهمد وصل نکنید اگر ترافیک UDP هم ممکن است بیاید.
  • نمی‌توان برای TCP و UDP دو مجموعه port متفاوت روی این wrapper تعریف کرد؛ هر دو listener همان settings را دریافت می‌کنند.
  • metadata مربوط به source protocol را پیش از بازگشت callbackهای downstream به این نود حذف یا خراب نکنید.