توجيه المنفذ ويُشار إليه أيضًا باسم تعيين المنافذ، وهو طريقة للسماح للأجهزة البعيدة بالاتصال بخدمة معينة داخل شبكتك المحلية الخاصة (LAN). وكما يوحي الاسم، تتضمن العملية توجيه الطلبات الخاصة بمنفذ معين إلى منفذ أو شبكة أخرى. وهي تعدل وجهة الحزمة أثناء انتقالها وتعتبر نوعًا من عمليات ترجمة عناوين الشبكة (NAT) .
يتيح تمكين توجيه المنفذ لتلك الأجهزة أو المضيفين غير المتصلين بالشبكة الداخلية الوصول إلى بعضهم البعض، وهو أمر مقيد بخلاف ذلك عند تعطيله. يمكنك الاستفادة من مزايا توجيه المنفذ لحظر المواقع المستهدفة، وترقية الأمان، وإضافة مسار بديل حول جدار حماية NAT حسب راحتك.
في هذا البرنامج التعليمي، سنرشدك خلال خطوات توجيه المنافذ باستخدام iptables في Linux.
المتطلبات الأساسية
لمتابعة هذا البرنامج التعليمي، ستحتاج إلى:
- تثبيت Ubuntu على نظامك.
- مضيفان يعملان بنظام Ubuntu 20.04 في نفس مركز البيانات مع تمكين الشبكات الخاصة.
- إعداد حساب مستخدم غير جذر (non-root) بصلاحيات sudo في كل جهاز.
تفاصيل المضيف
أولاً، نحتاج إلى معرفة تفاصيل الواجهات والعناوين الخاصة بالخوادم العاملة. دعنا نتحقق من واجهات الشبكة لنظامنا:
|
1 |
ip -4 addr show scope global |
سترى المخرجات التالية:
|
1 2 3 4 5 6 7 8 9 |
نموذج المخرجات 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
هنا، يوضح المخرج المميز واجهتين، الأولى eth0 المخصصة للعنوان 192.51.100.45، والثانية eth1 المخصصة للعنوان 192.168.1.5. ومن بين هاتين الواجهتين، إحداهما عامة والأخرى خاصة. سنقوم بتشغيل أمر للتمييز بينهما، ومعرفة الواجهة العامة، وهي الواجهة المتصلة ببوابتك الافتراضية. للتمييز، اكتب:
|
1 |
ip route show | grep default= |
سترى المخرجات التالية:
|
1 2 3 |
المخرجات: ip route show | grep default |
بيانات وهمية للبرنامج التعليمي
سنستخدم عناوين وتعيينات واجهات وهمية طوال هذا البرنامج التعليمي. أنت حر في استخدام هذه البيانات أو استبدالها، حسب راحتك.
تفاصيل شبكة خادم الويب:
-
عنوان IP العام: 203.0.113.2
-
عنوان IP الخاص: 192.0.2.2
-
الواجهة العامة: eth0
-
الواجهة الخاصة: eth1
تفاصيل شبكة جدار الحماية:
-
عنوان IP العام: 203.0.113.15
-
عنوان IP الخاص: 192.0.2.15
-
الواجهة العامة: eth0
-
الواجهة الخاصة: eth1
إعداد خادم الويب
دعنا نبدأ مع مضيف خادم الويب الخاص بنا. أولاً، قم بتسجيل الدخول باستخدام مستخدم sudo الخاص بك.
تثبيت Nginx
أولاً، سنقوم بـ تثبيت Nginx على مضيف خادم الويب الخاص بنا وإغلاقه بحيث يستمع فقط إلى واجهته الخاصة. سيمكن ذلك خادم الويب الخاص بنا من أن يكون متاحًا فقط إذا قمنا بإعداد توجيه المنفذ بطريقة صحيحة.
بعد ذلك، قم بتحديث ذاكرة التخزين المؤقت للحزم المحلية واستخدم apt لتنزيل Nginx وتثبيته:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
إضافة قيود
بمجرد تثبيت Nginx على مضيف خادم الويب الخاص بنا، سنقوم بإغلاقه لضمان قبوله للمدخلات من الواجهات الخاصة وليس من أي مكان آخر. كما سيضمن ذلك أن تكون خوادم الويب لدينا نشطة فقط إذا كان إعداد توجيه المنفذ صحيحًا.
لإضافة قيود، افتح ملف تكوين كتلة الخادم الافتراضي /etc/nginx/sites-enabled/default على أي محرر نصوص من اختيارك (هنا نستخدم محرر النصوص nano)، واكتب:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
في المخرجات، سترى توجيه listen يظهر مرتين:

في هذا البرنامج التعليمي، نستخدم التوجيه الأول لتوضيح إعادة توجيه IPv4. أما التوجيه الثاني، المهيأ لـ IPv6، فيمكن إزالته. أضف عنوان IP الخاص بخادم الويب الخاص بك متبوعًا بنقطتين رأسيتين قبل الرقم 80 مباشرةً لإعلام Nginx بقبول المدخلات من الواجهة الخاصة فقط. بعد ذلك، قم بتحرير التوجيه:

بمجرد الانتهاء، احفظ الملف وأغلقه. قبل المتابعة، تأكد من عدم وجود أخطاء في بناء الجملة. لنختبر الملف:
|
1 |
sudo nginx -t |

إذا لم يظهر لك أي خطأ، يمكنك إعادة تشغيل Nginx وتمكين التكوين الجديد:
|
1 |
sudo service nginx restart |
التحقق من قيود الشبكة
دعنا نتحقق من مستوى الوصول الذي نمتلكه لخادم الويب الخاص بنا. حاول الوصول إلى خادم الويب باستخدام الواجهة الخاصة باستخدام أمر curl :
|
1 |
curl --connect-timeout 5 192.0.2.2 |
سترى المخرجات التالية:

إذا حاولنا استخدام الواجهة العامة، فلن نتمكن من الاتصال:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
هذا هو بالضبط ما توقعناه.
تكوين جدار الحماية لإعادة توجيه المنفذ 80
دعنا نواصل عملنا من خلال تنفيذ إعادة توجيه المنفذ على جهاز جدار الحماية الخاص بنا.
تمكين إعادة التوجيه في النواة (Kernel)
بشكل افتراضي، تكون ميزة إعادة توجيه المنفذ معطلة (OFF) في معظم الأنظمة. سنقوم بإجراء تغييرات لتفعيلها (ON) من خلال بعض التعديلات. أيضًا، هناك خيار لتفعيل إعادة توجيه المنفذ بشكل دائم باستخدام صلاحيات sudo كما هو موضح في الخطوات القادمة.
لتفعيل إعادة توجيه حركة المرور على مستوى النواة، اكتب:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
لتفعيل إعادة توجيه المنفذ بشكل دائم، قم بتحرير ملف /etc/sysctl.conf . افتح الملف باستخدام صلاحيات sudo واكتب:
|
1 |
sudo nano /etc/sysctl.conf |
في الداخل، ابحث عن السطر الذي يبدو كالتالي وأزل علامة التعليق منه:
|
1 |
net.ipv4.ip_forward=1 |
بمجرد الانتهاء، احفظ الملف وأغلقه. بعد ذلك، استخدم أوامر sysctl لتطبيق التغييرات في الإعدادات لجعلها فعالة:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
إعداد جدار الحماية الأساسي
أولاً، راجع الدليل الخاص بـ كيفية إعداد جدار حماية أساسي على جهازك. عند الانتهاء، سيكون لديك:
- تم تثبيت iptables-persistent
- تم حفظ مجموعة القواعد الافتراضية في /etc/iptables/rules.v4
- معرفة شاملة بإضافة وتعديل القواعد باستخدام أمر iptables command
أيضًا، يمكنك الاطلاع على كيفية سرد وحذف قواعد جدار الحماية iptables.
إضافة قواعد إعادة التوجيه
سنقوم بتكوين جدار الحماية الخاص بنا لضمان أن حركة المرور المتدفقة إلى واجهتنا العامة ( eth0 ) على المنفذ 80 يتم إعادة توجيهها إلى واجهتنا الخاصة ( eth1). بشكل افتراضي، يحتوي جدار الحماية الأساسي لدينا على سلسلة FORWARD تم تعيينها على DROP لحركة المرور. ستسمح إضافة قواعد جدار الحماية بإعادة توجيه الاتصالات إلى خادم الويب الخاص بنا. لمزيد من الأمان، سنقوم بقفل قواعد جدار الحماية للسماح بطلبات إعادة التوجيه فقط.
في سلسلة FORWARD ، سنقبل الاتصالات الجديدة الموجهة إلى المنفذ 80 القادمة من واجهتنا العامة والمتجهة إلى واجهتنا الخاصة. سنحدد الاتصالات الجديدة بمساعدة امتداد conntrack ونمثلها بحزمة TCP SYN :
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
تحتاج إلى السماح بأي حركة مرور لاحقة في كلا الاتجاهين ناتجة عن الاتصال الوارد. اكتب الأوامر أدناه للسماح بحركة المرور من النوع ESTABLISHED و RELATED بين واجهاتنا العامة والخاصة:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Let’s verify if our policy on the FORWARD chain is set to DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Until now, we’ve added a few rules that allow traffic between our public and private interfaces to proceed through our firewall. However, iptables is not yet informed to direct the traffic because firewall rules configuration is yet to be done. In the next steps, we will add the NAT rules and adjust the permanent rule set to direct traffic.
Adding the NAT Rules to Direct Packets
We’ll perform two separate operations in order for iptables to correctly alter the packets, and streamline communication with the clients and the webserver.
DNAT is the first operation that commences the PREROUTING chain of the nat table. The operation alters the packet’s destination address and enables it to be correctly routed as it passes between networks. However, the clients on the public network will be connecting to our firewall server and will have no information about our private network topology. To pass information with the private network, change the destination address of each packet to allow it to correctly reach our destination web server.
It is crucial to note that we’re focusing on configuring port forwarding. Performing NAT on every packing hitting the firewall is not a part of our tutorial. We will match packets at port 80 to our web server’s private IP address:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
The packet will get routed correctly to our web server containing the client’s original address as the source address. Despite attempts made by the server to send the reply directly to that address, there will be no possibility to establish a legitimate TCP connection.
To configure proper routing, we’ll modify the packet’s source address. Let’s edit the source address to our firewall server’s private IP address. After modification, the reply will be sent back to the firewall, which will forward back to the client.
To enable this functionality, add a rule to the POSTROUTING chain of the nat table evaluated right before packets are sent out on the network. Then, match the packets destined for our web server by IP address and port:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
Once this rule is in place, our web server should be accessible by pointing our web browser at our firewall machine’s public address:
|
1 |
curl 203.0.113.15 |
You’ll see the output:

Our port forwarding setup is complete.
Adjust the Permanent Rule Set
After completing the port forwarding setup, we’ll save this to our permanent rule set. If you want to keep the comments in the current rule set, use the iptables-persistent service to save your rules:
|
1 |
sudo service iptables-persistent save |
You can also open it up and edit manually to keep the comments in your file:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Next, configure the filter table and the nat table to add the FORWARD chain rules and ROUTING rules respectively. Adjusting the nat table will allow us to add PREROUTING and POSTROUTING rules as shown in the example below:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/قواعد.v4 *تصفية # السماح بجميع الاتصالات الصادرة، ولكن إسقاط الحزم الواردة والممررة افتراضيًا :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # سلاسل مخصصة لكل بروتوكول :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # حركة مرور UDP المقبولة # حركة مرور TCP المقبولة -A TCP -p tcp --dport 22 -j ACCEPT # حركة مرور ICMP المقبولة # سياسة القبول القياسية -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # إسقاط الحزم غير الصالحة -A INPUT -m conntrack --ctstate INVALID -j DROP # تمرير حركة المرور إلى السلاسل الخاصة بالبروتوكول ## السماح فقط بالاتصالات الجديدة (يجب أن تكون الاتصالات القائمة والمرتبطة قد تمت معالجتها بالفعل) ## بالنسبة لـ TCP، يُسمح بالإضافة إلى ذلك بحزم SYN الجديدة فقط لأنها الطريقة ## الصالحة الوحيدة لإنشاء اتصال TCP جديد -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # رفض أي شيء وصل إلى هذه النقطة ## محاولة تحديد البروتوكول في رسالة الرفض -A INPUT -p udp -j REJECT --reject-مع icmp-منفذ-غير قابل للوصول -A INPUT -p tcp -j REJECT --reject-مع tcp-إعادة تعيين -A INPUT -j REJECT --reject-مع icmp-بروتوكول-غير قابل للوصول # قواعد لتوجيه المنفذ 80 إلى خادم الويب الخاص بنا # تفاصيل شبكة خادم الويب: # * عنوان IP العام: 203.0.113.2 # * عنوان IP الخاص: 192.0.2.2 # * الواجهة العامة: eth0 # * الواجهة الخاصة: eth1 # # تفاصيل شبكة جدار الحماية: # # * عنوان IP العام: 203.0.113.15 # * عنوان IP الخاص: 192.0.2.15 # * الواجهة العامة: eth0 # * الواجهة الخاصة: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # نهاية قواعد تصفية التوجيه (Forward) # حفظ التغييرات COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # قواعد لترجمة الطلبات للمنفذ 80 للواجهة العامة # حتى نتمكن من التوجيه بشكل صحيح إلى خادم الويب باستخدام # الواجهة الخاصة. # تفاصيل شبكة خادم الويب: # * عنوان IP العام: 203.0.113.2 # * عنوان IP الخاص: 192.0.2.2 # * الواجهة العامة: eth0 # * الواجهة الخاصة: eth1 # # تفاصيل شبكة جدار الحماية: # # * عنوان IP العام: 203.0.113.15 # * عنوان IP الخاص: 192.0.2.15 # * الواجهة العامة: eth0 # * الواجهة الخاصة: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --إلى-الوجهة 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --إلى-المصدر 192.0.2.15 # نهاية ترجمات NAT لحركة مرور خادم الويب COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
بعد إضافة القيم المذكورة أعلاه، احفظ الملف وأغلقه. بعد ذلك، اكتب الأمر أدناه لاختبار بناء جملة قواعدك:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
إذا لم تظهر لك أي أخطاء، فقم بتحميل مجموعة القواعد:
|
1 |
sudo service iptables-persistent reload |
دعنا نتحقق من أن خادم الويب الخاص بنا لا يزال متاحًا من خلال عنوان IP العام لجدار الحماية الخاص بك:
|
1 |
curl 203.0.113.15 |
الخاتمة
بنهاية هذا البرنامج التعليمي، يجب أن تكون ملمًا بكيفية توجيه المنافذ على خادم Linux باستخدام iptables. يمكنك الاستفادة من إمكانيات توجيه المنافذ لإخفاء طوبولوجيا شبكتك الخاصة مع تبسيط حركة مرور الخدمة لتتدفق بحرية عبر جهاز جدار حماية البوابة الخاص بك.
بما أن العملية تعتمد بشكل صريح على أمان شبكتك والمنافذ المستخدمة، فهي آمنة. قد تكون هناك احتمالية لوجود مخاطر إذا لم يكن لديك جدار حماية أمني أو أمان VPN على شبكتك. لذلك، يُنصح بتكوين جدار الحماية كما تمت مناقشته في هذا البرنامج التعليمي. نأمل أن يساعدك هذا الدليل في البقاء آمنًا على الإنترنت عند استخدام شبكتك الخاصة.
لمزيد من استكشاف حلول جدران الحماية الأخرى التي يمكنك تنفيذها على نظامك، تحقق من هذه الموارد من مدونتنا:
- تكوين جدار حماية باستخدام UFW على Ubuntu 18.04
- إعداد جدار حماية باستخدام FirewallD على CentOS 7
- أساسيات UFW: تعلم أوامر جدار الحماية الأساسية
حوسبة سعيدة!
التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.