Meneruskan lalu lintas dari perangkat TUN (C ++ backend) ke gateway default

10

Masalah berikut ini hanyalah bagian dari solusi yang lebih besar yang saya punya masalah. Semua elemen lain tampaknya bekerja sejauh ini, jadi saya akan mencoba menggambarkan bagian yang sangat kecil yang saya punya masalah.

Saya punya mesin linux, dengan tun0 (antarmuka tunneling) dan eth0 (penyihir adalah gateway default saya ke internet).

Sasaran: tujuan saya adalah menerima paket yang masuk dari tun0, dan meneruskannya ke gateway default. Jadi sebenarnya kasus NAT cukup sederhana, di mana saya ingin "berbagi" internet dengan tun0 yang memalsukan antarmuka fisik.

Tun telah dibuat menggunakan

sudo openvpn --mktun --dev tun0 --user USER
sudo ip addr add 10.2.0.1/24 dev tun0
sudo ip link set tun0 up

Jadi saya memilikinya dan berjalan, saya bisa ping itu dll. Selanjutnya, saya punya aplikasi C ++, yang menempel pada perangkat TUN ini, dapat membaca dari dan menulis ke sana. (fti: ini tutorial yang saya ikuti: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )

Saya membuang beberapa permintaan ICMP (ping) yang benar yang dibuat ke 8.8.8.8 ke dalam byte array di C ++. Sekarang, menggunakan program saya, saya menulisnya ke perangkat tun0. Permintaan ICMP telah

  • source (10.2.0.10) - jadi kernel tahu rute kembali (subnet yang sama)
  • tujuan (8.8.8.8) - DNS Google
  • mengoreksi checksum dll. (di Wireshark / TShark, ia muncul dengan benar pada tun0)

Lalu, saya memiliki rute berikut:

iptables -F # flush
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface tun0 -j ACCEPT

Dan di sini saya terjebak :( Paket tidak diteruskan ke gw default (tshark melihatnya hanya pada tun0 yang diterima yang saya kira itu benar)

Apa yang hilang Mungkin beberapa pendekatan alternatif (tetapi harus dilakukan dengan menggunakan perangkat tun, dan saya harus dapat r / w untuk itu). Informasi tambahan:

  • penerusan diaktifkan (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 dapat dicapai melalui eth0 (dari lokal)
  • gateway default sudah benar (dari ISP via eth0)
  • Saya sudah mencoba mematikan rp_tables (echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • dan banyak lagi...

Terima kasih sebelumnya atas segala petunjuk!

Marcin Górski
sumber
Saya tahu ini sudah lebih dari satu tahun, tetapi apakah Anda berhasil? Saya memiliki masalah yang persis sama.
hplbsh

Jawaban:

1

Solusi alternatif akan menggunakan bridge. Jadi Anda dapat menjembatani tun0 Anda dengan eth0 dan tidak perlu untuk nat atau pengaturan ip pada tun0 Anda hanya menempatkan IP dari subnet eth0 yang sama dan gateway yang sama yang Anda gunakan sekarang pada antarmuka terowongan klien.

Perintah untuk mengatur jembatan:

# brctl addbr br0
# brctl addif br0 eth0 tun0

www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge

Untuk menggunakan brctl Anda harus menginstal bridge-utilspaket.
Jika distro Anda adalah Ubuntu:aptitude install bridge-utils

Arash
sumber
1

Saya baru-baru ini mengalami masalah ini (mengikuti artikel yang sama disebutkan dalam pertanyaan) dan setelah mengutak-atik sedikit, saya menemukan bahwa perintah berikut ini memungkinkan penerusan lokal paket untuk perangkat tun.

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

Saya tahu ini sangat terlambat, saya hanya memposting di sini sehingga siapa pun yang menghadapi masalah yang sama dapat memiliki semacam bantuan.

Swarup Sengupta
sumber