هل هناك طريقة غير الجذر عمليات ربط "مميزة" الموانئ على لينكس ؟

StackOverflow https://stackoverflow.com/questions/413807

سؤال

أنه أمر مزعج جدا أن يكون هذا القيد على التنمية بلدي مربع ، عندما يكون هناك لن يكون أي من المستخدمين الآخرين من لي.

أنا على علم معيار الحلول, ولكن أيا منها لا تفعل بالضبط ما أريد:

  1. authbind (النسخة في دبيان الاختبارية, 1.0, يدعم فقط IPv4)
  2. باستخدام إيبتبلس توجيه الهدف توجيه منخفض ميناء إلى ميناء (و "نات" الجدول لم تنفذ حتى الآن عن ip6tables ، IPv6 نسخة من إيبتبلس)
  3. سودو (تشغيل الجذر هو ما أحاول تجنب)
  4. سيلينو (أو ما شابه).(هذا هو مجرد بلدي ديف مربع ، أنا لا أريد أن أقدم الكثير من تعقيد إضافي.)

هناك بعض بسيطة sysctl متغير للسماح غير الجذر عمليات ربط "مميزة" منافذ (موانئ أقل من 1024) على لينكس أم أنا فقط من الحظ ؟

تحرير:في بعض الحالات, يمكنك استخدام قدرات أن تفعل هذا.

هل كانت مفيدة؟

المحلول

حسنا, شكرا للشعب الذي أشار إلى قدرات النظام CAP_NET_BIND_SERVICE القدرة.إذا كان لديك مؤخرا النواة ، هو في الواقع من الممكن استخدام هذا إلى بدء تشغيل خدمة غير الجذر ولكن ربط انخفاض الموانئ.الجواب القصير هو أن تفعل:

setcap 'cap_net_bind_service=+ep' /path/to/program

ثم في أي وقت program يتم بعد ذلك سوف يكون CAP_NET_BIND_SERVICE القدرة. setcap هو في حزمة دبيان libcap2-bin.

الآن المحاذير:

  1. سوف تحتاج على الأقل 2.6.24 النواة
  2. هذا لن يعمل إذا كان الملف النصي.(أي يستخدم #!خط لإطلاق مترجم).في هذه الحالة, كما الآن أنا أفهم عليك تطبيق القدرة على المترجم للتنفيذ نفسها ، والتي بالطبع هو كابوسا أمنيا ، لأن أي برنامج باستخدام مترجم لديهم القدرة.لم أكن قادرة على العثور على أي النظيفة, طريقة سهلة للتغلب على هذه المشكلة.
  3. لينكس تعطيل LD_LIBRARY_PATH على أي program التي لديها امتيازات مرتفعة مثل setcap أو suid.حتى إذا كان الخاص بك program يستخدم .../lib/, قد تحتاج إلى النظر في خيار آخر مثل ميناء الشحن.

الموارد:

ملاحظة: RHEL أول وأضاف في هذا v6.

نصائح أخرى

الطريقة القياسية هو لجعلها "وsetuid" بحيث تبدأ كجذر ، ثم يرمون التي امتياز الجذر بمجرد متجهة إلى ميناء ولكن قبل أن تبدأ قبول اتصالات إلى ذلك.يمكنك أن ترى أمثلة جيدة على ذلك في التعليمات البرمجية المصدر لـ اباتشي INN.أنا قلت أن Lighttpd هو مثال جيد آخر.

مثال آخر هو Postfix ، والذي يستخدم عدة الشياطين أن التواصل من خلال أنابيب ، فقط واحد أو اثنين منهم (التي تفعل سوى القليل جدا إلا قبول أو تنبعث منها بايت) تعمل بمثابة الجذر والباقي تشغيل أقل امتياز.

يمكنك أن تفعل منفذ إعادة توجيه.هذا هو ما أقوم به من أجل Silverlight سياسة خادم يعمل على لينكس مربع

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300

يمكنك إعداد المحلية نفق SSH, على سبيل المثال إذا كنت تريد المنفذ 80 لتصل إلى التطبيق الخاص بك لا بد أن 3000:

sudo ssh $USERNAME@localhost -L 80:localhost:3000 -N

هذا له ميزة العمل مع البرنامج النصي ملقمات كونها بسيطة جدا.

أو تصحيح kernel الخاص بك و إزالة الاختيار.

(خيار أخير ، غير مستحسن).

في net/ipv4/af_inet.c, إزالة اثنين من خطوط قراءة

      if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
              goto out;

و النواة لن تفحص المنافذ مميزة بعد الآن.

الملف قدرات ليست مثالية ، لأنها يمكن أن تكسر بعد حزمة التحديث.

الحل المثالي ، IMHO ، يجب أن تكون القدرة على المحارة مع للتوريث CAP_NET_BIND_SERVICE تعيين.

هنا هو إلى حد ما معقد طريقة للقيام بذلك:

sg $DAEMONUSER "capsh --keep=1 --uid=`id -u $DAEMONUSER` \
     --caps='cap_net_bind_service+pei' -- \
     YOUR_COMMAND_GOES_HERE"

capsh الأداة المساعدة يمكن العثور عليها في libcap2 بن الحزمة في Debian/Ubuntu التوزيعات.هذا ما ينطبق على:

  • sg التغييرات فعالة معرف المجموعة إلى أن من الشيطان المستخدم.هذا ضروري لأن capsh يترك GID دون تغيير ونحن بالتأكيد لا تريد ذلك.
  • مجموعات قليلا 'الحفاظ على قدرات على تغيير UID'.
  • التغييرات UID إلى $DAEMONUSER
  • يسقط كل قبعات (في هذه اللحظة كل قبعات لا تزال موجودة بسبب --keep=1) إلا القابلة للتوريث cap_net_bind_service
  • ينفذ الأوامر الخاص بك ('--' هو فاصل)

والنتيجة هي عملية تحديد المستخدمين والمجموعات ، cap_net_bind_service امتيازات.

كمثال, خط من ejabberd بدء تشغيل البرنامج النصي:

sg $EJABBERDUSER "capsh --keep=1 --uid=`id -u $EJABBERDUSER` --caps='cap_net_bind_service+pei' -- $EJABBERD --noshell -detached"

اثنين بسيطة أخرى احتمالات:

هناك مثل قديم (عصري) حل "الخفي الذي يربط على انخفاض ميناء يد التحكم الخاصة بك شيطان".هذا يسمى inetd (أو xinetd).السلبيات هي:

  • الخفي الخاص يحتاج إلى الكلام على المدخل/المخرج المعياري (إذا كنت لا تحكم الشيطان -- إذا لم يكن لديك مصدر-ثم ربما هذا هو رقصة, على الرغم من أن بعض الخدمات قد inetd-التوافق العلم)
  • جديد عملية الخفي هو متشعب عن كل اتصال
  • انها واحدة إضافية حلقة في سلسلة

الايجابيات:

  • تتوفر على أي UNIX
  • مرة من مسؤول النظام sysadmin أنشأت التكوين, كنت جيدة للذهاب حول تطوير الخاص بك (عند إعادة بناء الخفي ، قد تفقد setcap القدرات ؟ ثم عليك أن تذهب مرة أخرى إلى المشرف "من فضلك يا سيدي...")
  • الشيطان لا داعي للقلق حول هذا الاشياء الشبكات فقط أن نتحدث على المدخل/stdout
  • يمكن تكوين لتنفيذ الخفي غير المستخدم الجذر ، كما طلبت

بديل آخر:اخترق المتابعة الوكيل (netcat أو حتى شيء أكثر قوة) من متميز الميناء إلى بعض التعسفي عالية مرقمة الميناء حيث يمكنك تشغيل الخاص بك الهدف الخفي.(Netcat من الواضح ليس حلا الإنتاج ، ولكن "فقط ديف مربع", أليس كذلك؟).بهذه الطريقة يمكنك الاستمرار في استخدام شبكة قادر على نسخة من الخادم الخاص بك, سوف تحتاج فقط الجذر/سودو لبدء الوكيل (في التمهيد), لن يكون الاعتماد على مجمع/قد تكون هشة القدرات.

بلدي "القياسية" الحل البديل يستخدم socat باسم المستخدم الفضاء معيد التوجيه:

socat tcp6-listen:80,fork tcp6:8080

حذار أن هذا لن الحجم ، التفرع مكلفة لكنها طريقة socat يعمل.

تحديث 2017:

استخدام authbind


أفضل بكثير من CAP_NET_BIND_SERVICE أو نواة مخصصة.

  • CAP_NET_BIND_SERVICE منح الثقة الثنائية ولكن لا يوفر التحكم في ميناء الوصول.
  • Authbind منح الثقة المستخدم/المجموعة و يوفر التحكم في ميناء الوصول ، يدعم كل من IPv4 و IPv6 (IPv6 تمت إضافة دعم اعتبارا من أواخر).

    1. تثبيت: apt-get install authbind

    2. تكوين الوصول إلى ذات الصلة الموانئ على سبيل المثال80 و 443 لجميع المستخدمين والمجموعات:

      سودو touch /etc/authbind/byport/80
      سودو touch /etc/authbind/byport/443
      sudo chmod 777 /etc/authbind/byport/80
      sudo chmod 777 /etc/authbind/byport/443

    3. تنفيذ الأوامر الخاص بك عن طريق authbind
      (اختياريا تحديد --deep أو غيرها من الحجج ، راجع صفحة):

      authbind --deep /path/to/binary command line args
      

      على سبيل المثال

      authbind --deep java -jar SomeServer.jar
      

كما متابعة جوشوا رائع (=لا ينصح إلا إذا كنت تعرف ماذا تفعل) التوصية هاك النواة:

كنت أول من نشر ذلك هنا.

بسيطة.العادي أو القديم النواة ، لا.
كما أشار إلى الآخرين ، إيبتبلس يمكن توجيه منفذ.
كما أشار أيضا إلى الآخرين ، CAP_NET_BIND_SERVICE يمكن أيضا القيام بهذه المهمة.
بالطبع CAP_NET_BIND_SERVICE سوف تفشل إذا قمت بتشغيل البرنامج من سيناريو ، إلا إذا وضع الغطاء على قذيفة مترجم, التي لا طائل يمكنك فقط وكذلك تشغيل الخدمة كما هو الجذر...
على سبيل المثالجافا, يمكنك تطبيقه على الجافا JVM

sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/lib/jvm/java-8-openjdk/jre/bin/java

ومن الواضح أن ذلك يعني أي برنامج جافا يمكن ربط نظام الموانئ.
ديتو أحادي/.صافي.

أنا أيضا متأكد من xinetd ليس أفضل الأفكار.
ولكن بما أن كلا من الأساليب الخارقة, لماذا لا مجرد رفع الحد من رفع القيد ؟
وقال أحد لديك لتشغيل العادي النواة ، لذا يمكنك فقط تشغيل الخاص بك.

يمكنك تحميل فقط مصدر للحصول على أحدث نواة (أو نفس لديك حاليا).بعد ذلك تذهب إلى:

/usr/src/linux-<version_number>/include/net/sock.h:

هناك كنت ابحث عن هذا السطر

/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK       1024

وتغييره إلى

#define PROT_SOCK 0

إذا كنت لا تريد أن يكون غير الآمنة ssh الحالة ، يمكنك تغيير هذا إلى:#تعريف PROT_SOCK 24

عموما, كنت استخدم أدنى الإعداد التي تحتاج إليها ، هـ.ز 79 http أو 24 عند استخدام SMTP على المنفذ 25.

بالفعل كل شيء.
النواء ، و تثبيته.
إعادة تشغيل الكمبيوتر.
انتهى - الغبي هذا الحد ذهب ، وأن يعمل أيضا على البرامج النصية.

هنا هو كيف يمكنك تجميع النواة:

https://help.ubuntu.com/community/Kernel/Compile

# You can get the kernel-source via package linux-source, no manual download required
apt-get install linux-source fakeroot

mkdir ~/src
cd ~/src
tar xjvf /usr/src/linux-source-<version>.tar.bz2
cd linux-source-<version>

# Apply the changes to PROT_SOCK define in /include/net/sock.h

# Copy the kernel config file you are currently using
cp -vi /boot/config-`uname -r` .config

# Install ncurses libary, if you want to run menuconfig
apt-get install libncurses5 libncurses5-dev

# Run menuconfig (optional)
make menuconfig

# Define the number of threads you wanna use when compiling (should be <number CPU cores> - 1), e.g. for quad-core
export CONCURRENCY_LEVEL=3
# Now compile the custom kernel
fakeroot make-kpkg --initrd --append-to-version=custom kernel-image kernel-headers

# And wait a long long time

cd ..

باختصار, استخدام إيبتبلس إذا كنت ترغب في البقاء آمنة ، النواء إذا كنت تريد أن تكون متأكد من أن هذا التقييد لا يزعجك مرة أخرى.

لينكس يدعم قدرات لدعم المزيد من غرامة الحبيبات من أذونات فقط "هذا التطبيق هو تشغيل الجذر".واحدة من تلك القدرات CAP_NET_BIND_SERVICE وهي عبارة عن ملزمة مميزة ميناء (<1024).

للأسف أنا لا أعرف كيفية استغلال هذا إلى تشغيل تطبيق غير الجذرية في حين لا يزال يعطيها CAP_NET_BIND_SERVICE (ربما باستخدام setcap, لكن لا بد أن يكون الحل الموجود في هذا).

أعرف أن هذا هو السؤال القديم, ولكن الآن مع الأخيرة (>= 4.3) حبات هناك أخيرا إجابة جيدة على هذا المحيطة القدرات.

الجواب السريع هو أن الاستيلاء على نسخة من أحدث (أنها-مع ذلك-غير منشورة) نسخة من libcap من بوابة وترجمة ذلك.نسخ الناتج progs/capsh الثنائية في مكان ما (/usr/local/bin هو خيار جيد).ثم كجذر ، بدء البرنامج الخاص بك مع

/usr/local/bin/capsh --keep=1 --user='your-service-user-name' \
    --inh='cap_net_bind_service' --addamb='cap_net_bind_service' \ 
    -- -c 'your-program'

من أجل, نحن

  • معلنا أننا عندما تبديل المستخدمين, نحن نريد أن نحافظ على القدرة الحالية مجموعات
  • تبديل المستخدم & المجموعة 'الخاص بك-خدمة-user-name'
  • إضافة cap_net_bind_service القدرة الموروثة & المحيطة مجموعات
  • التفرع bash -c 'your-command' (منذ capsh يبدأ تلقائيا باش مع الحجج بعد --)

هناك الكثير يجري تحت غطاء محرك السيارة هنا.

أولا, نحن تشغيل الجذر ، حتى افتراضيا ، نحصل على مجموعة كاملة من قدرات.المدرجة في هذا هو القدرة على التبديل uid & gid مع setuid و setgid syscalls.ومع ذلك ، عادة عند برنامج يفعل هذا, فإنه يفقد مجموعة من قدرات هذا غير أن الطريقة القديمة من اسقاط الجذر مع setuid لا يزال يعمل.على --keep=1 العلم يقول capsh إصدار prctl(PR_SET_KEEPCAPS) syscall ، مما يؤدي إلى تعطيل إسقاط قدرات عند تغيير المستخدم.تغيير الفعلي من المستخدمين عن طريق capsh يحدث مع --user العلم الذي يعمل setuid و setgid.

المشكلة القادمة نحن بحاجة إلى حل هو كيفية تعيين قدرات بطريقة يحمل على بعد exec أطفالنا.قدرات النظام دائما كان " ورث "مجموعة من القدرات التي هي" مجموعة من القدرات الحفاظ عليها عبر execve(2)" [قدرات(7)].في حين أن هذا يبدو وكأنه يحل مشكلتنا (مجرد مجموعة cap_net_bind_service القدرة الموروثة, أليس كذلك؟) ، هذا الواقع لا ينطبق إلا على شرف العمليات و العملية ليست متميزة بعد الآن لأننا بالفعل تغيير المستخدم (مع --user العلم).

الجديدة المحيطة القدرة على تعيين يعمل حول هذه المشكلة - هو "مجموعة من القدرات التي يتم الحفاظ عليها عبر execve(2) من برنامج غير متميز." عن طريق وضع cap_net_bind_service في المحيط مجموعة, عندما capsh exec هو الخادم البرنامج البرنامج سوف ترث هذه القدرة تكون قادرة على ربط المستمعين إلى انخفاض الموانئ.

إذا كنت مهتما لمعرفة المزيد, قدرات دليل الصفحة يشرح هذا بالتفصيل.تشغيل capsh من خلال strace هو أيضا مفيدة للغاية!

TLDR:في "الإجابة" (كما أرى) ، والقفز إلى أسفل إلى >>TLDR<< في هذه الإجابة.

حسنا ، لقد اكتشفت ذلك (هذه المرة), الجواب على هذا السؤال و هذا الجواب من الألغام هو أيضا وسيلة الاعتذار عن تعزيز جواب آخر (سواء هنا أو على تويتر) أعتقد بأنه كان "أفضل" ، ولكن بعد محاولة اكتشف أنه كان مخطئا بشأن ذلك.اتعلم من خطأي الاطفال:لا تشجع شيء حتى كنت قد جربت ذلك بنفسك!

مرة أخرى, لقد راجعت كل الإجابات هنا.لقد حاولت بعض منهم (واختار عدم محاولة الآخرين لأنني ببساطة لا تحب الحلول).أعتقد أن الحل هو استخدام systemd مع Capabilities= و CapabilitiesBindingSet= الإعدادات.بعد مصارعة مع هذا لبعض الوقت ، اكتشفت أن هذا ليس هو الحل لأن:

قدرات تهدف إلى تقييد عمليات الجذر!

كما OP بحكمة وذكر, دائما الأفضل تجنب ذلك (على جميع الشياطين إذا كان ذلك ممكنا!).

لا يمكنك استخدام القدرات ذات الصلة الخيارات User= و Group= في systemd وحدة الملفات, لأن قدرات دائما إعادة تعيين عند execev (أو أيا كان في وظيفة) يسمى.وبعبارة أخرى, عندما systemd والشوك قطرات التجاعيد, قدرات إعادة تعيين.لا توجد وسيلة حول هذا ، كل ذلك ملزمة المنطق في النواة الأساسية حول uid=0 وليس من القدرات.وهذا يعني أنه من غير المحتمل أن القدرات سوف يكون من أي وقت مضى الجواب الصحيح على هذا السؤال (على الأقل في أي وقت قريب).بالمناسبة ، setcap, كما ذكر آخرون ليس الحل.لم يكن العمل بالنسبة لي, أنها لا تعمل بشكل جيد مع النصوص ، وتلك هي إعادة تعيين على أي حال كلما التغييرات الملف.

في الهزيلة الدفاع فعلت الدولة (في التعليق لقد حذف الآن) ، جيمس إيبتبلس اقتراح (التي OP يذكر أيضا) ، "2 أفضل حل".:-P

>>TLDR<<

الحل هو الجمع بين systemd مع on-the-fly iptables الأوامر من هذا القبيل (مأخوذة من DNSChain):

[Unit]
Description=dnschain
After=network.target
Wants=namecoin.service

[Service]
ExecStart=/usr/local/bin/dnschain
Environment=DNSCHAIN_SYSD_VER=0.0.1
PermissionsStartOnly=true
ExecStartPre=/sbin/sysctl -w net.ipv4.ip_forward=1
ExecStartPre=-/sbin/iptables -D INPUT -p udp --dport 5333 -j ACCEPT
ExecStartPre=-/sbin/iptables -t nat -D PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
ExecStartPre=/sbin/iptables -A INPUT -p udp --dport 5333 -j ACCEPT
ExecStartPre=/sbin/iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
ExecStopPost=/sbin/iptables -D INPUT -p udp --dport 5333 -j ACCEPT
ExecStopPost=/sbin/iptables -t nat -D PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
User=dns
Group=dns
Restart=always
RestartSec=5
WorkingDirectory=/home/dns
PrivateTmp=true
NoNewPrivileges=true
ReadOnlyDirectories=/etc

# Unfortunately, capabilities are basically worthless because they're designed to restrict root daemons. Instead, we use iptables to listen on privileged ports.
# Capabilities=cap_net_bind_service+pei
# SecureBits=keep-caps

[Install]
WantedBy=multi-user.target

هنا علينا أن ننجز ما يلي:

  • الشيطان يستمع 5333 ، ولكن اتصالات بنجاح قبول 53 بفضل iptables
  • نحن يمكن أن تشمل الأوامر في الوحدة الملف نفسه ، وبالتالي ننقذ الناس من الصداع. systemd ينظف قواعد جدار الحماية لنا التأكد من إزالتها عند الشيطان لا يعمل.
  • و الجذرية و نجعل امتياز التصعيد المستحيل (على الأقل systemd يدعي) ، يفترض حتى لو كان الشيطان هو اختراق مجموعات uid=0.

iptables لا يزال للأسف جدا قبيحة و يصعب استخدام الأداة المساعدة.إذا كان الشيطان هو الاستماع على eth0:0 بدلا من eth0, على سبيل المثال الأوامر مختلفة قليلا.

systemd هو sysvinit استبدال الذي لديه خيار لإطلاق الشيطان مع قدرات محددة.خيارات وقدرات=, CapabilityBoundingSet= في systemd.exec(5) manpage.

منفذ إعادة توجيه أكثر منطقية بالنسبة لنا, ولكن واجهتنا مشكلة حيث طلبنا حل url محليا أن هناك حاجة أيضا إلى إعادة توجيهها;(هذا يعني أنك الحفلة).

هذا وسوف تسمح لك أيضا أن يتم إعادة توجيهك عند الوصول إلى عنوان url على الجهاز المحلي.

iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A OUTPUT -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

لسبب لا أحد يذكر عن خفض sysctl صافي.ipv4.ip_unprivileged_port_start إلى القيمة التي تحتاج إليها.على سبيل المثال:نحن بحاجة إلى ربط التطبيق لدينا على المنفذ 443.

sysctl net.ipv4.ip_unprivileged_port_start=443

قد يقول البعض هناك مشكلة أمنية محتملة:للمحرومين المستخدمين الآن قد ربط متميزة أخرى الموانئ (444-1024).ولكن يمكنك حل هذه المشكلة بسهولة مع إيبتبلس ، من خلال منع منافذ أخرى:

iptables -I INPUT -p tcp --dport 444:1024 -j DROP
iptables -I INPUT -p udp --dport 444:1024 -j DROP

مقارنة مع الطرق الأخرى.هذا الأسلوب:

  • من النقطة (المنظمة البحرية الدولية) أكثر أمانا من وضع CAP_NET_BIND_SERVICE/وsetuid منذ تطبيق لا وsetuid في كل شيء ، حتى جزئيا (قدرات هي في الواقع).على سبيل المثال, للقبض على coredump من القدرة على تمكين التطبيق سوف تحتاج إلى تغيير sysctl fs.suid_dumpable (مما يؤدي إلى آخر المشاكل الأمنية المحتملة) أيضا ، عندما كاب/suid تعيين /proc/PID دليل يملكها الجذر لذا الخاص بك غير الجذر المستخدم ليس لديه معلومات كاملة/التحكم في عملية تشغيل, على سبيل المثال, المستخدم لن يكون قادرا (في حالة مشتركة) لتحديد أي اتصالات تنتمي إلى التطبيق عبر /proc/PID/fd/ (netstat-شبكة أخبار تلفزيون أسوشييتدبرس | grep PID).
  • وقد الأمنية العيب:في حين أن التطبيق الخاص بك (أو أي التطبيق الذي يستخدم المنافذ 443-1024) هو أسفل لسبب آخر التطبيق يمكن أن تأخذ الميناء.ولكن هذه المشكلة يمكن أن تطبق أيضا على غطاء/suid (في حالة وضعها على مترجم, على سبيل المثالجافا/nodejs) و إيبتبلس-إعادة توجيه.استخدام systemd-مأخذ طريقة لاستبعاد هذه المشكلة.استخدام authbind طريقة للسماح فقط مستخدم خاص ملزمة.
  • لا يتطلب وضع غطاء/suid في كل مرة تقوم بنشر نسخة جديدة من التطبيق.
  • لا تتطلب دعم التطبيقات/تعديل مثل systemd-مأخذ الأسلوب.
  • لا تتطلب نواة بناء (إذا كنت تقوم بتشغيل الإصدار يدعم هذا sysctl الإعداد)
  • لا LD_PRELOAD مثل authbind/privbind الأسلوب هذا يمكن أن يؤثر على الأداء والأمن السلوك (أليس كذلك ؟ لم تختبر).في بقية authbind هو حقا مرنة وآمنة.
  • الإفراط يؤدي إيبتبلس إعادة توجيه/DNAT الأسلوب لأنه لا يتطلب ترجمة عنوان اتصال تتبع الدولة ، وما إلى ذلك.هذا فقط ملحوظة على ارتفاع الحمولة النظم.

اعتمادا على الوضع ، وأود أن تختار بين sysctl, غطاء, authbind و إيبتبلس-إعادة توجيه.وهذا شيء عظيم أن لدينا الكثير من الخيارات.

عند بدء التشغيل:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

ثم يمكنك ربط ميناء لك إلى الأمام.

مع systemd, تحتاج فقط إلى تعديل طفيف الخدمة الخاص بك لقبول preactivated مآخذ.

يمكنك استخدامها في وقت لاحق systemd مأخذ تفعيل.

لا قدرات الدماغ أو غيرها من الحيل هناك حاجة إليها.

هذا هو محتوى ذات الصلة systemd الملفات من هذا المثال البسيط بيثون http server

الملف httpd-true.service

[Unit]
Description=Httpd true 

[Service]
ExecStart=/usr/local/bin/httpd-true
User=subsonic

PrivateTmp=yes

الملف httpd-true.socket

[Unit]
Description=HTTPD true

[Socket]
ListenStream=80

[Install]
WantedBy=default.target

هناك أيضا 'djb الطريق'.يمكنك استخدام هذا الأسلوب لبدء عملية الجذر يعمل على أي منفذ تحت tcpserver ، ثم فإنه سيتم تسليم السيطرة العملية على المستخدم تحديد على الفور بعد بدء العملية.

#!/bin/sh

UID=`id -u yourusername`
GID=`id -g yourusername`
exec tcpserver -u $UID -g $GID -RHl0 0 portnumber   /path/to/your/process &

للحصول على مزيد من المعلومات ، راجع: http://thedjbway.b0llix.net/daemontools/uidgid.html

استخدام privbind فائدة:فإنه يسمح المحرومين تطبيق لربط المنافذ المحجوزة.

منذ العملية هو تطوير واختبار أقل من أنيق حلول قد تكون مفيدة:

setcap يمكن استخدامها على السيناريو مترجم منح قدرات البرامج النصية.إذا setcaps على المترجم العالمي ثنائي غير مقبول ، نسخة محلية من الثنائية (يمكن لأي مستخدم) و الحصول على الجذر إلى setcap على هذه النسخة.Python2 (على الأقل) يعمل بشكل صحيح مع نسخة محلية من مترجم في تطوير السيناريو شجرة.لا suid هناك حاجة لذلك المستخدم الجذر يمكن السيطرة على ما قدرات المستخدمين من الوصول.

إذا كنت بحاجة إلى تتبع المنظومة تحديثات مترجم, استخدام قذيفة النصي مثل التالية لتشغيل البرنامج النصي الخاص بك:

#!/bin/sh
#
#  Watch for updates to the Python2 interpreter

PRG=python_net_raw
PRG_ORIG=/usr/bin/python2.7

cmp $PRG_ORIG $PRG || {
    echo ""
    echo "***** $PRG_ORIG has been updated *****"
    echo "Run the following commands to refresh $PRG:"
    echo ""
    echo "    $ cp $PRG_ORIG $PRG"
    echo "    # setcap cap_net_raw+ep $PRG"
    echo ""
    exit
}

./$PRG $*

حاولت إيبتبلس PREROUTING توجيه الأسلوب.في السن حبات يبدو هذا النوع من القاعدة لم يكن دعم IPv6.ولكن على ما يبدو هو الآن معتمد في ip6tables v1.4.18 نواة لينكس v3.8.

كما أنني وجدت أن PREROUTING توجيه لا تعمل اتصالات بدأت داخل الجهاز.للعمل conections من الجهاز المحلي ، إضافة ناتج القاعدة أيضا — انظر إيبتبلس منفذ إعادة توجيه لا يعمل localhost.E. g.شيء من هذا القبيل:

iptables -t nat -I OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

كما أنني وجدت أن PREROUTING إعادة توجيه يؤثر أيضا على توجيه الحزم.وهذا هو, إذا كان الجهاز هو أيضا إعادة توجيه الحزم بين الواجهات (على سبيل المثالإذا كان بمثابة نقطة وصول Wi-Fi اتصال شبكة إيثرنت) ، ثم إيبتبلس القاعدة وقبض أيضا على اتصال العملاء اتصالات الإنترنت وجهات توجيهها إلى الجهاز.ليس هذا ما أردت—أنا فقط أردت إعادة توجيه الاتصالات التي وجهت إلى الجهاز نفسه.وجدت أنني يمكن أن تجعل تؤثر فقط على الحزم الموجهة إلى الصندوق عن طريق إضافة -m addrtype --dst-type LOCAL.E. g.شيء من هذا القبيل:

iptables -A PREROUTING -t nat -p tcp --dport 80 -m addrtype --dst-type LOCAL -j REDIRECT --to-port 8080

واحدة أخرى إمكانية استخدام TCP ميناء الشحن.E. g.باستخدام socat:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

ومع ذلك عيب واحد مع أن أسلوب التطبيق الذي يتم الاستماع على منفذ 8080 ثم لا يعرف عنوان المصدر من الاتصالات الواردة (على سبيل المثالللتسجيل أو غيرها من الهوية).

الجواب في 2015/سبتمبر:

ip6tables الآن يدعم IPV6 NAT: http://www.netfilter.org/projects/iptables/files/changes-iptables-1.4.17.txt

سوف تحتاج نواة 3.7+

برهان:

[09:09:23] root@X:~ ip6tables -t nat -vnL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REDIRECT   tcp      eth0   *       ::/0                 ::/0                 tcp dpt:80 redir ports 8080
    0     0 REDIRECT   tcp      eth0   *       ::/0                 ::/0                 tcp dpt:443 redir ports 1443

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6148 packets, 534K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 6148 packets, 534K bytes)
 pkts bytes target     prot opt in     out     source               destination
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top