Упрощенный, stdbuf является оберткой вокруг stdio функциональности. Буферизация строки входных потоков не определена в stdio; я не могу найти документ стандартов, в котором говорится, что это означает, таким образом, это буквально бессмысленно насколько стандарты идут.
Принимая поведение, аналогичное stdout буферизации строки, буферизация строки stdin потребовала бы чтения вызова () однажды для каждого символьного чтения, потому что нет никакого другого способа гарантировать, что Вы не читаете мимо новой строки на дескрипторе. Так как точка буферизации должна сократить количество системных вызовов, неудивительно, что stdio библиотека не реализует это.
iptables постановляют, что Вы используете, будет работать, но существует одно дополнительное изменение, которое необходимо внести:
sysctl -w net.ipv4.conf.eth0.route_localnet=1
(замена eth0
с nic 192.168.2.2
находится на),
По умолчанию это значение 0
, который дает ядру команду не направлять внешний трафик, предназначенный к 127.0.0.0/8
. Это только для безопасности трафик, как таковой не обычен.
Дополнительное примечание: Ваше текущее правило iptables слишком широко. Ваше правило указывает -d 192.168.1.0/24 --dport 2222
как целевое соответствие, означая, что, если Ваша машина пытается говорить с другим хостом на порте 2222 (т.е. исходящий трафик), оно будет перенаправлено также. Любой необходимо измениться -d
соответствие к -d 192.168.2.2
, или добавьте -i eth0
(или независимо от того, что Ваш nic).
Можно перенаправить к localhost, но не к обратной петле (127.0.0.0/8). Обратная петля является лазейкой. Необходимо перенаправить к одному из реальных интерфейсов. Попытайтесь использовать ПЕРЕНАПРАВЛЕНИЕ.
iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222
Что делать, если правильный ответ с route_localnet
не работает? ..
Если ваше ядро не включает патч для route_localnet
, то .. . обновить ядро!
Или есть другие способы перенаправить трафик, поступающий на один интерфейс, на другой порт другого интерфейса (в частности, на localhost), запустив процесс, который будет прослушивать внешний интерфейс и пересылать трафик.
netcat
( nc
), xinetd
и ssh
(и, возможно, другие) - все это примеры программ, которые могут это делать (хотя выбирают ssh
было бы странно и неэффективно).
Я написал для этого конфигурацию для xinetd
. Теперь эта служба запускается автоматически:
# cat /etc/xinetd.d/z-from-outside
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
disable = no
socket_type = stream
type = UNLISTED
wait = no
user = nobody
bind = vaio.ob
port = 7070
redirect = localhost 7070
}
#
( vaio.ob
- имя этого хоста на внешнем сетевом интерфейсе.)
После перезагрузки службы xinetd
давайте проверьте, что он прослушивает:
# lsof -i -P | fgrep 7070
xinetd 556 root 6u IPv4 1797906 0t0 TCP vaio.ob:7070 (LISTEN)
sshd 27438 tun_zzoom 4u IPv4 1059100 0t0 TCP localhost.localdomain:7070 (LISTEN)
#
И действительно, соединения проходят!
route_localnet
. Были другие названия его? (в Linux 2.6.30)ls /proc/sys/net/ipv4/conf/lan/
: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm передающий mc_forwarding promote_secondaries rp_filter send_redirects отмечают – imz -- Ivan Zakharyaschev 01.04.2015, 01:39route_localnet
более свежо (7 июня 2012), чем мое ядро (2.6.30-std-def-alt15 № 1 SMP понедельник 14 декабря 8:45:48 UTC 2009). Хорошо, я просто достигну требуемого перенаправления портов (снаружи к внутренней части) с процессом переадресации какnetcat
(nc
),xinetd
, или опции перенаправления портовssh
(последний неэффективен и глуп, конечно, но я упоминаю это, потому что, ну, в общем, эта возможность там). А-ч – imz -- Ivan Zakharyaschev 01.04.2015, 01:50sysctl -w net.ipv4.conf.all.route_localnet=1
– Dmitriusan 10.11.2017, 14:39