Jump to content

Recommended Posts

Posted

Есть сервер с RHEL 4, на нем по адресу 127.0.0.1:31166 работает некий сервис.

Мне нужно подключиться к этому сервису из внешнего узла.

На сервере есть интерфейс 10.1.128.2/24, подключаться я буду с 10.1.128.13.

Сейчас подключиться на 10.1.128.2:31166 не могу (refused).

 

Насколько я понимаю, мне нужно сделать так:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 31166 -j DNAT --to 127.0.0.1:31166

Или что-нибудь еще?

Posted

Видимо чего-то не хватает.

#!/bin/sh

IPT=/sbin/iptables
[ -z "$IPT" ] && exit

IF_LOOP=lo
IF_INT=eth0
IF_EXT=eth1

IP_INT=`/sbin/ip -o -4 addr show dev $IF_INT | sed -ne 's/.*inet \(.*\) brd.*/\1/p'`

NET_SRV="10.1.128.0/24"
NET_USR="10.1.144.0/24"

FW="$IPT -t filter"
NAT="$IPT -t nat"
MARK="$IPT -t mangle"

## Filter section
$FW -F
$FW -X
$FW -Z
$FW -P INPUT DROP
$FW -P OUTPUT ACCEPT
$FW -P FORWARD DROP

...

$FW -A FORWARD -i $IF_INT -s $NET_SRV -p tcp --dport 31166 -j ACCEPT
$FW -A FORWARD -i $IF_INT -o $NET_SRV -m state --state ESTABLISHED,RELATED -j ACCEPT
$FW -A FORWARD -j LOG --log-prefix "FORWARD DROP: "
$NAT -F
$NAT -X
$NAT -Z
$NAT -A PREROUTING -i $IF_INT -s $NET_SRV -p tcp --dport 31166 -j DNAT --to 127.0.0.1:31166

На правиле FORWARD счетчики не тикают.

На DNAT счетчики пакетов растут, но зайти по телнету на 10.1.128.2:31166 я не могу.

Posted

Вроде бы все делаю правильно, но тут написано, что еще нужно форвардинг на петлевой интерфейс включить. Но в RHEL нет net.ipv4.conf.eth0.route_localnet или чего-то похожего.

Никто не помнит, как в RHEL этот параметр называется?

Posted

В цепочке FORWARD они тикать и не будут, 127.0.0.1 забрасывает пакеты на локальную машину в цепочку INPUT, где у тебя стоит DROP по умлчанию.

Posted

Почему INPUT? Ведь интерфейсы разные, если пакет перекладывается с eth0 на lo, должен быть FORWARD.

Впрочем вместо многоточия у меня есть -A INPUT -i lo -j ACCEPT и -A INPUT -i eth0 -p tcp --dport 31166 -j ACCEPT, там счетчики тоже не тикают.

 

Что-то с петлевыми интерфейсами какие-то заморочки.

Я наверное через nc лучше форвардинг сделаю.

Posted (edited)

http://serverfault.com/questions/461494/how-to-route-external-tcp-port-80-into-loopback-127-0-0-1-port-8080

тут ответ, ядро считает их марсианскими. Незнаю можно ли разрешить их, или как-то извратиться.

 

UPD.

 

по твоей же ссылке включил

echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet
iptables -I PREROUTING -t nat -i eth0 -p tcp --dport 12345 -j DNAT --to-destination 127.0.0.1:12345

и все заработало

на той же машине

$nc -l 127.0.0.1 12345
test message

на соседней

$nc 192.168.4.243 12345
test message

 

UPD2.

RHEL4? я так понимаю там этого параметра нету.

Edited by swelf
Posted

Да, похоже в этом сложность.

Тогда мне по идее nc нужен.

 

Но у него какой-то синтаксис непонятный, не могу сам разобраться.

Мне нужно "связать" (сбриджевать) 10.1.128.2:31166 и 127.0.0.1:31166.

Вроде бы как мне нужно сделать так:

# mkfifo backpipe
# nc -l 31166 0<backpipe | nc 10.1.128.2 31166 1>backpipe

Но подключения telnet не происходит.

 

RHEL4? я так понимаю там этого параметра нету.

Да, sysctl про него не знает.

 

 

UPD1.

nc -l -p 31160 < fifo | nc 127.0.0.1 31166 > fifo

Вроде бы все правильно, подключение проходит.

Там специальный сервис, принимающий текстовые команды.

Отправляю команды AUTH, GET — все выполняется.

Затем отправляю команду EXIT — и отключается в том числе и nc.

Как бы это обойти?

Posted

Вроде бы разобрался:

#!/bin/sh

PIPE=/tmp/fifo_rad
[ -e $PIPE ] && rm -f -- $PIPE
/usr/bin/mkfifo $PIPE

DEBUG=-v
echo Start proxy cycle
while true; do
 /usr/bin/nc $DEBUG -l -p 31160 < $PIPE | /usr/bin/nc $DEBUG 127.0.0.1 31166 > $PIPE
 [ $? -ne 0 ] && break
done
echo Finish proxy cycle

Теперь бы еще этот скрипт сделать демоном, чтобы запускался автоматически.

Ни у кого случайно не будет шпаргалки, как это сделать правильно, с реакцией на SIG и со стартером?

Или тупо запускать через nohup?

Posted

nc надо вешать через inetd или через xinetd (или любой другой установленный там). xinetd кстати, сам умеет исполнять форвардинг.

 

Что-то типа в inetd.conf:

 

31166 stream tcp nowait nobody /bin/nc /bin/nc -w 5 127.0.0.1 31166

 

PS Хотя, фиг его знает, может закольцеваться фигово.

Posted

Да, действительно фигней занимался.

Такой файл для xinetd полностью решает вопрос:

service radappsrv
{
       disable = no
       type = unlisted
       socket_type = stream
       wait = no
       user = nobody
       group = nobody
       protocol = tcp
       port = 31160
       redirect = 127.0.0.1 31166
       per_source = unlimited
       instance = unlimited
       cps = 10000 1
}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.