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

Будет ли использование ACCEPT, а затем DROP для конкретной пары порт / IP разрешать IP, но ничего больше на этом порту?

Я работаю на сервере и должен его настроить так, чтобы запросы на порт 8080 разрешались только с определенного IP-адреса. (На других портах http (s) все равно ничего не прослушивается.)

Все остальное останется без ограничений.

После исследования о /etc/host и iptables Я написал этот скрипт для активации (и деактивации) этого правила:

#!/bin/bash

if ["$1" != 'restrict'] && ["$1" != 'restore']
  then
    echo "Usage:"
    echo "'${0##*/} restrict' to activate rules."
    echo "'${0##*/} restore' to deactivate rules."
    echo "'${0##*/}' to show this help."
    exit 0
fi


# Set default policies for INPUT, FORWARD and OUTPUT chains
# Allowing everything else.
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Flush all current rules from iptables
iptables -F

if [$1 == "restrict"]
  then

    # Allow HTTP connections on tcp port 8080 from X.X.X.X
    # [I]nserting the rules as first in the chain.
    iptables -I INPUT -p tcp --dport 8080 -s X.X.X.X -j ACCEPT

    # Denying all other connections on tcp port 8080
    # [A]ppending the rule as last in the chain.
    iptables -A INPUT -p tcp --dport 8080 -j DROP
fi

# Save settings
/sbin/service iptables save

# List rules
iptables -L -v

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

Хотя это сработает, это не лучшая практика. Вместо того, чтобы разрешать все и отбрасывать только определенные вещи, лучше всего отбросить все, а затем разрешить только то, через что вы действительно хотите пройти.

«Обычный» набор правил таблицы IP обычно начинается так:

# Flush rules
iptables -F

# Policy drop
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Permit loopback device
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Permit new outgoing connections, and packets that belong to
# an existing connection. You might actually not want to allow
# all new connections from the inside if you want to restrict 
# this, you will have to allow DNS, updates, etc.. manually
iptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

# Same for input
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

# Custom rules
# ...
iptables -A INPUT -p tcp --dport 8080 -s 5.35.252.105 -j ACCEPT

Кроме того, при настройке нового брандмауэра не запускайте сценарий автоматически и не делайте изменения постоянными. Таким образом, если вы ошиблись, перезагрузка сервера вернет вам соединение.

Ваши правила верны (если вы исправите синтаксическую ошибку в сценарии оболочки, упомянутую в предыдущем комментарии) для IPv4. Для IPv6 ваша машина, скорее всего, полностью открыта.

Советы на будущее:

  • Предотвращение блокировки: если вы напишете свои правила в iptables-save стиль напрямую, вам может понравиться iptables-apply команда, которая восстанавливает ваши предыдущие правила в случае, если новые заблокируют вас.

  • Обеспечение постоянства правил: в ubuntu должен быть iptables-persistent пакет, чтобы убедиться, что ваши правила сохранятся после перезагрузки. Просто установите свои правила и вперед apt-get install iptables-persistent и следите за интерактивным диалогом.

  • Улучшение стиля и безопасности: mzhaase дал очень хорошее руководство по написанию правил белых списков.

Вот простой способ предотвратить локаут. В принципе, он будет работать в любой системе * nix, а не только в Ubuntu.

Предположим, ваш скрипт называется /usr/local/bin/start-iptables.sh и вы полностью отключите iptables с помощью команды /usr/local/bin/stop-iptables.sh

/usr/local/bin/start-iptables.sh ; sleep 30 ; /usr/local/bin/stop-iptables.sh

Если вы запустите такие команды в одной строке, оболочка будет запускать их последовательно. Если вы нажмете Ctrl-c, вся командная строка будет прервана - это не просто отменит текущую команду и перейдет к следующей.

Итак, оболочка запустит ваш стартовый скрипт, а затем 30 секунд засыпает. В течение этих 30 секунд убедитесь, что вы все еще можете получить доступ к серверу. Создайте новое соединение, есть способы добавить новые соединения, но оставить существующее активным. Как только вы убедитесь, Control-c и сценарий сна и stop-iptables будут прерваны.

если ты делать заблокируйте себя, через 30 секунд запустится сценарий остановки, и вы вернетесь.