Iptables перенаправляет с 80 на 8080, но блокирует доступ к общественному 8080
У меня есть несколько правил iptables
, которые перенаправляют запросы на порт 80 на наш сервер приложений (GlassFish) на порт 8080 (а также на порты SSL, но я их оставил для простоты).
В то время как у нас все работает нормально (и у меня лично нет проблем), порт 8080 также открыт для внешнего мира, если кто-то хочет указать его в URL-адресе. Утверждено, что порт 8080 должен быть закрыт от доступа из внешнего мира, и только 80 будут открыты.
Я не хочу менять слушателя на сервере приложений (для использования порта 80 для этого требуется, чтобы ему было необходимо получить права доступа для пользователя, на котором запущен сервер приложений), а слушатель на порту 8080 должен знать IP-адрес источника пакет, поскольку приложение проверяет запросы к приложению (т.е. мы не можем изменить исходный IP-адрес на локальный).
Ниже приведена текущая конфигурация iptables
. Кто-нибудь знает, есть ли способ блокировать 8080 из общедоступного Интернета, сохраняя исходный IP-адрес в пакетах, перенаправленных с порта 80?
Большое спасибо заранее.
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
# allow establishment of connections initialised by my outgoing packets
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# accept anything on localhost
iptables -A INPUT -i lo -j ACCEPT
################################################################
#individual ports tcp
################################################################
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
#drop everything else
iptables -A INPUT -j DROP
################################################################
#Redirection Rules
################################################################
# redirection rules (allowing forwarding from localhost)
iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080
# redirection http
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
Ответы
Ответ 1
Один из способов, который я нашел для этого, - использовать цель MARK в цепочке PREROUTING таблицы mangle.
Добавьте правило для тега пакетов, которые вы хотите заблокировать:
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 1
Затем, прежде чем разрешить порт 8080 добавить это в DROP помеченные пакеты:
iptables -A INPUT -m mark --mark 1 -j DROP
Ответ 2
Я обработал это несколько иначе. Я переслал 443-3000 (как указано выше), но также перешёл от 3000 до 443. Затем я разрешаю трафик на 3000, но блокирую его на 443. Когда фильтрация трафика 443 должна быть только из порта 3000.
Я использую ufw, поэтому правила фильтра были введены с использованием этого инструмента. Я добавил правила nat в /etc/ufw/before.rules
.
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 3000 -j REDIRECT --to-ports 443