История изменений
Исправление vel, (текущая версия) :
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
Это проверяет отностся ли пакет к слушаемому/открытому локальному сокету.
В современных ядрах есть еще полезная опция --transparent (чтоб не срабатывало на нормальные локальные сокеты)
Это правило не срабатывает для первого пакета соедиения.
Отдельная цепочка divert нужна только из-за того, что MARK не умеет возвращать ACCEPT. А сделать нужно 2 действия MARK+ACCEPT
Схема следование пакета в ядре/iptables.
По этой марке оно на «routing decision» через «ip ru» станет локальным трафиком без NAT-a в явном виде :).
iptables -t mangle -A PREROUTING -p tcp -d 10.192.0.0/10 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 9040
Это хитрый аналог DNAT/REDIRECT с доп. действием - ставил марку + отмечает пакет как бы локальным.
Правило срабатывает только для первого пакета соедиения.
По метке и «ip ru» оно попадет в локальный трафик после «routing decision»
На счет биндинга на INANY - у TPROXY можно указать не только порт, но и адрес через --on-ip. Проблема в том, что ip адрес редиректа через TPROXY выбирается по интерфейсу через который пришел пакет.
Порт 9040 нужно прибиндить к какому-нибудь локальному адресу ( но не 127.0.0.1), а в TPROXY указать его явно, токгда не будет неопределенностей.
C "-j REDIRECT" такая же фигня с ip :(
Исправление vel, :
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
Это проверяет отностся ли пакет к слушаемому/открытому локальному сокету.
В современных ядрах есть еще полезная опция --transparent (чтоб не срабатывало на нормальные локальные сокеты)
Это правило не срабатывает для первого пакета соедиения.
Отдельная цепочка divert нужна только из-за того, что MARK не умеет возвращать ACCEPT. А сделать нужно 2 действия MARK+ACCEPT
Схема следование пакета в ядре/iptables.
По этой марке оно на «routing decision» через «ip ru» станет локальным трафиком без NAT-a в явном виде :).
iptables -t mangle -A PREROUTING -p tcp -d 10.192.0.0/10 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 9040
Это хитрый аналог DNAT/REDIRECT с доп. действием - ставил марку + отмечает пакет как бы локальным.
Правило срабатывает только для первого пакета соедиения.
Маршрут через lo говорит, что это локальный тафик, т.е. он не попадет в forward после «routing decision»
На счет биндинга на INANY - у TPROXY можно указать не только порт, но и адрес через --on-ip. Проблема в том, что ip адрес редиректа через TPROXY выбирается по интерфейсу через который пришел пакет.
Порт 9040 нужно прибиндить к какому-нибудь локальному адресу ( но не 127.0.0.1), а в TPROXY указать его явно, токгда не будет неопределенностей.
C "-j REDIRECT" такая же фигня с ip :(
Исправление vel, :
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
Это проверяет отностся ли пакет к слушаемому/открытому локальному сокету.
В современных ядрах есть еще полезная опция --transparent (чтоб не срабатывало на нормальные локальные сокеты)
Это правило не срабатывает для первого пакета соедиения.
Отдельная цепочка divert нужна только из-за того, что MARK не умеет возвращать ACCEPT.
iptables -t mangle -A PREROUTING -p tcp -d 10.192.0.0/10 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 9040
Это хитрый аналог DNAT/REDIRECT с доп. действием - ставил марку + отмечает пакет как бы локальным.
Правило срабатывает только для первого пакета соедиения.
Схема следование пакета в ядре/iptables. Маршрут через lo говорит, что это локальный тафик, т.е. он не попадет в forward после «routing decision»
На счет биндинга на INANY - у TPROXY можно указать не только порт, но и адрес через --on-ip. Проблема в том, что ip адрес редиректа через TPROXY выбирается по интерфейсу через который пришел пакет.
Порт 9040 нужно прибиндить к какому-нибудь локальному адресу ( но не 127.0.0.1), а в TPROXY указать его явно, токгда не будет неопределенностей.
C "-j REDIRECT" такая же фигня с ip :(
Исходная версия vel, :
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
Это проверяет отностся ли пакет к слушаемому/открытому локальному сокету.
В современных ядрах есть еще полезная опция --transparent (чтоб не срабатывало на нормальные локальные сокеты)
Это правило не срабатывает для превого пакета соедиения.
Отдельная цепочка divert нужна только из-за того, что MARK не умеет возвращать ACCEPT.
iptables -t mangle -A PREROUTING -p tcp -d 10.192.0.0/10 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 9040
Это хитрый аналог DNAT/REDIRECT с доп. действием - ставил марку + отмечает пакет как бы локальным.
Правило срабатывает только для первого пакета соедиения.
Схема следование пакета в ядре/iptables. Маршрут через lo говорит, что это локальный тафик, т.е. он не попадет в forward после «routing decision»
На счет биндинга на INANY - у TPROXY можно указать не только порт, но и адрес через --on-ip. Проблема в том, что ip адрес редиректа через TPROXY выбирается по интерфейсу через который пришел пакет.
Порт 9040 нужно прибиндить к какому-нибудь локальному адресу ( но не 127.0.0.1), а в TPROXY указать его явно, токгда не будет неопределенностей.
C "-j REDIRECT" такая же фигня с ip :(