alibek Posted March 31, 2016 Есть сервер с 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 Или что-нибудь еще? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
orlik Posted March 31, 2016 Да, этого должно быть достаточно Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted March 31, 2016 Видимо чего-то не хватает. #!/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 я не могу. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
casper.w00t Posted March 31, 2016 а форвардинг разрешен? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted March 31, 2016 Вроде бы все делаю правильно, но тут написано, что еще нужно форвардинг на петлевой интерфейс включить. Но в RHEL нет net.ipv4.conf.eth0.route_localnet или чего-то похожего. Никто не помнит, как в RHEL этот параметр называется? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
swelf Posted March 31, 2016 В цепочке FORWARD они тикать и не будут, 127.0.0.1 забрасывает пакеты на локальную машину в цепочку INPUT, где у тебя стоит DROP по умлчанию. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted March 31, 2016 Почему INPUT? Ведь интерфейсы разные, если пакет перекладывается с eth0 на lo, должен быть FORWARD. Впрочем вместо многоточия у меня есть -A INPUT -i lo -j ACCEPT и -A INPUT -i eth0 -p tcp --dport 31166 -j ACCEPT, там счетчики тоже не тикают. Что-то с петлевыми интерфейсами какие-то заморочки. Я наверное через nc лучше форвардинг сделаю. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
swelf Posted March 31, 2016 (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 March 31, 2016 by swelf Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted March 31, 2016 Да, похоже в этом сложность. Тогда мне по идее 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. Как бы это обойти? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted March 31, 2016 Вроде бы разобрался: #!/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? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
vop Posted March 31, 2016 nc надо вешать через inetd или через xinetd (или любой другой установленный там). xinetd кстати, сам умеет исполнять форвардинг. Что-то типа в inetd.conf: 31166 stream tcp nowait nobody /bin/nc /bin/nc -w 5 127.0.0.1 31166 PS Хотя, фиг его знает, может закольцеваться фигово. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted March 31, 2016 Действительно, что-то я велосипед изобретаю. Порты я чуть поменяю, чтобы рекурсии не было. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted March 31, 2016 Да, действительно фигней занимался. Такой файл для 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 } Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...