ساخت Linux Router با دو کارت شبکه | IP Forwarding، NAT و…

ساخت Linux Router با دو کارت شبکه | IP Forwarding، NAT و iptables/nftables.
Internet / WAN
                  │
             eth0: DHCP
          192.168.1.50
                  │
          ┌───────────────┐
          │   Linux Router │
          │               │
          │ IP Forwarding │
          │      NAT      │
          └───────────────┘
                  │
             eth1: LAN
             10.10.10.1
                  │
        ┌─────────┴─────────┐
        │                   │
   Client 1              Client 2
10.10.10.10            10.10.10.20
GW: 10.10.10.1         GW: 10.10.10.1

1. تنظیم IP کارت‌های شبکه
فرض کنیم:
ip addr add 192.168.1.50/24 dev eth0
ip addr add 10.10.10.1/24 dev eth1

ip link set eth0 up
ip link set eth1 up

روی سیستم‌های LAN باید Gateway برابر با IP کارت LAN روتر باشه:
Gateway = 10.10.10.1

و DNS هم مثلاً DNS شبکه یا DNS عمومی تنظیم میشه.

2. فعال کردن IP Forwarding
به‌صورت موقت:
sysctl -w net.ipv4.ip_forward=1

بررسی:
cat /proc/sys/net/ipv4/ip_forward

اگر خروجی:
1

باشه، Linux اجازه میده Packetها رو بین Interfaceها Forward کنه.
برای دائمی کردن:
nano /etc/sysctl.conf

این خط رو قرار بده:
net.ipv4.ip_forward=1

بعد:
sysctl -p

3. اضافه کردن Default Route
اگر Gateway اینترنت مثلاً
192.168.1.1

باشه:
ip route add default via 192.168.1.1 dev eth0

بررسی:
ip route

باید چیزی شبیه این ببینی:
default via 192.168.1.1 dev eth0
10.10.10.0/24 dev eth1
192.168.1.0/24 dev eth0

4. NAT با iptables
حالا باید آدرس‌های خصوصی LAN هنگام خروج از Linux Router به WAN، NAT بشن.
ساده‌ترین حالت:
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

یعنی:
هر ترافیکی از شبکه
10.10.10.0/24

که از
eth0

خارج شد، Source IP آن با IP کارت WAN روتر NAT شود.
برای اجازه دادن به Forward:
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

و برای برگشت ترافیک:
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

حالا مسیر کلی میشه:
Client
10.10.10.10
     │
     ▼
Linux Router
10.10.10.1
     │
     │ SNAT/MASQUERADE
     ▼
192.168.1.50
     │
     ▼
Internet

5. NAT دقیقاً چه اتفاقی می‌اندازه؟
فرض کن Client این Packet رو می‌فرسته:
SRC: 10.10.10.10:51520
DST: 8.8.8.8:443

Linux Router هنگام خروج Packet:
SRC: 192.168.1.50:51520
DST: 8.8.8.8:443

یعنی آدرس خصوصی Client از دید Internet دیده نمیشه.
وقتی جواب برمی‌گرده، Connection Tracking لینوکس می‌فهمه این Response متعلق به کدوم Connection داخلیه و Packet رو دوباره به:
10.10.10.10:51520

برمی‌گردونه.

6. همین سناریو با nftables
در سیستم‌های Linux جدید،
nftables

گزینه مدرن‌تری نسبت به iptables محسوب میشه.
اول:
nft add table ip nat

Chain مربوط به POSTROUTING:
nft 'add chain ip nat postrouting { type nat hook postrouting priority 100; }'

قانون NAT:
nft add rule ip nat postrouting oifname "eth0" ip saddr 10.10.10.0/24 masquerade

برای Forward هم میشه یک Table و Chain جدا ساخت:
nft add table inet filter

nft 'add chain inet filter forward { type filter hook forward priority 0; policy drop; }'

اجازه LAN → WAN:
nft add rule inet filter forward iifname "eth1" oifname "eth0" accept

اجازه ترافیک برگشتی:
nft add rule inet filter forward iifname "eth0" oifname "eth1" ct state established,related accept

مشاهده قوانین:
nft list ruleset

نکته مهم
IP Forwarding و NAT دو چیز متفاوتن.
IP Forwarding

میگه:
Linux اجازه داره Packet رو از یک Interface بگیره و از Interface دیگه Forward کنه.

ولی
NAT

میگه:
هنگام عبور Packet، آدرس‌های IP/Port رو طبق Rule تغییر بده.
پس مسیر منطقی اینه:
LAN
│
▼
IP Forwarding
│
▼
Firewall / FORWARD
│
▼
NAT / POSTROUTING
│
▼
WAN
│
▼
Internet

@ITSecurityComputer
❤27🤣11👍1
۱۶ آبان ۱۴۰۵ ۳٫۶ هزار ۹ ۸۷