Переадресація трафіку з пристрою TUN (сервер C ++) на шлюз за замовчуванням


10

Наступна проблема є лише частиною більшого рішення, з яким я маю проблему. Всі інші елементи, здається, працюють поки що, тому я спробую описати дуже маленький фрагмент, з яким у мене є проблеми.

У мене є машина Linux, з tun0 (інтерфейс тунелювання) та eth0 (відьма - це мій шлюз до Інтернету).

Мета: моя мета - отримати пакети, що надходять з tun0, і переслати їх до шлюзу за замовчуванням. Так що насправді досить простий NAT випадок, де я хочу "поділитися" Інтернетом з tun0, який підробляє фізичний інтерфейс.

Tun створено за допомогою

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 запит є

  • джерело (10.2.0.10) - так ядро ​​знає назад маршрут (та сама підмережа)
  • призначення (8.8.8.8) - DNS Google
  • правильна контрольна сума тощо (у Wireshark / TShark вона відображається правильно у tun0)

Потім у мене є такі маршрути:

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, і я повинен бути в змозі перейти на нього). Додаткова інформація:

  • переадресація увімкнена (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 доступний через eth0 (з локального)
  • шлюз за замовчуванням правильний (від ISP через eth0)
  • я намагався вимкнути rp_tables (ехо 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • та багато інших ...

Заздалегідь дякую за будь-які підказки!


Я знаю, що це вже понад рік, але ви з цим кудись потрапляли? У мене точно така ж проблема.
hplbsh

Відповіді:


1

Альтернативним рішенням буде використання 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


1

Нещодавно я зіткнувся з цією проблемою (дотримуючись тієї ж статті, яку згадував у запитанні), і, трохи обвівшись, я виявив, що наступна команда дозволяє локальне пересилання пакетів для пристрою tun.

echo 1 > /proc/sys/net/ipv4/conf/tun0/accept_local

Я знаю її дуже пізно, я просто публікую тут повідомлення, щоб кожен, хто стикався з тим же питанням, міг отримати якусь допомогу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.