Первый опыт работы с 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.