Я прочитал много статей и ответов по этой теме, и я обсуждал со службой поддержки Linode, но, похоже, никто не может ответить на мою точную проблему.
Кажется, просто - я бы хотел использовать брандмауэр iptables для ограничения доступа ко всем портам, кроме 22, 80 и 443. У Linode есть отличная запись здесь: https://library.linode.com/securing-your-server#sph_creating-a-firewall и я использовал их правила брандмауэра как есть. Брандмауэр работает хорошо.
Я также хочу предварительно маршрутизировать некоторые порты, потому что это приложение nodejs. Итак, я использовал:
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000
Эти правила работают, если у меня нет правил брандмауэра. Фактически, я использую их прямо сейчас, но мне пришлось отключить брандмауэр.
Если я добавлю правила брандмауэра, PREROUTING
перестает работать. Если я сохраню активные правила iptables в файл для просмотра, и брандмауэр (правила фильтрации), и PREROUTING
(nat rules) присутствуют, но работают только правила межсетевого экрана. Посмотреть здесь:
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*security
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*raw
:PREROUTING ACCEPT [1620:139613]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*nat
:PREROUTING ACCEPT [4:248]
:INPUT ACCEPT [6:376]
:OUTPUT ACCEPT [12:728]
:POSTROUTING ACCEPT [12:728]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*mangle
:PREROUTING ACCEPT [1620:139613]
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
:POSTROUTING ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
Если я использую iptables -F
, он очистит только правила брандмауэра (фильтра) и PREROUTING
снова начнет работать. Так что это определенно конфликт. Порядок блоков правил не имеет значения, так как это (выше) стандартный вывод iptables независимо от порядка, в котором я сохранил правила в iptables.
Мне кажется, что это одно из двух:
PREROUTING
порты, которые также имеют правило ACCEPT, могут означать, что предварительная маршрутизация игнорируетсяPREROUTING
на порт, который технически заблокирован (но я думал, что здесь появился "PRE")Кто-нибудь знает?
Спасибо!
Павел
После PREROUTING локальные пакеты попадают в локальный фильтр, где они отбрасываются (ваш случай 2).
Поэтому вам просто нужно разрешить входящий трафик на эти порты в iptables:
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT
Поскольку вы перенаправляете трафик http (s) с 80/443 на 8080/3000, это похоже на то, что последние порты открыты и в любом случае доступны для Интернета, поэтому нет никакой разницы с внешним wrorld и нет никаких дополнительных последствий для безопасности.