Назад | Перейти на главную страницу

Как передать в NFQUEUE все входящие пакеты подключения

Я разрабатываю приложение для проверки пакетов, поступающих на Linux-машину. Я хочу отправлять в NFQUEUE все входящие пакеты подключения и только входящие. Не только --state NEW но также --state ESTABLISHED, RELATED для соединений, инициированных клиентом.

И последнее: чтобы установить протокол TCP для всех портов, мне нужно, чтобы это правило работало дополнительно:

iptables -A PREROUTING -t nat -p tcp -match multiport! --dport 64646 -j REDIRECT --to-ports 1234

Пример потока:

  1. ssh-соединение (порт 22), инициированное 1.2.3.4, к моему серверу
  2. сервер передает в nfqueue SYN и принимает
  3. правило перенаправления (22 -> 1234)
  4. скрипт python прослушивает порт 1234, поэтому отправляется SYN / ACK
  5. клиент получает SYN / ACK и возвращает ACK
  6. сервер передает в nfqueue ACK и принимает
  7. правило перенаправления (22 -> 1234)
  8. клиент возвращает ACK, DATA
  9. сервер передает в nfqueue ACK / DATA
  10. правило перенаправления (22 -> 1234)
  11. сервер не знает протокол и всегда возвращает одно и то же сообщение, соединение закрыто.

Любая помощь будет очень признательна.

Спасибо!

Нашел решение, если кому-то интересно.

# Accept our ssh on a modified port
iptables -A PREROUTING -t raw -p tcp --dport 64646 -j ACCEPT

# Mark all packets of incoming NEW connection with mark 1 (netfilter connmark)
iptables -A PREROUTING -t mangle -m state --state NEW -j CONNMARK --set-mark 1

# Push into nfqueue all marked packets (netfilter nfqueue)
iptables -A PREROUTING -t mangle -m connmark --mark 1 -j NFQUEUE --queue-num 0

# Redirect all incoming connections to the userland listener to make TCP handshake
iptables -A PREROUTING -t nat -p tcp --match multiport ! --dport 64646 -j REDIRECT --to-ports 1234

Наконец, все входящие пакеты попадают в nfqueue, но если я работаю на машине (обновление, обновление, установка ...), пакеты не соответствуют правилам. Кроме того, перенаправление применяется после решения nfqueue, поэтому я регистрирую базовый порт (а не 1234).

Если вы хотите сопоставить все входящие пакеты от новых или установленных соединений, но только от ваших клиентов, вы должны использовать что-то вроде этого:

iptables -A INPUT -d <your_ip_address> -s <your_client_net>/<mask> -i <your_eth> -J <nfqueue stuff>

На самом деле я не понимаю, что вы имеете в виду под:

чтобы сделать рукопожатие tcp для всех портов, мне нужно, чтобы это правило работало

Не могли бы вы пояснить, чего вы пытаетесь достичь?