Описание тега gpu
Так что в вашей конфигурации, все пакеты попытке отправить в сеть, изначально происходящие из 10.0.0.1
(потому что они идут через tun0
интерфейс и его локальный адрес 10.0.0.1
). Вы захватывать пакеты, все нормально до сих пор.
Теперь, tun0
отправляет пакеты дальше. Адрес источника является 10.0.0.1
и вы хотите, чтобы пакеты уйти через другой интерфейс (wlp2s0
в вашем случае). Это маршрутизации так давайте включить маршрутизацию первый:
команды sysctl -w в сети.протокол IPv4.ip_forward=1
После этого, если вы будете смотреть на тсрйитр
для wlp2s0
вы можете видеть пакеты оставить с адресом 10.0.0.1
, а не с исходного адреса сети интерфейс (то, что вы ожидаете, я думаю). Так что нужно менять адрес источника и это называется источник нац. В Linux это легко с помощью программы netfilter/iptables в:
в iptables -Т физ-а POSTROUTING -о wlp2s0 -с 10.0.0.1 -Джей маскарад
Также убедитесь, что ваш вперед
цепочка принять
политику или вы должны разрешить переадресацию с чем-то вроде:
в iptables -вперед -я tun0 -о wlp2s0 -с 10.0.0.1 -Джей принимает
в iptables -вперед -я wlp2s0 -о tun0 -д 10.0.0.1 -Джей принимает
Все должно работать сейчас: ядро Linux выполняет маршрутизацию, она движется пакеты с tun0
интерфейс wlp2s0
. netfilter и должны изменить исходный IP-адрес 10.0.0.1
на свой wlp2s0
интерфейса присвоен адрес для исходящих пакетов. Он запоминает все соединения и когда ответные пакеты вернуться (если они) он меняет адрес назначения на wlp2s0
интерфейса, Присвоенный адрес 10.0.0.1
(в "трассировщика" функция).
Ну, это надо, но это не так. Похоже, netfilter и путается с этой сложной конфигурации маршрутизации и тот факт, что один и тот же пакет сначала проходит через выходную
цепь, а потом проходит и приходит следующее
цепочки. По крайней мере на коробки в Debian 8 она не работает.
Лучший способ для устранения неполадок с netfilter - это след
функции:
команды modprobe ipt_LOG
в iptables -Т сырье -выход -п в ICMP -J в помине
в iptables -Т сырье -это следующее -п протокол ICMP -J в помине
Я включить только трассировки для ICMP-пакетов, вы можете использовать другой фильтр для отладки.
Он покажет, какие таблицы и цепочки пакет проходит. И я вижу, что пакет не идет дальше вперед
цепи (и это не быть пойманным с NAT/POSTROUTING
цепь, которая на самом деле СНАТ
).
Ниже несколько способов, чтобы сделать эту работу.
Подход #1
Лучший способ, чтобы ООН-путают с netfilter - изменить IP-адрес источника пакетов в tun0.с
приложением. Это также наиболее естественным образом.
Мы должны меняться, чтобы 10.0.0.1 10.0.0.2 на пути наружу и 10.0.0.2 10.0.0.1, чтобы на обратном пути.
Я модифицировал tun0.с
с адресом источника изменить код. Вот новый файл и вот файл патчей для tun0.гр
. Изменение в IP-заголовке также привлекать контрольная сумма коррекции, поэтому я взяла код от брелка проект.
Вот полный список команд я выполнять после чистой перезагрузки и tun0_changeip.с
запуска:
команду ifconfig tun0 инет 10.0.0.1/30 до
команды sysctl -w в сети.протокол IPv4.ip_forward=1
ИС добавить маршрут по умолчанию в dev tun0 стол Джон
правило IP добавить из всех подстановок Джон
правило IP 10.0.0.2 добавить из поиска основной приоритет 500
в iptables -Т физ-а POSTROUTING -о wlp2s0 -с 10.0.0.2 -Джей маскарад
Обратите внимание, что вам не нужно отключать фильтрации обратного пути в таком случае, потому что все законно - tun0
только принимает и отправляет пакеты, которые относятся к своей подсети. Также вы можете сделать источник маршрутизации на основе, а не на основе интерфейсов.
Подход #2
Это можно сделать СНАТ
, прежде чем пакет достигнет tun0
интерфейс. Хотя это не очень правильно. Вы обязательно должны выключить фильтрации обратного пути в этом случае:
команды sysctl -w в сети.протокол IPv4.конф.tun0.rp_filter=0
# Он не будет работать без замены "всех" значение
команды sysctl -w в сети.протокол IPv4.конф.все.rp_filter=0
Теперь, СНАТ
:
в iptables -Т физ-а POSTROUTING -O в tun0 -с 10.0.0.1 -й СНАТ --к-исходный IP-адрес.адрес.из.ваш.подключения.интерфейс
Здесь мы меняем адрес источника, просто прежде чем пакеты доходят до tun0
устройства. tun0.С
код отправить эти пакеты "как есть" (с измененным адресом источника) и они успешно маршрутизироваться через WLAN интерфейс.
Но у вас может быть динамический IP на WLAN интерфейсе и хотите использовать маскарадные
(для того, чтобы не указать адрес явным образом). Вот как вы можете использовать маскарадные
:
в iptables -Т физ-а POSTROUTING -о tun0 -с 10.0.0.1 -Джей СНАТ --к-источник 10.0.55.1
в iptables -Т физ-а POSTROUTING -о wlp2s0 -с 10.0.55.1 -Джей маскарад
Пожалуйста, обратите внимание на "10.0.55.1
" IP-адрес - это другое. Вы можете использовать здесь любой IP, это не важно. Пакеты достичь трансляцией сетевых адресов NAT/POSTROUTING
цепь на wlp2s0
интерфейс, если мы изменим исходный IP раньше. И теперь это не зависит от статический IP на интерфейс WLAN.
Подход #3
Вы можете также использовать fwmark
. Таким образом, вы не должны снать
, но вы будете захватывать только исходящие пакеты:
В первую очередь надо отключить фильтрации обратного пути для tun0
, потому что он будет пересылать пакеты, которые принадлежат к другой сети:
команды sysctl -w в сети.протокол IPv4.конф.tun0.rp_filter=0
# Он не будет работать без замены "всех" значение
команды sysctl -w в сети.протокол IPv4.конф.все.rp_filter=0
Теперь давайте изменять правила маршрутизации немного:
# Удаляем старые правила
правило IP-дель-ииф tun0 основного поиска
правило IP-дель из всех подстановок Джон
# Пакеты начинают с интерфейсом WLAN, так они будут иметь адрес источника из его
в iptables -Т мангл-выход -о wlp2s0 -Джей Марк-набор-Марк 1
правило IP добавить 0х1 поиска fwmark Джон
Вот еще один "хак" для маршрутизации и с netfilter , который работает на моей системе Debian 8 коробки, но все же я рекомендую сделать первый подход, так как это более естественно и не использовать какие-то хаки.
Вы можете также рассмотреть, чтобы построить приложение в качестве прозрачного прокси. Я думаю, было бы гораздо легче, вместо того, чтобы анализировать пакеты от устройства tun.