Назад | Перейти на главную страницу

Правила iptables tcp прокси не работают

У меня есть несколько серверов, которым необходимо подключиться к удаленной службе. Эти серверы являются экземплярами ec2 под моим контролем. Удаленная служба работает на сервере, управляемом моей компанией, но не моим отделом, и я не уверен, где она размещена. По соображениям безопасности удаленная служба разрешает доступ к службе только одному IP-адресу (это эластичный IP-адрес AWS) на определенном порту, поэтому все запросы должны проходить через прокси. Я просмотрел несколько примеров того, как это сделать, перепробовал множество различных изменений, но, похоже, ни один из них не работал. Я попытался создать правила, основываясь на моих знаниях iptables, и получил именно то, что у меня уже было (что до сих пор не работает). Я надеюсь, что кто-то поможет мне быстро заставить это работать.

$ cat /proc/sys/net/ipv4/ip_forward
1

$proxy_ip
$remote_server_ip
$remote_server_port

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -d $proxy_ip/32 -p tcp -m tcp --dport $remote_server_port -j DNAT --to-destination $remote_server_ip:$remote_server_port
-A POSTROUTING -d $remote_server_ip/32 -p tcp -m tcp --dport $remote_server_port -j SNAT --to-source $proxy_ip
COMMIT
# Completed on Mon Sep 17 17:28:07 2012
# Generated by iptables-save v1.4.12 on Mon Sep 17 17:28:07 2012
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1376:205512]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --name DEFAULT --rsource -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -p tcp -m tcp --dport $remote_server_port -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Sep 17 17:28:07 2012

Бонусные баллы для всех, кто может сказать мне, что не так с моими двумя правилами ограничения скорости по ssh, которые также не работают.

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

Эти правила действительно работают, просто моя методика тестирования была нарушена. Я пересылаю MS SQL из кластера в удаленную БД. Но я не могу на самом деле проверить, что он работает, потому что единственный IP-адрес, которому разрешено попадать в удаленную БД, используется одним сервером, который не проксирует другие запросы, и он находится в производстве. Итак, я пытался использовать curl, чтобы попасть на другой веб-сервер через прокси и посмотреть, получу ли я ответ. Тогда я мог бы просто переключить IP-адреса и порты, и, надеюсь, это сработает.

Но моей проблемой было правило

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

улавливал все поступающие ответы и не пересылал их. Как только я это понял, я закомментировал это правило, и все заработало. А так как в продакшене это будет совершенно другой порт, это правило не повлияет отрицательно на прокси.

Спасибо всем, кто потратил время на попытки понять мою ошибку.