В контексте именованных каналов (fifos) использование дополнительного дескриптора файла может позволить не блокировать поведение передачи по каналу.
(
rm -f fifo
mkfifo fifo
exec 3fifo # open fifo for writing
trap "exit" 1 2 3 15
while true;
do
echo "blah" > fifo
done
)
#kill -TERM $bpid
См.: Именованный канал, закрывающийся преждевременно в сценарии?
Вы близки.
Истинная причина, что приложение не видит обратного трафика, из-за ядра, создал в защите IP-спуфинга. Т.е. обратный трафик не соответствует таблице маршрутизации и поэтому отбрасывается. Можно зафиксировать это путем выключения спуфинга защиты как это:
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
Но я не рекомендовал бы это. Более надлежащий путь состоит в том, чтобы создать альтернативный экземпляр маршрутизации.
Удостоверьтесь, что Вы имеете iproute
пакет установлен. Если Вы имеете ip
управляйте затем, что Вы установлены (который похоже, что Вы делаете, но если не получают это сначала).
Править /etc/iproute2/rt_tables
и добавьте новую таблицу путем добавления следующей строки:
200 wlan-route
Затем необходимо настроить новую названную таблицу маршрутизации wlan-route
со шлюзом по умолчанию и создают правила условно отправить трафик в ту таблицу. Я предположу, что Ваш шлюз по умолчанию 192.168.0.1. Естественно это должно соответствовать Вашей фактической сети и не только моим предположениям.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Аннотируемый сценарий Вашего финала будет похож на это:
# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2
решение bahamat правильно; однако, обратите внимание на то, что единственный путь ко мне для создания этой работы состоял в том, чтобы отключить rp_filter для каждого интерфейса в системе, не только два (eth1 и wlan0 в этом случае) вовлеченный в NATing.
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
(см. ВАЖНОЕ примечание в конце этой страницы: практическое руководство Расширенной маршрутизации - ссылка, отправленная там, больше не существует, но я нашел его через Wayback Machine),
Одно предложение: вы всегда должны использовать --спорт
вместо -порта
в выходной цепи.
NATs изменяют dport
и это сделает ваше правило невыполнимым.
Я думаю, что ниже необходимо:
ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
src
опция кip route
команды для определения корректного исходного адреса. – David Schwartz 23.09.2011, 13:51POSTROUTING
SNAT
будет заботиться об этом. – bahamat 24.09.2011, 00:06