LINUX.ORG.RU
решено ФорумAdmin

nginx reverse proxy + iptables

 , ,


0

1

Здравствуйте. Есть две тачки А и Б, сидят они в одной локальной сети, обе смотрят в интернет. Т.е. на каждой по 2 сетевых интерфейса.

А
eth0 ии.ии.10.10
eth1 лл.лл.лл.111
где ии. лл. ip интернет и локал

Б
eth0 ии.ии.20.20
eth1 лл.лл.лл.222

шлюзы на тачках .10.1 и .20.1 соответственно

Сейчас реализована схема проброса пакетов через FORWARD в iptables, соответственно nginx не участвует. Кому интересно, схемка

## RESET table nat and filter (deafult)
/sbin/iptables -t nat -F
/sbin/iptables -F
/sbin/iptables -X

## ACCEPT
# allow eth1 lan
/sbin/iptables -A INPUT -i eth1 -j ACCEPT
# allow eth0 internet
/sbin/iptables -A INPUT -i eth0 -p icmp -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# allow loopback
/sbin/iptables -A INPUT -i lo -j ACCEPT
# allow http, https, ssh, any interface
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 8185 -j ACCEPT


# Пакеты с нужного адреса заворачиваем на компьютер
/sbin/iptables -t nat -A PREROUTING -p tcp ! --dport 22 -d ии.ии.10.10 -i eth0 \
-j DNAT --to-destination лл.лл.лл.222

# Получаем интернет в локалке
/sbin/iptables -t nat -A POSTROUTING -s лл.лл.1.0/24 -o eth0 \
-j SNAT --to-source ии.ии.10.10

# Меняем адрес источника на локальный
/sbin/iptables -t nat -A POSTROUTING -d лл.лл.лл.222 -p tcp \
-m tcp  -j SNAT --to-source лл.лл.лл.111

# Разрешаем соединение для новых, прошедших проверку, пакетов
/sbin/iptables -A FORWARD -p tcp -m conntrack --ctstate NEW \
-m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
/sbin/iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# Разрешаем протоколы для FORWARD
/sbin/iptables -A FORWARD -p tcp -m tcp --dport 8185  -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --dport 443 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT

# Установки по умолчанию
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP

Задумка такая: Пользователь из интернета > site.com > тачка A > iptables+nginx > тачка Б

по умолчанию, не работает

## RESET table nat and filter (deafult)
/sbin/iptables -t nat -F
/sbin/iptables -F
/sbin/iptables -X

## ACCEPT
# allow eth1 lan
/sbin/iptables -A INPUT -i eth1 -j ACCEPT
# allow eth0 internet
/sbin/iptables -A INPUT -i eth0 -p icmp -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# allow loopback
/sbin/iptables -A INPUT -i lo -j ACCEPT
# allow http, https, ssh, any interface
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 8185 -j ACCEPT

Также пробовал добавлять строчку

/sbin/iptables -t nat -A PREROUTING -p tcp ! --dport 22 -d ии.ии.10.10 -i eth0 \
-j DNAT --to-destination лл.лл.лл.222

Конфиг nginx:

upstream backend {
		server лл.лл.лл.222:443;
}

    ## HTTP > HTTPS
server {

		listen 80;

		server_name site.com;
		#return 301 https://$server_name$request_uri;
		return 301 https://site.com;

		access_log /var/log/nginx/site_access.log;
		error_log /var/log/nginx/site_error.log;
}

server {

		listen 443 ssl;

        server_name site.com;

    ## SSL
	ssl_certificate			/etc/nginx/crt/site.com.crt;
	ssl_certificate_key		/etc/nginx/crt/site.com.key;
	ssl_session_cache		shared:SSL:10m;
        ssl_session_timeout		10m;
        ssl_verify_client		off;
        ssl_protocols			TLSv1.2;
        ssl_ciphers			RC4:HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {

    ## backend site
			proxy_pass https://backend;

    ## тут пробовал играться
#		    proxy_redirect<---->off;
#		    proxy_set_header<-->Host<-->		site.com;
#		    proxy_set_header<-->X-Real-IP<----->$remote_addr;
#		    proxy_set_header<-->X-Forwared-For<>$proxy_add_x_forwarded_for;
#		    proxy_ssl_session_reuse off;
		}

    ## LOGS
        access_log /var/log/nginx/site_ssl_access.log;
        error_log /var/log/nginx/site_ssl_error.log error;
}

Проблему решил очень просто. Заставил nginx слушать внешний интерфейс ip:80 ip:443, почему-то если просто указать порт, то не работает как надо. Ну и через форвард направил только один порт - 8185.

imsystem ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.