Jump to content
Калькуляторы

Подскажите по iptables

Есть сервер с 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

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

Share this post


Link to post
Share on other sites

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

#!/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 я не могу.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Тогда мне по идее 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.

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

Share this post


Link to post
Share on other sites

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

#!/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?

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

Такой файл для 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
}

Share this post


Link to post
Share on other sites

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.