Следующая проблема - это лишь часть большего решения, с которым у меня возникла проблема. Все остальные элементы пока кажутся работающими, поэтому я постараюсь описать очень маленькую деталь, с которой у меня возникли проблемы.
У меня есть Linux-машина с tun0 (туннельный интерфейс) и eth0 (ведьма - мой шлюз в Интернет по умолчанию).
Цель: Моя цель - получать пакеты, поступающие от tun0, и пересылать их на шлюз по умолчанию. На самом деле это довольно простой случай NAT, когда я хочу «поделиться» Интернетом с tun0, который подделывает физический интерфейс.
Тун был создан с использованием
sudo openvpn --mktun --dev tun0 --user USER
sudo ip addr add 10.2.0.1/24 dev tun0
sudo ip link set tun0 up
Итак, он у меня запущен, я могу пинговать его и т. Д. Кроме того, у меня есть приложение C ++, которое подключается к этому устройству TUN, может читать и писать в него. (fti: вот руководство, которому я следил: http://backreference.org/2010/03/26/tuntap-interface-tutorial/)
Я сбросил правильный запрос ICMP (ping), сделанный для 8.8.8.8, в массив байтов на C ++. Теперь, используя свою программу, я записываю ее на устройство tun0. Запрос ICMP имеет
Тогда у меня есть следующие маршруты:
iptables -F # flush
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface tun0 -j ACCEPT
И здесь я застрял: (Пакет не пересылается на gw по умолчанию (tshark видит его только на tun0 как полученный, что я думаю, это правильно)
Чего не хватает? Может быть, какой-нибудь альтернативный подход (но это нужно сделать с помощью устройства tun, и я должен иметь возможность r / w к нему). Дополнительная информация:
Заранее благодарим за любые подсказки!
Недавно я столкнулся с этой проблемой (после той же статьи, упомянутой в вопросе), и, немного поигравшись, я обнаружил, что следующая команда включает локальную пересылку пакетов для устройства tun.
echo 1 > /proc/sys/net/ipv4/conf/tun0/accept_local
Я знаю, что уже очень поздно, я просто пишу здесь, чтобы любой, кто сталкивается с той же проблемой, мог получить какую-то помощь.
Альтернативным решением было бы использование bridge
Таким образом, вы можете связать ваш tun0 с eth0, и нет необходимости в nat или настройке ip на tun0, вы просто помещаете IP-адреса из той же подсети eth0 и того же шлюза, который вы используете сейчас, на туннельные интерфейсы клиентов.
Команды для установки моста:
# brctl addbr br0
# brctl addif br0 eth0 tun0
www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge
Чтобы использовать brctl, вам необходимо установить
bridge-utils
пакет.
Если ваш дистрибутив Ubuntu:aptitude install bridge-utils