Port forward ke Klien VPN?


21

Saya telah mengalami sedikit teka-teki dan belum beruntung menemukan solusi. Saat ini saya (sayangnya) terhubung ke internet melalui Verizon 3G. Mereka menyaring semua lalu lintas masuk sehingga tidak mungkin bagi saya untuk membuka port untuk menerima koneksi.

Saat ini saya memiliki mesin virtual Linux di linode.com, dan pikiran terlintas di benak saya untuk menginstal pptpddan mencoba melakukan beberapa iptablesport forwarding. Saya telah pptpdmenginstal dan mesin rumah saya terhubung dengan senang hati. Yang mengatakan, inilah beberapa info umum:

Server (Debian) WAN IP: xxxx pada eth0 - pptpd IP: yyy1 pada ppp0 - IP VPN Klien: yyy100

Untuk memverifikasi saya tidak menjadi gila, saya mencoba beberapa koneksi dari server ke port terbuka pada klien, dan klien menerima koneksi melalui IP VPN.

Yang ingin saya capai adalah ini:

Internet -> WAN IP: Port -> Teruskan ke Client VPN IP: Port

Jadi misalnya, jika saya memiliki port 6000 terbuka pada klien saya, seseorang dapat melakukan telnet ke xxxx: 6000, dan server akan menangkapnya dan meneruskannya ke 192.168.3.100:6000.

Saya telah mencoba setidaknya 20 iptableskonfigurasi Google yang berbeda dan belum ada yang berhasil. Adakah yang punya ide, atau mungkin bahkan pendekatan yang sama sekali berbeda yang mungkin tidak saya sadari? Tujuannya di sini adalah untuk mendengarkan melalui koneksi firewall yang mengerikan, lebih disukai lalu lintas TCP dan UDP.

Jawaban:


25

Anda perlu melakukan tiga hal pada server VPN Anda (Linode) untuk membuatnya bekerja:

  1. Anda harus mengaktifkan penerusan IP:

    sysctl -w net.ipv4.ip_forward=1
    
  2. Tetapkan NAT tujuan (DNAT) untuk meneruskan port. Anda mungkin sudah mengetahui hal ini karena ini adalah port forwarding standar, tetapi untuk kelengkapan:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. Atur NAT sumber (SNAT) sehingga dari sudut pandang klien VPN Anda, koneksi berasal dari server VPN:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

Alasan Anda membutuhkan SNAT adalah karena jika tidak, klien VPN Anda akan mengirim paket pengembaliannya langsung ke host yang memulai koneksi (zzzz) melalui gateway default-nya (yaitu Verizon 3G), dan bukan melalui VPN. Jadi sumber alamat IP pada paket kembali akan menjadi alamat Verizon 3G Anda, dan bukan xxxx. Ini menyebabkan semua jenis masalah, karena zzzz benar-benar memulai koneksi ke xxxx

Di sebagian besar pengaturan penerusan port, SNAT tidak diperlukan karena host yang melakukan penerusan port juga merupakan gateway default untuk host tujuan (misalnya, router rumah).

Perhatikan juga bahwa jika Anda ingin meneruskan port 6000 ke port yang berbeda (katakanlah 7000), maka aturan SNAT harus cocok pada 7000, bukan 6000.


Halo AGWA, Terima kasih atas tanggapannya. Saya sudah menjalankan ip_forwarding, dan aturan Anda berfungsi dengan baik, meskipun pada awalnya tidak. Masalahnya adalah (di noobness iptables saya) bahwa saya tidak menyadari iptables -F tidak menyiram entri nat, dan iptables -L tidak mencantumkannya. Setelah mencari tahu cara mendaftar dengan benar, saya melihat beberapa entri yang saling bertentangan dari percobaan sebelumnya. Setelah memerah dan mencoba aturan Anda, itu berfungsi dengan baik. Satu pertanyaan singkat, dalam aturan Anda, Anda menentukan tcp. Apakah mengubah ini menjadi "semua" berfungsi untuk lalu lintas TCP / UDP?
Vile Brigandier

Sama-sama! (Omong-omong, saya suka menggunakan iptables-saveuntuk menunjukkan aturan iptables saya - sementara output tidak dimaksudkan untuk konsumsi manusia, itu masih dapat dibaca dan menunjukkan semua aturan iptables Anda.) Tidak, sayangnya Anda tidak dapat menggunakan "semua" di sana, karena --dporthanya bekerja dengan protokol yang benar-benar memiliki port ("semua" akan mencakup misalnya ICMP, yang tidak memiliki gagasan tentang port). Anda akan memerlukan aturan terpisah untuk TCP dan UDP.
AGWA

Terima kasih atas tip iptables-save. Semuanya berfungsi seperti yang diharapkan untuk TCP dan UDP. Tepuk tangan.
Vile Brigandier

2
Hanya pembaruan untuk jawaban ini adalah bahwa dengan iproute2, Anda benar-benar dapat mengatur klien VPN Anda untuk memiliki 2 gateway dan rute lalu lintas DNAT kembali melalui VPN. Ini bermanfaat jika Anda tidak ingin menggunakan SNAT dan semua lalu lintas tampaknya berasal dari server vpn. thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System menyertakan informasi tentang cara mengaturnya.
PressingOnAlways

Bekerja untuk saya selama ufw dinonaktifkan, meskipun saya telah mengizinkan 8080 di ufw, tetapi begitu saya mengaktifkan ufw, barang penerusan ini tidak berfungsi .. tahu?
Sudhir N

3

Saya juga punya masalah ini dan mencoba menyelesaikannya selama berjam-jam .. Ini solusi saya:

  • Saya memiliki lebih dari satu VPNClientdengan yang sama IPAddress. Jadi saya memberi mereka masing-masing statisIPAddress

Tentukan direktori tempat skrip klien harus disimpan, mis. / Etc / openvpn / staticclients dan buat direktori

mkdir /etc/openvpn/staticclients

Tambahkan direktori ini sebagai opsi ke configfile openvpn Anda di server:

client-config-dir /etc/openvpn/staticclients

Untuk setiap klien Anda harus membuat file. Nama file harus cocok dengan common nameatribut yang ditentukan pada sertifikat klien. Perintah ini mendapatkan CN dari sertifikat komputer:

Contoh ini mendorong IPAddress10.1.134.110/10.1.134.109 kepada Klien dengan common name TESTCLIENT dan juga mendorong rute tambahan untuk subnet 10.1.135.0.

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110

2

Sebagian besar server memiliki penerusan ip dinonaktifkan dalam konfigurasi default. Anda perlu mengaktifkannya jika Anda ingin mengarahkan kembali koneksi yang masuk melalui VPN Anda.

Coba ini:

sysctl -w net.ipv4.ip_forward = 1

Maksud saya selain konfigurasi iptables.


0

Apa yang ingin Anda capai adalah (mungkin) sangat mungkin dengan pptpdatau OpenVPN dan iptables, namun, Anda mungkin menemukan kandidat yang lebih baik untuk kasus penggunaan ini. Saya baru saja membaca ini yang menjelaskan cara men-setup tinc untuk kasus penggunaan ini. Ini adalah (berpotensi lebih sederhana) alternatif untuk bagian pptdpatau OpenVPN. Maka Anda akan membutuhkan aturan yang sama persis untuk iptables.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.