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

Как работает цепочка OUTPUT iptables?

Первый опыт работы с iptables, использование его для перенаправления трафика с порта 80 на 8080, чтобы я мог запускать сервер приложений только с разрешениями пользователя. Я решил проблему, но я не знаю, почему это работает, и я надеялся, что все исправит.

Мой iptables -t nat -L выглядит следующим образом:

Chain PREROUTING (policy ACCEPT)  
target    prot  opt source     destination
REDIRECT  tcp   --  anywhere   anywhere            tcp dpt:http redir ports 8080

Chain OUTPUT (policy ACCEPT)  
targetprot  opt source     destination
REDIRECT  tcp   --  anywhere   localhost           tcp dpt:http redir ports 8080
REDIRECT  tcp   --  anywhere   _hostname_          tcp dpt:http redir ports 8080

Две вещи о правилах OUTPUT, которые я не мог понять:

1) Разве я не должен перенаправляться на порт 80 вместо 8080? Перенаправление на 8080 кажется мне неправильным, потому что у меня создалось впечатление, что клиенты отправляют запросы на 80. Разве они не ожидали бы ответов от них?

2) Почему ссылки на localhost и имя хоста Вот? Если это ВЫХОД, разве пункт назначения не находится буквально где-нибудь, НО здесь?

Любые ответы приветствуются - я полный нуб, и это не особенно срочно, но я хочу это понять.

Следует знать две вещи:

Во-первых, DNAT (REDIRECT) должен автоматически «исправить» информацию об IP / порте на обратном пути с помощью conntrack. Следовательно, в iptables нет явного правила для отображения порта 8080 обратно на 80, это обрабатывается автоматически. Вы можете увидеть Conntrack в действии под /proc/net/ip_conntrack или используя Conntrack-Tools пакет.

Во-вторых, цепочка OUTPUT предназначена для пакетов, исходящих на этом компьютере, а PREROUTING предназначена для пакетов, поступающих на компьютер извне. Есть объяснение Вот, но данная блок-схема основана на работе брандмауэра, поэтому она не показывает путь, по которому проходит пакет при отправке самому себе. По сути, эти два правила OUTPUT должны гарантировать, что если вы подключаетесь с сервера к самому себе (адрес назначения - 127.0.0.1 или общедоступный IP), соединение перенаправляется с 80 на 8080.