Как я могу заблокировать все, кроме трех портов в Ubuntu?

22

Как я могу заблокировать все порты, кроме 1962, 999, 12020?

Один порт для SSH и два других для своего рода скрипта. Итак, необходимо разрешить исходящие на этих портах, верно?

Мои iptables:

# Generated by iptables-save v1.4.4 on Sat Feb 25 17:25:21 2012
*mangle
:PREROUTING ACCEPT [643521:136954367]
:INPUT ACCEPT [643521:136954367]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [645723:99904505]
:POSTROUTING ACCEPT [645723:99904505]
COMMIT
# Completed on Sat Feb 25 17:25:21 2012
# Generated by iptables-save v1.4.4 on Sat Feb 25 17:25:21 2012
*filter
:INPUT ACCEPT [643490:136950781]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [645723:99904505]
-A INPUT -p tcp -m tcp --dport 1962 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 999 -j ACCEPT 
COMMIT
# Completed on Sat Feb 25 17:25:21 2012
# Generated by iptables-save v1.4.4 on Sat Feb 25 17:25:21 2012
*nat
:PREROUTING ACCEPT [5673:734891]
:POSTROUTING ACCEPT [2816:179474]
:OUTPUT ACCEPT [2816:179474]
COMMIT
# Completed on Sat Feb 25 17:25:21 2012

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

okapa
источник
Почему бы не использовать UFW?
Совьеро

Ответы:

25

Сначала вы всегда должны промывать, чтобы убедиться, что уже определено ... ничего

iptables -F

Затем установите политику по умолчанию для цепочки INPUT на DROP, если достигнут конец и не найдено ни одного правила:

iptables -P INPUT DROP

Чтобы убедиться, что петля не затронута, вы должны добавить

iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

разрешить весь трафик в lo-if и каждый входящий трафик для установленных вами соединений. После этого добавьте все правила, которые вам нужны для ваших служб (не забудьте открыть ssh, если вам это нужно! Иначе вы вышли) :

iptables -A INPUT -p tcp -m tcp --dport 1962 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 999 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 12020 -j ACCEPT 

Небольшой трюк, который я делаю, чтобы не дать себе и другим случайно вскрыть дыры в безопасности, и наконец добавляю:

iptables -A INPUT -j DROP

Эта строка соответствует всему для цепочки INPUT, и политика не должна ничего получать. Преимущество этого в том, что даже если вы добавляете ACCEPT-правило через некоторое время после инициализации набора правил, оно никогда не станет проверенным, потому что все ранее было отброшено. таким образом, вы должны хранить все в одном месте.

На ваш вопрос все выглядит примерно так:

iptables -F
iptables -P INPUT DROP
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1962 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 999 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 12020 -j ACCEPT 
iptables -A INPUT -j DROP
Мос
источник
1
Просто чтобы уточнить: -Pустанавливает политику в цепочке. Это на самом деле не добавление правила. Политика цепочки указывает действие, которое должно быть выполнено над пакетом, если достигнут конец цепочки. Из-за этого разумно добавлять свои правила перед установкой DROPполитики.
Бельмин Фернандес
Если я правильно помню, обычно не имеет значения, где устанавливать политику ... возможно, мне следует немного изменить свой ответ.
Моисей
3
одно замечание: будьте очень осторожны при настройке политики по умолчанию, запрещайте и сбрасывайте при настройке брандмауэра через ssh. Вы заперетесь. Да, я сделал это. :-) Теперь я обычно делаю последнее правило iptables -A INPUT -j DROPвместо этого, по этой самой причине.
Sirex
Я немного выделил предупреждение ssh ;-)
Mose
@Mose: исправить на это не имеет значения, как правило. Я пытался это подчеркнуть. Но это может привести к тому, что вы будете заблокированы, как уже упоминалось хе.
Бельмин Фернандес
20

Ответ от новичка, такого же как вы :-) Мне также нужно было защитить свой сервер Ubuntu, изучение iptables было болью, которую я не мог преодолеть. UFW (Uncomplicated Firewall) - это программа, которая максимально упрощает настройку брандмауэра.

  • установить UFW:

    sudo apt-get install ufw
    
  • немедленно отключите его (мне пришлось выполнить аварийно-загрузочную загрузку, потому что я был заблокирован из своего собственного входа в SSH):

    sudo ufw disable
    
  • установите "deny" как правило по умолчанию (это блокирует все порты):

    sudo ufw default deny
    
  • разрешить порты вам нужно:

    sudo ufw allow to 1962
    sudo ufw allow to 999
    sudo ufw allow to 12020
    
    sudo ufw allow from 1962
    sudo ufw allow from 999
    sudo ufw allow from 12020
    
  • если вы уверены, что приведенные выше правила не нарушают ваше ssh-соединение, включите ufw:

    sudo ufw enable
    

Документы хорошо написаны и предоставляют больше примеров: https://help.ubuntu.com/community/UFW

Влад Герасимов
источник
1
При работе с конфигурациями брандмауэра может быть хорошей идеей создать задание cron, которое снова отключит брандмауэр. На всякий случай, если вас заблокируют.
Пымкин
Обратите внимание, что это не работает с UFW 0,35, выбрасывая ошибки, как ERROR: Bad destination addressиERROR: Bad source address
Дейв
А как разрешить все порты кроме одного порта для конкретного интерфейса? Я использую правило запрета по умолчанию и хочу заблокировать DNS-порт 53 на интерфейсе Ethernet, чтобы предотвратить утечку DNS при использовании VPN. В настоящее время я должен разрешить все порты, которые я хочу использовать для частных диапазонов IP, что не очень удобно.
baptx