У меня есть такое правило iptables:
iptables -t nat -I PREROUTING -p tcp --dport 80 -s 192.168.1.2 -j DNAT --to-destination 192.168.1.1:80
он работает отлично ... но я хочу перенаправить только для одного URL-адреса, например:
iptables -t nat -I PREROUTING -p tcp --dport 80 -s 192.168.1.2 -m string --string "google.com" -j DNAT --to-destination 192.168.1.1:80
который никак не работает ... пожалуйста, помогите мне с этим
Это не сработает. Таблицу NAT пересекает только первый пакет каждого соединения. Строки будут видны только в третьем пакете, содержащем полезную нагрузку.
Для этого вам следует использовать прокси в прозрачном режиме, если вы не хотите настраивать его в браузерах.
Эти правила делают то же самое. Независимо от того, какой из них соответствует, результат будет одинаковым.
Любой пакет, который может соответствовать второму правилу, уже будет соответствовать первому правилу. Даже если пакет сделал соответствует второму правилу, оно ничем не отличается от первого правила. (На самом деле Иэн правильно указал на -I
в ваших правилах, что означает, что правила на самом деле расположены в обратном порядке.)
Я должен предупредить вас, что попытка изменить потоки пакетов так, как вы делаете, не сработает так, как вы ожидаете. IPTables работает на пакет уровень, а не связь уровень. Правило с --string "google.com"
будет соответствовать пакету (пакетам) на этой странице, которые содержат строку "google.com", но не содержат какой-либо части подтверждения TCP и не содержат других пакетов, не содержащих "google.com". Эта страница в настоящее время занимает около 45 КБ, что составляет около 30 пакетов, и только два из них будут соответствовать. Правило с --string "google.com"
вероятно, не будет соответствовать ни одному пакету с реальной домашней страницы Google. Он может перенаправлять запросы DNS, если это происходит по TCP.
Как отметил @diegows в своем ответе, только первый пакет любого TCP-соединения проходит через таблицу nat, потому что вы не можете перенаправить пакеты в середине TCP-соединения и ожидать, что он будет работать, поэтому они не делают это возможным. Даже если вы поместите такое правило в другую таблицу, оно все равно не сработает.