Я работаю на сервере и должен его настроить так, чтобы запросы на порт 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 секунд запустится сценарий остановки, и вы вернетесь.