Я внедрил следующие правила iptables на моем тестовом сервере для курса. Брандмауэр выключается, и я не могу получить доступ к порту 22. Однако после стука в порты 1111, 2222 и 3333 в таком порядке - порт 22 должен быть открыт. Тем не менее, мой ssh по-прежнему заблокирован.

Я стучу к каждому порту через скрипт Python:

# knock_list = [1111, 2222, 3333]

for port in knock_list:
    time.sleep(1.5)

    sock = None
    try:
        print 'Knocking:', ip_address, port
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.set_timeout(1)
        sock.connect((ip_address, port))

    except:
        pass

    finally:
        if sock:
            sock.close()

Почему моя конфигурация iptables для стука портов не работает?

Моя конфигурация iptables

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

sudo iptables -N KNOCKING
sudo iptables -N GATE1
sudo iptables -N GATE2
sudo iptables -N GATE3
sudo iptables -N PASSED

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A INPUT -j KNOCKING

sudo iptables -A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j DROP
sudo iptables -A GATE1 -j DROP

sudo iptables -A GATE2 -m recent --name AUTH1 --remove
sudo iptables -A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j DROP
sudo iptables -A GATE2 -j GATE1

sudo iptables -A GATE2 -j GATE1

sudo iptables -A GATE3 -m recent --name AUTH2 --remove
sudo iptables -A GATE3 -p tcp --dport 3333 -m recent --name AUTH3 --set -j DROP
sudo iptables -A GATE3 -j GATE1

sudo iptables -A PASSED -m recent --name AUTH3 --remove
sudo iptables -A PASSED -p tcp --dport 22 -j ACCEPT
sudo iptables -A PASSED -j GATE1

sudo iptables -A KNOCKING -m recent --rcheck --seconds 30 --name AUTH3 -j PASSED
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2

sudo iptables -A KNOCKING -j GATE1

1 ответ1

1

Две вещи, чтобы упомянуть.

Сначала вы принимаете политику (-P) ПРИНЯТЬ для каждого из INPUT, OUTPUT и FORWARD. Лучше закрыть (DROP) все, особенно на INPUT, и открыть только то, что нужно.

Во-вторых, я не очень хорошо знаю Python, но обычно такого рода соединения посылают не один пакет, а гораздо больше. Даже если вы сделаете тайм-аут в 1 секунду, (я думаю) будет отправлено 2 идентичных пакета, поскольку для первого ответа не было. Таким образом, первый пакет переносит источник в следующий список AUTH+1, а второй пакет удаляет его и возвращает источник обратно в список AUTH1.

Я бы посоветовал переписать ваш portknocking с учетом нескольких идентичных пакетов, отправленных на один и тот же порт.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .