2

Я недавно установил Oracle Linux 6 на домашнем сервере, и у меня были проблемы с разрешением портов проходить через брандмауэр (iptables). Я попытался добавить порты с помощью команды

iptables -I INPUT -p tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT

Моя текущая конфигурация правил:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.0.0/24       anywhere            tcp dpt:ldap 
ACCEPT     tcp  --  192.168.0.0/24       anywhere            tcp dpt:x11 
ACCEPT     tcp  --  192.168.0.0/24       anywhere            tcp dpt:vnc-server 
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with     icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Однако я не могу получить доступ к этим портам (за исключением ssh, который, по-видимому, был автоматически настроен) с любых устройств в моей сети (все из которых начинаются с 192.168.0.*). Если я очищаю таблицы (iptables -F), все соединения работают. Я сохранил и перезагрузил таблицу. Есть идеи, почему это не работает?

1 ответ1

3

iptables обрабатывает пакеты в соответствии с каждым правилом по порядку. Вы добавляете правило для принятия трафика HTTP после правила, которое отклоняет весь трафик:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

...

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http

Если пакет не соответствует ни одному из более ранних правил, он заканчивается здесь. Если это новое TCP-соединение с SSH, оно соответствует первому правилу. Если это не так (например, если это HTTP-пакет), он переходит к следующему правилу, которое отклоняет любой трафик, который не был сопоставлен до этого момента. Из-за этого последнее правило никогда не будет сопоставлено, поскольку любой новый HTTP-трафик уже будет отклонен предыдущим правилом.

Я не уверен, как Oracle Linux рекомендует настраивать правила брандмауэра (например, Ubuntu поощряет использование ufw). Одна простая вещь - вставить HTTP-правило перед REJECT (iptables -I INPUT $INDEX , где $INDEX - индекс правила REJECT). Другой, который больше соответствует духу iptables - это удалить явное правило REJECT и изменить политику по умолчанию на REJECT . Это приводит к неявному отклонению пакета для любой упаковки, которая не соответствует правилу, поэтому вы можете просто добавить ACCEPT в конец и не беспокоиться о размещении их перед явным REJECT .

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