پرش به محتویات

پرش پورت

کاربران در چین گاهی گزارش می‌دهند که ISPهایشان اتصال‌های UDP پایدار را مسدود یا محدود می‌کنند؛ اما این محدودیت‌ها اغلب فقط به همان پورتی که استفاده می‌شود اعمال می‌شود. «پرش پورت» می‌تواند برای چنین وضعیتی راه‌حل موقتی باشد.

کلاینت

کلاینت Hysteria از قالب ویژهٔ آدرس چندپورته پشتیبانی می‌کند:

example.com:1234,5678,9012 # (1)!
example.com:20000-50000 # (2)!
example.com:1234,5000-6000,7044,8000-9000 # (3)!
  1. چند پورت جدا.
  2. یک بازهٔ پورت.
  3. ترکیب هر دو.

محدودیتی برای تعداد پورت‌هایی که مشخص می‌کنید وجود ندارد.

کلاینت برای اتصال اولیه یکی از پورت‌های مشخص‌شده را به‌صورت تصادفی انتخاب می‌کند و به‌طور دوره‌ای به پورت دیگری جابه‌جا می‌شود. گزینهٔ کنترل فاصلهٔ زمانی در بخش transport است:

transport:
  udp:
    hopInterval: 30s # (1)!
  1. مقدار پیش‌فرض 30s است. حداقل باید 5s باشد.
transport:
  udp:
    minHopInterval: 15s # (1)!
    maxHopInterval: 45s # (2)!
  1. حداقل فاصلهٔ زمانی پرش پورت. حداقل باید 5s باشد.
  2. حداکثر فاصلهٔ زمانی پرش پورت.

هر پرش از فاصلهٔ تصادفی بین minHopInterval و maxHopInterval استفاده می‌کند. این کار الگوی پرش را غیرقابل پیش‌بینی‌تر و کشف آن را دشوارتر می‌کند.

توجه: می‌توانید از hopInterval برای فاصلهٔ ثابت یا از minHopInterval/maxHopInterval برای فاصلهٔ تصادفی استفاده کنید. نمی‌توانید هر دو را همزمان استفاده کنید.

با فرض اینکه سرور روی همهٔ پورت‌هایی که گفتید در دسترس باشد، فرایند پرش برای لایه‌های بالاتر شفاف است و نباید باعث از دست رفتن داده یا قطع اتصال شود.

سرور

بازهٔ پورت داخلی (فقط لینوکس)

در لینوکس، سرور Hysteria از گوش‌دادن روی بازهٔ پورت به‌صورت داخلی پشتیبانی می‌کند. کافی است بازهٔ پورت را در فیلد listen مشخص کنید:

listen: :20000-50000

سرور روی اولین پورت بازه گوش می‌دهد و به‌طور خودکار قوانین فایروال (با استفاده از nftables یا iptables) برای هدایت ترافیک سایر پورت‌ها به پورت اول تنظیم می‌کند. قوانین هنگام خاموش‌شدن سرور به‌طور خودکار پاک می‌شوند.

توجه: نیاز به nft (nftables) یا iptables/ip6tables در سیستم دارد. سرور ممکن است به مجوزهای مناسب (مثلاً root یا CAP_NET_ADMIN) برای تغییر قوانین فایروال نیاز داشته باشد.

تنظیم دستی

معمولاً لازم نیست، اما می‌توانید با DNAT در iptables یا nftables پورت‌ها را به‌صورت دستی هدایت کنید:

# IPv4
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
# IPv6
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
define INGRESS_INTERFACE="eth0"
define PORT_RANGE=20000-50000
define HYSTERIA_SERVER_PORT=443

table inet hysteria_porthopping {
  chain prerouting {
    type nat hook prerouting priority dstnat; policy accept;
    iifname $INGRESS_INTERFACE udp dport $PORT_RANGE counter redirect to :$HYSTERIA_SERVER_PORT
  }
}

در این مثال سرور روی پورت 443 گوش می‌دهد، اما کلاینت می‌تواند به هر پورتی در بازهٔ 20000–50000 وصل شود.