Попытка разрешить входящий трафик ssh на порт 22. По умолчанию весь входящий трафик отбрасывается.
Я наткнулся на 2 статьи о том, как разрешить трафик. Однако они разные.
## open port ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
Против
# Allow all incoming SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Похоже, что первый разрешает весь трафик, а затем определяет конкретную сеть. Кажется, что это взаимоисключающие?
В чем разница между этими двумя и какой из них я должен использовать?
У обоих этих наборов правил есть проблемы, и я бы не стал использовать ни один из них как есть.
В первом наборе первое правило разрешает новый входящий трафик на порт назначения 22 из любого места. Это не проблема.
Первая проблема заключается в том, что второе правило разрешает новый входящий трафик на порт назначения 22 из определенной подсети. Это полностью избыточно, поскольку первое правило разрешает трафик из любого места.
Я предполагаю, что вы читали какой-то учебник, в котором эти правила использовались в качестве (взаимоисключающих) примеров, предлагая вам выбрать одно или другое, но не оба.
Вторая проблема заключается в том, что перед этим правилом требуется другое правило, чтобы сделать брандмауэр полностью отслеживающим состояние, и это правило здесь отсутствует. Без этого правила будет разрешен только пакет SYN, и соединение никогда не будет завершено.
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Второй набор правил имеет аналогичную проблему. Я не знаю, кто изначально написал этот набор правил, но он был широко скопирован по всему Интернету. Похоже, он был написан кем-то, кто не был знаком с брандмауэрами с отслеживанием состояния в целом или с iptables в частности.
В этом наборе правил правило ввода разрешает новый и установленный входящий трафик на порт назначения 22 из любого места. Затем правило вывода разрешает установленный трафик с исходного порта 22 куда угодно. По сути, это зеркало первого правила, и что-то подобное требуется, если ваша политика по умолчанию исходящий трафик должен отбросить или отклонить его.
Проблема в том, что эти исходящие правила очень быстро становятся избыточными, что приводит к проблемам с производительностью, а также к проблемам понимания для всех людей, которым придется читать правила позже. Если вы отбрасываете исходящий трафик, необходимо только одно правило для установленного исходящего трафика (соответствующего разрешенному входящему трафику) на любом порту, независимо от того, сколько входящих портов вы разрешаете.
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Для брандмауэра хоста, где политика ввода по умолчанию - запрещать трафик, а политика вывода по умолчанию - разрешать трафик, большая часть ваших правил будет в таблице INPUT. Достаточно иметь правило с отслеживанием состояния, а затем правила, чтобы открывать порты для любого необходимого входящего трафика.
Например, чтобы разрешить соединения ssh и http:
-P INPUT DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
Если вы также запрещаете выходной трафик по умолчанию, вам необходимо разрешить обратный трафик для этих разрешенных входящих подключений.
-P OUTPUT DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
И это брандмауэр, который настолько прост и эффективен, насколько может быть iptables.
строка 1 Первого набора разрешит ВХОДЯЩИЙ трафик порта 22, если соединение = НОВОЕ СОЕДИНЕНИЕ. Строка 2 первого набора кажется необязательной, поскольку разрешает только трафик порта 22 для установленного диапазона сети, также должны быть новые соединения. Однако предыдущее правило в строке 2 уже разрешило трафик.
Это кажется неправильным или неполным
2-й набор, строка 1, разрешить входящий трафик на 0, если порт = 22 и новое или установленное соединение, строка 2, ограничить исходящий трафик, если устройство = eth0 и порт = 22 и соединение установлено
Это разрешит SSH-соединения с этим хостом, а также разрешит исходящий SSH.
2-й комплект - ваш лучший вариант
Верхний кажется немного сбитым с толку относительно того, что он пытается сделать, он разрешает только ssh-пакеты, если iptables не видит трафик в обоих направлениях, очень странно.
Нижняя строка намного более разумна, но вторая строка является избыточной, если у вас нет политики, отличной от ACCEPT в вашей цепочке OUTPUT. (iptables -L и найдите «ВЫВОД ЦЕПИ (политика XXXXXX)»).
Вероятно, вам просто нужна первая строка нижнего набора.