Вот немного улучшенный ответ в строке Хауке Лагинга:
#!/bin/bash
tmpfile=$(mktemp) # Create a temporal file in the default temporal folder of the system
# Lets do some magic for the tmpfile to be removed when this script ends, even if it crashes
exec {FD_W}>"$tmpfile" # Create file descriptor for writing, using first number available
exec {FD_R}<"$tmpfile" # Create file descriptor for reading, using first number available
rm "$tmpfile" # Delete the file, but file descriptors keep available for this script
# Now it is possible to work with the temporal file
echo foo >&$FD_W
echo bar >&$FD_W # Note that file descriptor always concatenates, not overwrites
cat <&$FD_R
Я предполагаю, что REDSOCKS_FILTER
находится в таблице filter
из iptables
, а не в таблице nat
? Вы не можете переходить от одной таблицы к другой, так как разные таблицы обрабатываются в разных местах в стеке драйвера TCP/IP.
Поскольку вы выполняете перенаправление в цепочках PREROUTING и OUTPUT в таблице NAT, эти изменения уже применяются, когда пакет обрабатывается соответствующими таблицами INPUT и OUTPUT filter
. Так что вам нужно что-то вроде этого:
iptables -t filter -A INPUT -p tcp --dport 8118 -j REDSOCKS_FILTER
iptables -t filter -A OUTPUT -p tcp --dport 8118 -j REDSOCKS_FILTER
Поскольку filter
является таблицей по умолчанию, вы можете опустить параметр -t filter
.
Эта диаграмма потока пакетов между различными таблицами Netfilter может быть полезной:
https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg
Поскольку вы не используете мост, все, что вы делаете с iptables
, происходит в зеленом «Сетевом слое» на этом изображении.