
У меня есть вопросы по потоку IP-пакетов для следующего сценария.
Сценарий таков:
- Интерфейс tun0 (10.0.0.2/8) и физическая беспроводная сетевая карта wlan0 (IP-адрес не фиксирован) на стороне клиента, wlan0 может подключаться к Интернету,
- Другой интерфейс tun0 (10.0.0.1/8) и физическая карта Ethernet eth0 (192.168.1.38/24) на стороне сервера (Ubuntu 12.04 amd64), eth0 находится в частной сети за брандмауэром NAT и может подключаться к Интернету через брандмауэр (брандмауэр как шлюз),
- запустили "
echo 1 > /proc/sys/net/ipv4/ip_forward
" на стороне сервера, - запустили "
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. Мой вопрос:
- вернет ли обратный NAT IP-адрес назначения http-ответа на 10.0.0.2,
- как сервер eth0 узнает, куда пересылать ответ http с обратным NAT?
- перешлет ли eth0 http-ответ на сервер tun0 (10.0.0.1), поскольку IP-адрес назначения ответа преобразован с помощью обратного NAT в 10.0.0.2?
- нужно ли мне добавить маршрут на стороне сервера для правильной маршрутизации/пересылки обратного NAT-ответа http? Если да, то как?
- нужно ли мне добавить некоторые правила 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
После этого шага при просмотре веб-страниц с вашего клиента поток пакетов будет следующим:
- Клиент отправит пакет на 10.0.0.1.
- На стороне сервера пакет, полученный на tun0, будет транслироваться из 10.0.0.2 в 192.168.1.38.
- В таблице NAT будет создана запись сопоставления.
- Пакет будет отправлен в Интернет через 192.168.1.1 (шлюз).
- Ответ будет получен по адресу 192.168.1.38.
- Обратный NAT будет выполнен в соответствии с записью сопоставления, созданной на шаге 3.
- Ответный пакет будет перенаправлен обратно на 10.0.0.2.
Надеюсь, я не упустил какой-то важный шаг :)