Маршрутизация пакетов интерфейса Linux tun

Маршрутизация пакетов интерфейса Linux tun

У меня есть вопросы по потоку IP-пакетов для следующего сценария.

Сценарий таков:

  1. Интерфейс tun0 (10.0.0.2/8) и физическая беспроводная сетевая карта wlan0 (IP-адрес не фиксирован) на стороне клиента, wlan0 может подключаться к Интернету,
  2. Другой интерфейс tun0 (10.0.0.1/8) и физическая карта Ethernet eth0 (192.168.1.38/24) на стороне сервера (Ubuntu 12.04 amd64), eth0 находится в частной сети за брандмауэром NAT и может подключаться к Интернету через брандмауэр (брандмауэр как шлюз),
  3. запустили " echo 1 > /proc/sys/net/ipv4/ip_forward" на стороне сервера,
  4. запустили " iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE" на стороне сервера,

Вот схема сценария:

---------------          ----------------
|             |          |              |
| client tun0 |----------| client wlan0 |
|  10.0.0.2   |          |  ip not fix  |
|             |          |              |
---------------          ----------------
                                |
                                |

                             internet

                                |
                                |
                         ----------------
                         |              |
                         |   firewall   |
                         |   (gateway)  |
                         | 192.168.1.1  |
                         |              |
                         ----------------
                                |
                                | private network
                                | 192.168.1.0/24
                                |
---------------          ----------------
|             |          |              |
| server tun0 |----------| server eth0  |
|  10.0.0.2   |          | 192.168.1.38 |
|             |          |              |
---------------          ----------------

Я использовал две очень простые клиент-серверные программы, похожие на VPN, для чтения/записи IP-пакетов двух интерфейсов tun0 и создания туннеля между wlan0 и eth0, чтобы IP-пакеты с 10.0.0.2 могли достигать 10.0.0.1 и наоборот (например, можно было запустить ftp с 10.0.0.1 на 10.0.0.2).

Однако, если я хочу использовать клиент tun0 (10.0.0.2) для просмотра веб-страниц, http-запрос будет исходить из 10.0.0.2 и направляться на интернет-IP-адрес (конечно, не 10.0.0.1). http-запрос (я думаю) после достижения сервера tun0 (10.0.0.1) будет перенаправлен на сервер eth0 (так как ip_forward включен, и я думаю, что этот перенаправленный http-запрос все еще будет иметь исходный IP-адрес 10.0.0.2, поправьте меня, если я ошибаюсь), и там происходит NAT для переупаковки http-запроса как исходящего из eth0 (т. е. исходный IP-адрес меняется на 192.168.1.38, так как я запустил команду iptables), а затем переупакованный http-запрос проходит через брандмауэр (а затем и через Интернет) к месту назначения.

Когда http-ответ (с веб-сайта) достигает сервера eth0, там должен произойти обратный NAT. Мой вопрос:

  1. вернет ли обратный NAT IP-адрес назначения http-ответа на 10.0.0.2,
  2. как сервер eth0 узнает, куда пересылать ответ http с обратным NAT?
  3. перешлет ли eth0 http-ответ на сервер tun0 (10.0.0.1), поскольку IP-адрес назначения ответа преобразован с помощью обратного NAT в 10.0.0.2?
  4. нужно ли мне добавить маршрут на стороне сервера для правильной маршрутизации/пересылки обратного NAT-ответа http? Если да, то как?
  5. нужно ли мне добавить некоторые правила iptables на стороне сервера для правильной маршрутизации/пересылки обратного NAT-ответа http? Если да, то как?

решение1

Предполагая, что ваш клиент отправляет весь трафик через tun0, вам необходимо добавить следующее на стороне сервера (после включения /proc/sys/net/ipv4/ip_forward):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT

После этого шага при просмотре веб-страниц с вашего клиента поток пакетов будет следующим:

  1. Клиент отправит пакет на 10.0.0.1.
  2. На стороне сервера пакет, полученный на tun0, будет транслироваться из 10.0.0.2 в 192.168.1.38.
  3. В таблице NAT будет создана запись сопоставления.
  4. Пакет будет отправлен в Интернет через 192.168.1.1 (шлюз).
  5. Ответ будет получен по адресу 192.168.1.38.
  6. Обратный NAT будет выполнен в соответствии с записью сопоставления, созданной на шаге 3.
  7. Ответный пакет будет перенаправлен обратно на 10.0.0.2.

Надеюсь, я не упустил какой-то важный шаг :)

Связанный контент