Mengizinkan SSH di server dengan klien OpenVPN yang aktif

15

Saya memiliki VPS yang menjalankan CentOS 7 yang saya sambungkan dengan SSH. Saya ingin menjalankan klien OpenVPN pada VPS sehingga lalu lintas internet dialihkan melalui VPN, tetapi masih memungkinkan saya untuk terhubung ke server melalui SSH. Ketika saya memulai OpenVPN, sesi SSH saya terputus dan saya tidak bisa lagi terhubung ke VPS saya. Bagaimana saya bisa mengkonfigurasi VPS agar koneksi SSH (port 22) yang masuk terbuka pada IP aktual VPS (104.167.102.77), tetapi masih merutekan lalu lintas keluar (seperti dari browser web pada VPS) melalui VPN?

Layanan OpenVPN yang saya gunakan adalah PrivateInternetAccess, dan contoh file config.ovpn adalah:

klien
dev tun
proto udp
remote nl.privateinternetaccess.com 1194
resolv-coba lagi tak terbatas
bangsawan
tetap ada
tetap bertahan
ca ca.crt
tls-klien
server remote-cert-tls
auth-user-pass
comp-lzo
kata kerja 1
reneg-detik 0
crl-verifikasi crl.pem

Ip addr VPS:

1: lo: mtu 65536 status noqueue qdisc TIDAK DIKETAHUI
    link / loopback 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 host lingkup lo
       valid_lft selamanya prefer_lft selamanya
    inet6 :: 1/128 ruang lingkup host
       valid_lft selamanya prefer_lft selamanya
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    tautan / eter 00: 50: 56: be: 16: f7 brd ff: ff: ff: ff: ff: ff: ff
    inet 104.167.102.77/24 brd 104.167.102.255 ruang lingkup ens33 global
       valid_lft selamanya prefer_lft selamanya
    inet6 fe80 :: 250: 56ff: febe: 16f7 / 64 link lingkup
       valid_lft selamanya prefer_lft selamanya
4: tun0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    tautan / tidak ada
    inet 10.172.1.6 peer 10.172.1.5/32 lingkup global tun0
       valid_lft selamanya prefer_lft selamanya

Rute ip VPS:

0.0.0.0/1 via 10.172.1.5 dev tun0
default via 104.167.102.1 dev ens33 proto static metric 1024
10.172.1.1 melalui 10.172.1.5 dev tun0
10.172.1.5 dev tun0 proto kernel lingkup tautan src 10.172.1.6
104.167.102.0/24 dev ens33 proto kernel scope link src 104.167.102.77
109.201.154.177 via 104.167.102.1 dev ens33
128.0.0.0/1 via 10.172.1.5 dev tun0
odie5533
sumber

Jawaban:

15

Saya mengalami masalah yang serupa dengan ini dan telah mencoba memperbaiki yang dijelaskan dalam posting forum ini .

Idenya adalah bahwa saat ini ketika Anda terhubung ke alamat IP publik Anda, paket kembali sedang dialihkan melalui VPN. Anda perlu memaksa paket-paket ini untuk dialihkan melalui antarmuka publik Anda.

Perintah rute ini diharapkan akan melakukan trik:

aturan ip tambahkan dari tabel xxxx 128

ip route tambahkan tabel 128 ke yyyy / y dev ethX

ip route add table 128 default melalui zzzz

Di mana xxxx adalah IP publik Anda, yyyy / y harus menjadi subnet dari alamat IP publik Anda, ethX harus menjadi antarmuka Ethernet publik Anda, dan zzzz harus menjadi gateway default.

Perhatikan bahwa ini tidak berhasil untuk saya (menggunakan Debian dan PrivateInternetAccess) tetapi dapat membantu Anda.

Tuan
sumber
1
Alih-alih hanya menautkan ke solusi, sebutkan atau setidaknya rangkum solusi di sini. Dengan begitu, kiriman Anda masih bisa berguna di masa mendatang jika kiriman yang Anda tautkan hilang.
Andrew Schulman
Saya telah menjalankan perintah-perintah ini tetapi tidak berhasil ... Bagaimana cara saya mendaftar tabel ini (saya tidak dapat melihat aturan baru yang saya tambahkan routeatau dengan ip route show) dan menghapusnya?
Hussain Khalil
Saya kehilangan ssh saya di ip publik ketika saya berdiri openvpn di server rumah saya. Menjalankan perintah pertama yang tercantum di atas memungkinkan saya untuk mendapatkan akses ssh kembali ke server ketika tidak di LAN rumah. Menggunakan PIA + OpenVPN + ubuntu 16.04.
boredcoding
Apakah itu benar-benar hanya merutekan port SSH ke IP publik saya? Bisakah Anda menjelaskan lebih lanjut tentang apa sebenarnya yang dilakukan ini? Saya tidak melihat di mana pun Anda mengatur port atau protokol tertentu
Freedo
Sama sekali tidak merutekan berdasarkan port (128 adalah nomor tabel, bukan port). Itu pada dasarnya mengatakan bahwa jika paket tiba melalui alamat IP publik Anda maka respons harus dikirim pada antarmuka yang sama (tanpa menggunakan VPN).
MrK
17

Ini mungkin agak terlambat, tapi ...

Masalahnya adalah gateway default diubah oleh OpenVPN, dan itu memutuskan koneksi SSH Anda saat ini kecuali Anda mengatur rute yang sesuai sebelum Anda memulai OpenVPN.

Berikut ini bekerja untuk saya. Ini menggunakan iptables dan ip (iproute2). Di bawah ini, diasumsikan bahwa antarmuka gateway standar sebelum OpenVPN dimulai adalah "eth0". Idenya adalah untuk memastikan bahwa ketika koneksi ke eth0 dibuat, bahkan jika eth0 bukan antarmuka gateway default lagi, paket respon untuk koneksi kembali pada eth0 lagi.

Anda bisa menggunakan nomor yang sama untuk tanda koneksi, tanda firewall dan tabel routing. Saya menggunakan angka berbeda untuk membuat perbedaan di antara mereka lebih jelas.

# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

MEMPERBARUI:

Di atas berfungsi dengan baik untuk saya di Debian Jessie. Tetapi pada sistem Wheezy yang lebih lama saya baru saja menemukan bahwa saya perlu menambahkan "via" ke entri tabel routing:

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

Di sana "12.345.67.89" harus merupakan gateway non-VPN asli.

John Doe
sumber
1
TERIMA KASIH! Saya telah mencari solusi untuk masalah ini selama berhari-hari, dan jawaban Anda memecahkannya untuk saya. Ini harus menjadi jawaban yang diterima.
Mike Turley
Solusi ini juga bekerja untuk saya. Terima kasih banyak telah berbagi ini.
alecov
Bisakah ada dua rute dalam tabel routing dengan tujuan yang sama ( ip route add default)? Saya mendapatkan "jawaban RTNETLINK: File ada". Saya menjalankan Ubuntu Xenial. "via" tidak membantu. Saya baru saja mencobanya di Arch Linux, pertama ip route add defaulttampaknya berhasil, tetapi ip routehasilnya tidak berubah. Setiap proses selanjutnya menghasilkan pesan "file ada".
x-yuri
Begitu, rute ditambahkan ke 3412 tabel routing. Dan untuk sampai ke sana Anda harus: ip route show table all | grep 3412. Dan tanpa "via" koneksi non-mapan (jika saya tidak salah) berhenti berfungsi (Ubuntu Xenial). Setidaknya saya bisa memperbaiki tabel routing. Namun demikian, saya tidak dapat mengakses server setelah saya menjalankan openvpn.
x-yuri
Tidak bekerja untuk saya karena alasan tertentu, yang bertentangan dengan ini , atau ini , atau ini . Yang pada dasarnya sama.
x-yuri
12

Berdasarkan jawaban @MrK, saya telah menulis beberapa kode sederhana di sini untuk membuatnya lebih cepat untuk melakukan pekerjaan sehingga Anda tidak perlu memeriksa antarmuka / IP:

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128
ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

Saya sudah mencoba skrip ini pada 4 VPS saya dan berfungsi dengan baik.

Cacar Air
sumber
Terima kasih banyak!
Jordi Goyanes
0

hmm terdengar seperti ip subnet overlap .... tanpa mengetahui lebih lanjut tentang skema ip Anda, selain ip publik untuk ternpasi vpn Anda seperti nl.privateinternetaccess.com, tidak dapat memastikannya.

jadi misalnya, jika subnet jarak jauh di sisi lain nl.privateinternetaccess.com adalah 10.32.43.0/24, dan instance Anda berada dalam vpc aws yang subnetnya adalah 10.32.44.0/24. tetapi klien ssh sumber Anda hidup di 10.32.43.0/24 (sisi aws vpc Anda), itu tidak akan berfungsi, karena kembalinya lalu lintas ssh akan didorong secara keliru pada vpn ke Belanda.

berikan info ip / subnet lengkap untuk bantuan lebih lanjut dengan ini.

...

ok, jadi ... sepertinya rute default Anda ada di terowongan, setelah Anda terhubung ke nl:

0.0.0.0/1 via 10.172.1.5 dev tun0

sehingga Anda dapat mengubahnya setelah terhubung. banyak kali server vpn memberi Anda rute palsu. khususnya di korps ceroboh. dalam hal ini, mereka mendorong rute default kepada Anda sehingga semua lalu lintas dari kotak vps akan nl. ubah rute default ke 104.167.102.x atau apa pun gateway subnet Anda ada di penyedia vps Anda.

nandoP
sumber
Output perintah apa yang cukup?
odie5533
1
output dari "ip addr" dan "ip route" pada ssh client, ssh server / vpn client, dan server nl vpn. pastikan vpn sudah habis ketika mendapatkan output.
nandoP
Saya ingin lalu lintas secara default melalui VPN; Namun, saya ingin lalu lintas masuk pada 104.167.102.77:22 diizinkan sehingga saya bisa SSH ke VPS.
odie5533
Anda memverifikasi ini dengan tcpdump, tetapi sepertinya setelah Anda terhubung, dan rute default menjadi terowongan, lalu lintas ssh baru yang masuk dari tempat lain di internet diizinkan masuk, tetapi tidak kembali, karena rute default mengirimkan respons ssh melalui terowongan, bukannya kembali kepada Anda. Anda dapat memperbaikinya dengan "ip route add [your-ip-addr] / 32 melalui [gateway vps Anda]". untuk menemukan gateway vps Anda, cukup putuskan sambungan dari terowongan, dan lihat rute default
nandoP
0

Saat Anda menaikkan VPN, gateway default Anda diganti. Ini berarti bahwa setiap lalu lintas yang dihasilkan dari atau dialihkan melalui kotak Anda akan diteruskan ke gateway VPN.

Solusi sederhana adalah menyaring semua lalu lintas yang Anda tidak ingin rute melalui VPN dan melakukan sesuatu yang lain dengannya. Satu kemungkinan adalah untuk mengambil lalu lintas yang dihasilkan dari kotak Anda dengan alamat sumber lokal Anda dan rutekan melalui gateway lokal Anda. Ini memungkinkan layanan seperti SSH bekerja dengan baik.

Kami akan melakukannya di sini. Pertama, buat tabel routing baru dan tambahkan rute default yang merutekan semuanya melalui gateway lokal Anda:

# <table> is any number between 2 and 252.
# Check /etc/iproute2/rt_tables for more info.
ip route add default via <gateway> table <table>
ip route add <lan-addr> dev <device> table <table>

Selanjutnya, buat aturan filter paket baru yang menandai semua lalu lintas meninggalkan kotak Anda dari alamat sumber yang diberikan dengan beberapa pengidentifikasi.

# <mark> is any number.
iptables -tmangle -AOUTPUT -s<local-addr> -jMARK --set-mark <mark>

Akhirnya, buat kebijakan perutean yang memilih semua lalu lintas bertanda yang disebutkan di atas dan rutekan menggunakan tabel yang dibuat di atas.

ip rule add fwmark <mark> table <table>

Sekali lagi, nilai-nilai <mark>dan <table>merupakan pengidentifikasi pilihan Anda yang sewenang-wenang.

alecov
sumber
0

Bagi saya dengan menjalankan server OpenVPN sendiri di pfSense adalah menghapus centang pengaturan "Paksa semua lalu lintas IPv4 yang dihasilkan klien melalui terowongan."

pengguna3820047
sumber