LINUX.ORG.RU

Редирект порта через iptables

 ,


0

2

Доброго времени суток! Мне нужно перенаправить 8000 порт на 80-ый, потому что от рута запускать http-сервер — это не торт. Раньше я уже делал такой редирект, но тут на новом сервере возник нюанс, который я никак не могу разрешить.

Ранее делал я это так:

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

Но теперь у меня вот такая ситуация с сетью (ip отцензурены):

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:127.0.0.1  P-t-P:127.0.0.1  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
          RX packets:3326 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2624 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:264436 (258.2 KiB)  TX bytes:315652 (308.2 KiB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:123.123.123.1  P-t-P:123.123.123.1  Bcast:123.123.123.1  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:123.123.123.2  P-t-P:123.123.123.2  Bcast:123.123.123.2  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
Мне нужно организовать редирект для venet0:0 и venet0:1.
/sbin/iptables -A PREROUTING -t nat -i venet0:0 -p tcp --dport 80 -j REDIRECT --to-port 8000
На что получаю:
Warning: wierd character in interface `venet0:0' (No aliases, :, ! or *).
Пробовал так же (по одному совету где-то в интернетах) так:
/sbin/iptables -A PREROUTING -t nat -i venet0 -s 123.123.123.1 -p tcp --dport 80 -j REDIRECT --to-port 8000
Но ничего не помогло. Как быть, как сделать редирект? Заранее спасибо!

UPD: Система: CentOS 5 Linux *********.org 2.6.18-028stab101.1 #1 SMP Sun Jun 24 19:50:48 MSD 2012 x86_64 x86_64 x86_64 GNU/Linux



Последнее исправление: unclechu (всего исправлений: 2)

У Вас web-сервер запускается из-под рута? о_О Это как, если не секрет?

А то у меня от www-data:www-data из коробки работает (debian/ubuntu и centos).

dhameoelin ★★★★★
()
Ответ на: комментарий от dhameoelin

Сейчас он пока никак не запускается, потому что под рутом не запускаю. А вообще sudo + демон веб-сервера, например. И под веб-сервером я не подразумеваю всякие LAMP-ы, апачи и прочие. Просто есть исполняемый файл, который собственно и слушает порт, и отвечает на запросы, ведёт себя как типичный http-сервер.

unclechu
() автор топика

Но ничего не помогло

iptables выдает ошибку или нет, но редирект не срабатывает?

anonymous
()
Ответ на: комментарий от anonymous

Никаких ошибок, просто редирект не срабатывает.

unclechu
() автор топика

алиасы для людей, для ядра это всё тот же физический интерфейс, поэтому изыски типа -i venet0:0 не сработают
пиши source ip или что там у тебя...

zolden ★★★★★
()
Ответ на: комментарий от mky

Честно — I have no idea! Я просто увидел и повторил как валенок, в надежде что это запашет.

unclechu
() автор топика
Ответ на: комментарий от unclechu

А вообще sudo + демон веб-сервера, например

Ну процесс все равно запуститься от рута, а потом сменит пользователя на того кто указан в конфиге.

drull ★☆☆☆
()
Ответ на: комментарий от drull

Rly? o_O В любом случае, — если этот процесс запустит впоследствии какой-нибудь rm / -rf, — то ему невозбранно позволится это сделать.

unclechu
() автор топика
Ответ на: комментарий от drull

У меня смысл не в том, чтобы имя пользователя где-то фигурировало конкретное, а чтобы у http-сервера не было прав стрелять себе в колено.

unclechu
() автор топика
Ответ на: комментарий от zolden

Это вот так?

/sbin/iptables -A PREROUTING -t nat -s 123.123.123.1 -p tcp --dport 80 -j REDIRECT --to-port 8000
Ошибок нет, и редиректа тоже нет(

unclechu
() автор топика
Ответ на: комментарий от unclechu

Rly? o_O В любом случае, — если этот процесс запустит впоследствии какой-нибудь rm / -rf, — то ему невозбранно позволится это сделать.

В последствии не позволится.

drull ★☆☆☆
()
Ответ на: комментарий от unclechu
root@gxdev:/etc/apache2# grep -r 'User ' ./apache2.conf
User www-data
root@gxdev:/etc/apache2# ps aux|grep apache2
root     24918  0.0  0.0   7548   872 pts/5    S+   13:18   0:00 grep apache2
root@gxdev:/etc/apache2# /usr/sbin/apache2
[Wed Feb 20 13:18:17 2013] [warn] NameVirtualHost *:80 has no VirtualHosts
root@gxdev:/etc/apache2# ps aux|grep apache2
root     24920  0.0  0.2 188656  9644 ?        Ss   13:18   0:00 /usr/sbin/apache2
www-data 24921  0.0  0.1 188656  5572 ?        S    13:18   0:00 /usr/sbin/apache2
www-data 24922  0.0  0.1 188656  5572 ?        S    13:18   0:00 /usr/sbin/apache2
www-data 24923  0.0  0.1 188656  5572 ?        S    13:18   0:00 /usr/sbin/apache2
www-data 24924  0.0  0.1 188656  5572 ?        S    13:18   0:00 /usr/sbin/apache2
www-data 24925  0.0  0.1 188656  5572 ?        S    13:18   0:00 /usr/sbin/apache2
root     24927  0.0  0.0   7552   880 pts/5    S+   13:18   0:00 grep apache2
drull ★☆☆☆
()
Ответ на: комментарий от unclechu

Мне нужно перенаправить 8000 порт на 80-ый, потому что от рута запускать http-сервер — это не торт.

Кстати, этот 80й порт все равно должен будет слушать кто-то с правами рута.

drull ★☆☆☆
()

Тебе нужен не редирект, а способность юзерского процесса повиснуть на привилегированном порту. man setcap.

thesis ★★★★★
()
Ответ на: комментарий от drull

По сабжу я и хочу сделать, чтобы ничему в юзерспейсе от рута не надо было слушать. Я уже так делал раньше, но в данном случае это почему-то не работает. Точнее предположить можно почему не работает, потому что ситуация необычная, тут сетевые устройства именуются с алиасами, и я тут решительно ничего не понимаю.

unclechu
() автор топика

Доброго времени суток! Мне нужно перенаправить 8000 порт на 80-ый, потому что от рута запускать http-сервер — это не торт

А зачем его запускать от рута? Что это за сервер такой, не могущий в захват привилегированных ресурсов?

Artificial_Thought ★★★★
()
Ответ на: комментарий от unclechu

Ааа, пятый... А я про шестой пишу.
Ну выкинь для начала вообще любые указания на интерфейс и айпишник.
iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8000
Пашет?

thesis ★★★★★
()
Ответ на: комментарий от thesis

А в:

sudo /sbin/iptables --list
Оно же должно потом появиться? А то я не вижу там стараний, может проблема в том, что туда почему-то не пишется?

unclechu
() автор топика
Ответ на: комментарий от unclechu

Тю, наконец-то до меня дошло что ты хочешь сделать. Интересная идея.

drull ★☆☆☆
()
Ответ на: комментарий от thesis
iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8000

Не пашет. Квест походу не так прост.

unclechu
() автор топика
Ответ на: комментарий от thesis
iptables -L -t nat
REDIRECT   tcp  --  anywhere             anywhere            tcp dpt:http redir ports 8000

Ещё думаю нужно отметить нюанс, что извне на 8000 порт доступ закрыт. Нужно это как-то локально в вакууме отредиректить, на localhost.

unclechu
() автор топика
Ответ на: комментарий от unclechu

Каким именно образом закрыт доступ извне на порт 8000? И с какой целью?

Нужно это как-то локально в вакууме отредиректить, на localhost

Нельзя на localhost, пакеты с адресом 127.0.0.1 будут признаны масианскими. Ваш http-сервер слушает какой адрес? Надесюсь 0.0.0.0 или 123.123.123.1.

mky ★★★★★
()
Ответ на: комментарий от mky

Даже не знаю как закрыт конкретно, vps-хостер hostgator — пишут, что закрывают из соображений безопасности, типа если нужно что-то открыть, то пишите в саппорт.

unclechu
() автор топика
Ответ на: комментарий от unclechu

Хоршо, на запросы с localhost (telnet 127.0.0.1 8000) ваш сервер отвечает? И аналогично, для адреса 123.123.123.1 (запускать telnet на той же машине, где и http-сервер. telnet должен установить соединение и на двойное нажатие ″Enter″ выкинуть текст, содержащиё http сообщение об ошибке.

Посмотрите ″iptables -t nat -L PREROUTING -n -v -x″ там в начале для правила выводятся счётчики срабатываний. Если у вашего REDIRECT правила они нулевый, то либо пакеты не доходят, либо вы как-то неправильно проверяли, что «Не пашет».

И ещё, в CentOS, ЕМНИП, по умолчанию iptables запрещает извне коннект на любые порты, кроме 22. Если у вас сервер запускается на 80-порту, то коннекты к нему проходят?

И я ещё не уверн, но может проблема в VPS, может там и не должен работать REDIRECT...

mky ★★★★★
()
Ответ на: комментарий от unclechu

Ах вот оно как. Тогда сходу и не скажу.

thesis ★★★★★
()
Ответ на: комментарий от mky

Если от рута стартую на 80-ом, — всё работает.

unclechu
() автор топика
Ответ на: комментарий от mky
telnet 127.0.0.1 8000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
unclechu
() автор топика
Ответ на: комментарий от mky

Данные идут:

sudo /sbin/iptables -t nat -L PREROUTING -n -v -x
Chain PREROUTING (policy ACCEPT 74 packets, 4096 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
      67     4020 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8000
При новом запросе — данные меняются.

unclechu
() автор топика
Ответ на: комментарий от unclechu

Ну добавьте в INPUT разрешающие правило для порта 8000 и потом посмотрите, будет ли у него менятся счётчик:

iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

mky ★★★★★
()
20 июня 2013 г.
Ответ на: комментарий от unclechu

INFO: На VPS у hostgator эти команды нужно писать в /etc/firewall/INCLUDE

unclechu
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.