Advertisement
Guest User

Untitled

a guest
Jan 12th, 2011
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.24 KB | None | 0 0
  1. Пример :
  2. iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-
  3. 192.168.1.10
  4. Ключ -- to - destination указывает, какой IP адрес должен быть подставлен в качестве адреса места
  5. назначения. В выше приведенном примере во всех пакетах, пришедших на адрес 15.45.23.67, адрес
  6. назначения будет изменен на один из диапазона от 192.168.1.1 до 192.168.1.10. Как уже указывалось
  7. выше, все пакеты из одного потока будут направляться на один и тот же адрес, а для каждого нового
  8. потока будет выбираться один из адресов в указанном диапазоне случайным образом. Можно также
  9. определить единственный IP адрес. Можно дополнительно указать порт или диапазон портов, на
  10. который (которые) будет перенаправлен траффик. Для этого после ip адреса через двоеточие укажите
  11. порт, например --to-destination 192.168.1.1:80, а указание диапазона портов выглядит так: --to-destination
  12. 192.168.1.1:80-100. Указание портов допускается только при работе с протоколом TCP или UDP, при
  13. наличии опции --protocol в критерии.
  14. Действие DNAT достаточно сложно в использовании и требует дополнительного пояснения.
  15. Рассмотрим простой пример. У нас есть WEB сервер и мы хотим разрешить доступ к нему из Интернет.
  16. Мы имеем только один реальный IP адрес, а WEB-сервер расположен в локальной сети. Реальный IP
  17. адрес $INET_IP назначен брандмауэру, HTTP сервер имеет локальный адрес $HTTP_IP и, наконец
  18. брандмауэр имеет локальный адрес $LAN_IP. Для начала добавим простое правило в цепочку
  19. PREROUTING таблицы nat:
  20. iptables -t nat -A PREROUTING --dst $INET_IP -p tcp --dport 80 -j DNAT \
  21. --to-destination $HTTP_IP
  22. В соответствии с этим правилом, все пакеты, поступающие на 80-й порт адреса $INET_IP
  23. перенаправляются на наш внутренний WEB-сервер. Если теперь обратиться к WEB-серверу из
  24. Интернет, то все будет работать прекрасно. Но что же произойдет, если попробовать соединиться с ним
  25. из локальной сети? Соединение просто не установится. Давайте посмотрим как маршрутизируются
  26. пакеты, идущие из Интернет на наш WEB-сервер. Для простоты изложения примем адрес клиента в
  27. Интернет равным $EXT_BOX.
  28. 1. Пакет покидает клиентский узел с адресом $EXT_BOX и направляется на $INET_IP
  29. 2. Пакет приходит на наш брандмауэр.
  30. 3. Брандмауэр, в соответствии с вышеприведенным правилом, подменяет адрес назначения и передает
  31. его дальше, в другие цепочки.
  32. 4. Пакет передается на $HTTP_IP.
  33. 5. Пакет поступает на HTTP сервер и сервер передает ответ через брандмауэр, если в таблице
  34. маршрутизации он обозначен как шлюз для $EXT_BOX. Как правило, он назначается шлюзом по-
  35. умолчанию для HTTP сервера.
  36. 6. Брандмауэр производит обратную подстановку адреса в пакете, теперь все выглядит так, как будто
  37. бы пакет был сформирован на брандмауэре.
  38. 7. Пакет передается клиенту $EXT_BOX.
  39. А теперь посмотрим, что произойдет, если запрос посылается с узла, расположенного в той же
  40. локальной сети. Для простоты изложения примем адрес клиента в локальной сети равным $LAN_BOX.
  41. 1. Пакет покидает $LAN_BOX.
  42. 2. Поступает на брандмауэр.
  43. 3. Производится подстановка адреса назначения, однако адрес отправителя не подменяется, т.е.
  44. исходный адрес остается в пакете без изменения.
  45. 4. Пакет покидает брандмауэр и отправляется на HTTP сервер.
  46. 5. HTTP сервер, готовясь к отправке ответа, обнаруживает, что клиент находится в локальной сети
  47. (поскольку пакет запроса содержал оригинальный IP адрес, который теперь превратился в адрес
  48. назначения) и поэтому отправляет пакет непосредственно на $LAN_BOX.
  49. 6. Пакет поступает на $LAN_BOX. Клиент "путается", поскольку ответ пришел не с того узла, на
  50. который отправлялся запрос. Поэтому клиент "сбрасывает" пакет ответа и продолжает ждать
  51. "настоящий" ответ.
  52. Проблема решается довольно просто с помощью SNAT. Ниже приводится правило, которое выполняет
  53. эту функцию. Это правило вынуждает HTTP сервер передавать ответы на наш брандмауэр, которые
  54. затем будут переданы клиенту.
  55. iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \
  56. --to-source $LAN_IP
  57. Так как цепочка POSTROUTING обрабатывается самой последней и к этому моменту пакет уже
  58. прошел процедуру преобразования DNAT, поэтому критерий строится на базе адреса назначения
  59. $HTTP_IP.
  60. Если вы думаете, что на этом можно остановиться, то вы ошибаетесь! Представим себе ситуацию,
  61. когда в качестве клиента выступает сам брандмауэр. Тогда, к сожалению, пакеты будут передаваться на
  62. локальный порт с номером 80 самого брандмауэра, а не на $HTTP_IP. Чтобы разрешить и эту проблему,
  63. добавим правило:
  64. iptables -t nat -A OUTPUT --dst $INET_IP -p tcp --dport 80 -j DNAT \
  65. --to-destination $HTTP_IP
  66. Действие REDIRECT
  67. Действие REDIRECT выполняет перенаправление пакетов и потоков на другой порт той же самой
  68. машины. К примеру, можно пакеты, поступающие на HTTP порт перенаправить на порт HTTP proxy.
  69. Действие REDIRECT очень удобно для выполнения "прозрачного" проксирования (transparent
  70. proxying), когда машины в локальной сети даже не подозревают о существовании прокси.
  71. REDIRECT может использоваться только в цепочках PREROUTING и OUTPUT таблицы nat.
  72. Ключ : --to-ports
  73. Пример :
  74. iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
  75. Ключ --to-ports определяет порт или диапазон портов назначения. Без указания ключа --to-ports,
  76. перенаправления не происходит, т.е. пакет идет на тот порт, куда и был назначен. В примере,
  77. приведенном выше, --to-ports 8080 указан один порт назначения. Если нужно указать диапазон портов,
  78. то мы должны написать нечто подобное --to-ports 8080-8090. Этот ключ можно использовать только в
  79. правилах, где критерий содержит явное указание на протокол TCP или UDP с помощью ключа
  80. --protocol.
  81. Вот мы и рассмотрели основные моменты касающиеся трансляции адресов с помощью linux iptables .
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement