শুধুমাত্র WireGuard-এর ব্যক্তিগত নেটওয়ার্কের জন্য অনুমোদিত ওয়েবসাইট হোস্ট

8 min

language: ja bn en es hi pt ru zh-cn zh-tw

হ্যালো, আমি অযোগ্য।
অ্যাডমিন পৃষ্ঠা সর্বজনীনভাবে প্রকাশ করা ভালো নয়, তবে আমার ক্ষেত্রে, আমি বর্তমানে অ্যাডমিন পৃষ্ঠার জন্য শুধুমাত্র WireGuard-এর ব্যক্তিগত IP-গুলি অনুমোদন করি। এটি কিভাবে সেট আপ করতে হয় তার একটি গাইড।

WireGuard-এর দিকের সেটিংস

এর মানে হল যে একাধিক ক্লায়েন্ট ব্যবহার করা হচ্ছে।

ক্লায়েন্ট সাইড

এই ক্ষেত্রে, wg0-এর জন্য, AllowedIPs = 0.0.0.0/0, ::/0, তাই সমস্ত ট্র্যাফিক WireGuard নেটওয়ার্কের মধ্য দিয়ে যায়।
তবে, এই ক্ষেত্রে, সার্ভার সাইডে 10.1.0.22-এর জন্য NAT রুল যোগ করতে হবে। কারণ অন্যথায়, এই IP WireGuard-এর ব্যক্তিগত নেটওয়ার্ক থেকে বের হতে পারবে না
সংক্ষেপে, এটি দেখতে এরকম:

  • wg0
    • সমস্ত নেটওয়ার্কের মধ্য দিয়ে যায়
    • অভ্যন্তরীণ DNS-কে জিজ্ঞাসা করে
    • WireGuard সার্ভার সাইডে NAT রুল যোগ না করলে বের হতে পারবে না
  • wg1
    • শুধুমাত্র WireGuard-এর ব্যক্তিগত IP-গুলি রাউট করে
      • শুধুমাত্র 10.1.0.0/24 CIDR রেঞ্জের মধ্যে দিয়ে যায়
    • অভ্যন্তরীণ DNS-কে জিজ্ঞাসা করে

wg0.conf :

[Interface]
PrivateKey = Client Private Key
Address = 10.1.0.22/24
DNS = 10.1.0.1

[Peer]
PublicKey = Server PubKey
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = WireGuard Server Endpoint:51820
PreSharedKey = PreSharedKey

wg1.conf :

[Interface]
PrivateKey = Client Private Key
Address = 10.1.0.21/24
DNS = 10.1.0.1

[Peer]
PublicKey = Server PubKey
AllowedIPs = 10.1.0.0/24
Endpoint = WireGuard Server Endpoint:51820
PreSharedKey = PreSharedKey

সার্ভার সাইড

[Interface]
ListenPort = 51820
Address = 10.1.0.1/24
PrivateKey = Server PrivKey

~~~

[Peer]
PublicKey = Client PubKey
PreSharedKey = PreSharedKey
AllowedIPs = 10.1.0.21/32
PersistentKeepalive = 25

[Peer]
PublicKey = Client PubKey
PreSharedKey = PreSharedKey
AllowedIPs = 10.1.0.22/32
PersistentKeepalive = 25

এটি দেখতে এরকম।

WireGuard সার্ভার সাইডের NAT রুল

এটি একটি BSD-ভিত্তিক বিশেষাধিকার, তবে আমরা pf ব্যবহার করে NAT রুল লিখব।

# ভেরিয়েবল সংজ্ঞা
wireguard_clients="{ 10.1.0.4, 10.1.0.22 }"
wanint="vtnet0"
wg_ports="{51820}"

# $wireguard_clients থেকে আসা ট্র্যাফিককে WAN ইন্টারফেস ($wanint)-এর IP-তে পরিবর্তন করে ইন্টারনেটে পাঠায়
# NAPT সেটিংস
nat on $wanint inet from $wireguard_clients to any -> $wanint

# বাইরে থেকে WAN-এ আসা WireGuard সংযোগ (UDP 51820) অনুমোদন করে
pass in on $wanint proto udp from any to $wanint port $wg_ports

এর মাধ্যমে, WireGuard-এর ব্যক্তিগত IP নিজেই WireGuard সার্ভার সাইডের NAT-এর মধ্য দিয়ে যেতে পারবে।

Nginx সেটিংস

a.soulminingrig.com হল এই সাইটের LumeCMS-এর অ্যাডমিন পৃষ্ঠার সেটিংস।
allow 10.1.0.0/16; দিয়ে শুধুমাত্র WireGuard নেটওয়ার্ককে অনুমতি দেওয়া হয় এবং অন্য সব deny all; করা হয়।

server {
    listen 80;
    server_name a.soulminingrig.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name a.soulminingrig.com;
    client_max_body_size 500M;

    location / {
        allow 10.1.0.0/16;
	    deny all;

        proxy_pass http://10.1.0.20:3001/;
        include proxy_headers.conf;
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504 http_403 http_404;
        proxy_connect_timeout 3s;
        proxy_read_timeout 15s;
    }
    include common_error_pages.conf;
    include ssl_common.conf;

    ssl_certificate /usr/local/etc/letsencrypt/live/a.soulminingrig.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /usr/local/etc/letsencrypt/live/a.soulminingrig.com/privkey.pem; # managed by Certbot
}

কেন NAT রুল লেখা সত্ত্বেও WireGuard সার্ভার সাইডের পাবলিক IP হিসাবে স্বীকৃত না হয়ে IP সীমাবদ্ধতা প্রয়োগ করা যায়?

এই প্রশ্নটি থাকতে পারে।
(আমি নিজে তৈরি করেছি)

NAT রুলে এটি লেখা আছে:

nat on $wanint inet from $wireguard_clients to any -> $wanint

এর মানে হল, on $wanint মানে হল শুধুমাত্র WAN ইন্টারফেসের মধ্য দিয়ে যাওয়া প্যাকেটগুলিতে NAT প্রয়োগ করা হয়
এটি কিছুটা জটিল, তবে বোঝার সুবিধার জন্য, আসুন ifconfig ব্যবহার করি।

vtnet0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=4c079b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,TXCSUM_IPV6>
        ether aa
        inet aa netmask 0xfffffe00 broadcast aa
        inet6 aa prefixlen 64 scopeid 0x1
        inet6 aa prefixlen 64
        media: Ethernet autoselect (10Gbase-T <full-duplex>)
        status: active
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
pflog0: flags=0 metric 0 mtu 33152
        options=0
        groups: pflog
wg0: flags=10080c1<UP,RUNNING,NOARP,MULTICAST,LOWER_UP> metric 0 mtu 1420
        options=80000<LINKSTATE>
        inet 10.1.0.1 netmask 0xffffff00
        groups: wg
        nd6 options=109<PERFORMNUD,IFDISABLED,NO_DAD>

হ্যাঁ, WireGuard একটি ভার্চুয়াল NIC, তাই WireGuard-এর ইন্টারফেস হল wg0
এই ক্ষেত্রে, এটি wg0-এর মধ্য দিয়ে আসে, তাই যদি proxy_pass 10.1.0.20:3001 হয়, তবে প্যাকেটগুলি এই ভার্চুয়াল NIC-এর মাধ্যমে যাবে।
10.1.0.22 -> allow 10.1.0.0/16 (10.1.0.0 থেকে 10.1.255.255) রুলে মিলে যায় -> Nginx-এর proxy_pass হল 10.1.0.20, তাই এটি ব্যক্তিগত নেটওয়ার্কের মধ্যেই সম্পন্ন হয়।
এই সময়ে, wg0-এর ভার্চুয়াল NIC-এর মধ্যে সবকিছু সম্পন্ন হয়, তাই এই ব্যক্তিগত যোগাযোগ সম্ভব।

উপসংহার

তো, কেমন লাগল?
সত্যি বলতে, আমি ব্যক্তিগতভাবে GNU/Linux-এর রুল লেখা পছন্দ করি না, তাই BSD-ভিত্তিক pf এই অর্থে অনেক সহজ...
তাহলে আবার দেখা হবে। ধন্যবাদ।

Related Posts