Я пытаюсь сделать брандмауэр для моего малинового пи. Правила, которые я хочу, это

  1. Разрешить входящий SSH - это работает

  2. Разрешить исходящий SSH - это не работает, и это моя главная проблема

  3. Разрешить входящий и исходящий VNC - в настоящее время это полуработы, где я могу подключиться, но я не могу выполнять какие-либо действия. Не совсем приоритет
  4. Разрешить исходящий https - я могу зайти на сайт, но думаю, что мне нужно добавить еще одну строку для DNS, чтобы это работало корректно при загрузке.
  5. Разрешить исходящие письма - это работает
  6. Разрешить исходящие пинг и получить ответ - это работает
  7. Отбросьте все остальное - думаю, это работает, потому что я не могу создать исходящий SSH, поэтому я считаю, что проблема в моем правиле.

Я знаю, что мой SSH работает в целом, так как без загруженного брандмауэра я могу сделать исходящий SSH от одного пи к другому.

    #!/bin/sh

    #Flush all rules
    iptables -F

    #Allow incoming and outgoing SSH
    sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A OUTPUT  -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

    #Allow VNC sessions
    sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
    sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT

    #Accept only incoming etstablished and allow new or established outgoing
    sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    #Accept port 587 for email
    sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
    sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #Allow ping requests to go out and get a reply
    sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

    #Drop all other packets and protocols
    sudo iptables -P INPUT DROP
    sudo iptables -P FORWARD DROP
    sudo iptables -P OUTPUT DROP

2 ответа2

1

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

Чтобы это исправить, самый простой способ - использовать --dport вместо --sport , разрешив каждое соединение с портом назначения 22 (ssh).

sudo iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Обратите внимание, что вы должны добавить эту строку вместо ее замены, как @ bcs78 указал в комментариях.

Также обычно плохая идея блокировать трафик для внутреннего петлевого соединения. Некоторые программы используют это соединение и без него не будут работать должным образом. Добавьте это в начало вашего скрипта:

sudo iptables -A INPUT -i lo -j ACCEPT
0

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

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Плюс обычное правило интерфейса lo разрешающее все локальные сервисы, удалите его, если считаете, что оно действительно не нужно:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Теперь вам не нужно дублировать другие ваши правила (я покидаю состояние NEW когда оно было там, даже если оно не очень полезно и не присутствует постоянно):

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT

iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

Все позаботилось о первых двух правилах, не нужно дублировать каждое правило, и теперь начальное направление потока ясно: INPUT или OUTPUT , только один раз. Таким образом, становится яснее, что --sport 22 для SSH не помог в исходящем случае (--dport 22 необходим). RELATED был бы полезен, если бы существовали правила udp для связанных ответов об ошибках icmp . В этой настройке это может не понадобиться.

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