هل هناك طريقة غير الجذر عمليات ربط "مميزة" الموانئ على لينكس ؟
-
03-07-2019 - |
سؤال
أنه أمر مزعج جدا أن يكون هذا القيد على التنمية بلدي مربع ، عندما يكون هناك لن يكون أي من المستخدمين الآخرين من لي.
أنا على علم معيار الحلول, ولكن أيا منها لا تفعل بالضبط ما أريد:
- authbind (النسخة في دبيان الاختبارية, 1.0, يدعم فقط IPv4)
- باستخدام إيبتبلس توجيه الهدف توجيه منخفض ميناء إلى ميناء (و "نات" الجدول لم تنفذ حتى الآن عن ip6tables ، IPv6 نسخة من إيبتبلس)
- سودو (تشغيل الجذر هو ما أحاول تجنب)
- سيلينو (أو ما شابه).(هذا هو مجرد بلدي ديف مربع ، أنا لا أريد أن أقدم الكثير من تعقيد إضافي.)
هناك بعض بسيطة sysctl
متغير للسماح غير الجذر عمليات ربط "مميزة" منافذ (موانئ أقل من 1024) على لينكس أم أنا فقط من الحظ ؟
تحرير:في بعض الحالات, يمكنك استخدام قدرات أن تفعل هذا.
المحلول
حسنا, شكرا للشعب الذي أشار إلى قدرات النظام CAP_NET_BIND_SERVICE
القدرة.إذا كان لديك مؤخرا النواة ، هو في الواقع من الممكن استخدام هذا إلى بدء تشغيل خدمة غير الجذر ولكن ربط انخفاض الموانئ.الجواب القصير هو أن تفعل:
setcap 'cap_net_bind_service=+ep' /path/to/program
ثم في أي وقت program
يتم بعد ذلك سوف يكون CAP_NET_BIND_SERVICE
القدرة. setcap
هو في حزمة دبيان libcap2-bin
.
الآن المحاذير:
- سوف تحتاج على الأقل 2.6.24 النواة
- هذا لن يعمل إذا كان الملف النصي.(أي يستخدم #!خط لإطلاق مترجم).في هذه الحالة, كما الآن أنا أفهم عليك تطبيق القدرة على المترجم للتنفيذ نفسها ، والتي بالطبع هو كابوسا أمنيا ، لأن أي برنامج باستخدام مترجم لديهم القدرة.لم أكن قادرة على العثور على أي النظيفة, طريقة سهلة للتغلب على هذه المشكلة.
- لينكس تعطيل LD_LIBRARY_PATH على أي
program
التي لديها امتيازات مرتفعة مثلsetcap
أوsuid
.حتى إذا كان الخاص بكprogram
يستخدم.../lib/
, قد تحتاج إلى النظر في خيار آخر مثل ميناء الشحن.
الموارد:
- قدرات(7) رجل الصفحة.قراءة هذا طويل وشاق إذا كنت تنوي استخدام القدرات في بيئة إنتاج.هناك بعض حقا صعبة تفاصيل كيفية قدرات موروثة عبر exec() المكالمات التي يتم مفصلة هنا.
- setcap رجل الصفحة
- "ربط الموانئ أدناه 1024 دون الجذر على غنو/لينكس":الوثيقة الأولى التي أشار لي نحو
setcap
.
ملاحظة: 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 تمت إضافة دعم اعتبارا من أواخر).
تثبيت:
apt-get install authbind
تكوين الوصول إلى ذات الصلة الموانئ على سبيل المثال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تنفيذ الأوامر الخاص بك عن طريق
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