Merutekan lalu lintas VPN keluar melalui proksi transparan lokal

4

Saya memiliki tetesan Digital Ocean (mirip dengan contoh Amazon EC2) yang menjalankan Ubuntu Server 12.04.3 x64 dengan kedua strongswan 5.1.1 (dibangun dari sumber) dan squid 3.4.2 (juga dibangun dari sumber) diinstal.

Baik strongswan VPN dan squid proxy berfungsi dengan baik secara terpisah, dengan beberapa perubahan iptables kecil antara pengujian, tentu saja.

Yang ingin saya lakukan adalah dapat memulai koneksi VPN dari komputer / perangkat saya dan memiliki lalu lintas VPN keluar secara otomatis merutekan melalui proxy squid lokal.

Artinya, arus lalu lintas akan terlihat seperti ini:

Klien -> VPN -> Proxy -> Internet

Sayangnya, sepertinya saya tidak bisa menemukan cara yang baik untuk mendapatkan koneksi semacam ini agar berfungsi. Seorang teman menunjukkan bahwa rantai Output dari tabel NAT di iptables mungkin solusi saya, menyarankan aturan seperti ini:

iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128

Meskipun secara logis masuk akal bagi saya bagaimana ini bisa berhasil, sepertinya tidak demikian. Saya tidak melihat paket mengikuti aturan (secara berkala memeriksa jumlah paket masuk / keluar dengan perintah iptables-save) saat saya mencoba memuat konten saat terhubung ke VPN.

Pikiran Anda, saya bukan ahli dengan iptables atau linux, jadi tolong bersamaku di sini jika sesuatu yang saya katakan (atau sesuatu yang saya katakan) konyol / bodoh / jelas-masalah-sialan. ;)

Saya terbuka untuk saran tentang cara mengatasi ini, tetapi menghapus komponen bukanlah solusi. Saya perlu VPN dan Proxy berjalan seperti ini. Mengubah versi kedua komponen juga tidak ideal, meskipun jauh lebih layak.

Saya telah menyediakan ipsec.conf dan squid.conf, serta skrip aturan iptables saya saat ini.

PS Jika Anda perhatikan, ada beberapa hal yang terkait dengan menggunakan RADIUS untuk otentikasi. Jangan khawatir tentang itu. Saat ini sedang tidak digunakan dan seharusnya tidak memiliki efek pada pertanyaan ini.

skrip iptables:

iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

export WAN=eth0
export vpnclients=10.100.0.0/255.255.0.0

# Allow access to our SSH server from the WAN
iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT

# Add the rules for NAT
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE

iptables-save

ipsec.conf:

config setup
ca ipsec
        cacert=ca.pem
        auto=add

conn %default
        ikelifetime=60m
        keylife=20m
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!
        leftcert=vpn-server.crt
        leftauth=pubkey
        rightsendcert=never
        leftsendcert=always
        eap_identity=%identity%
        leftfirewall=yes
        auto=add

conn ikev1
        keyexchange=ikev1
        rightauth=pubkey
        rightauth2=xauth
        rightsourceip=10.100.0.0/16
        right=%any
        rightid=%any
        rightdns=8.8.8.8,8.8.4.4
        leftsourceip=<my_server_ip>
        leftsubnet=0.0.0.0/1,128.0.0.0/1,::/1,8000::/1

conn ikev2
        keyexchange=ikev2
        rightsourceip=10.100.0.0/16
        right=%any
        rightid=%any
        rightauth=eap-radius

squid.conf:

#dummy name used
cache deny all
forwarded_for off

#for debugging, enable in production
strip_query_terms off

cache_effective_user proxy
cache_effective_group proxy
client_dst_passthru on
host_verify_strict off
http_port 3130 intercept
http_port 3128
https_port 3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/dev/squid.pem

always_direct allow all
ssl_bump server-first all

# the following two options are unsafe and not always necessary:
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

# Change these to your local DNS servers
dns_nameservers 8.8.8.8 8.8.4.4
coredump_dir /var/cache/squid

http_access allow all
http_reply_access allow all
Josh S.
sumber
Tanya dengan sangat baik. Begitu baik, pada kenyataannya, sehingga saya pikir ini adalah pertanyaan audit ketika sampai pada tinjauan que.
Jon
Haha, saya senang sekali mendengarnya! :)
Josh S.
Dalam buku saya, itu akan menjadi - ke-port, dengan final
MariusMatutiae
Sayangnya, itu sepertinya tidak membantu, tetapi terima kasih atas sarannya! Melihat sekeliling, saya melihat orang menggunakan bendera itu dengan dan tanpa jejak 's', jadi tidak yakin yang mana yang benar. Saya tampaknya mendapatkan jumlah paket yang sama (misalnya tidak ada atau sangat sedikit) terlepas dari yang saya gunakan.
Josh S.
Mengapa PREROUTINGrantai Anda dikomentari? Saya pikir itu akan berhasil dan bukan OUTPUTrantai. Juga, saya apa yang terjadi jika Anda mencoba port 3130 bukannya 3128? Jadi saya akan mencobaiptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3130
prateek61

Jawaban:

1

Saya memiliki masalah yang sama persis, dan setelah hampir 1 hari, saya bisa menyelesaikan masalah ini. Solusi ini untuk siapa saja yang membaca ini di masa depan.

Target: Sama seperti OP yang saya coba jangkau

Klien -> VPN -> Proxy -> Internet

Setup: Ubuntu 16.04

VPN: L2TP menggunakan xl2tpd dan pptpd, serta strongswan untuk enkripsi Pengaturan VPN dan server Squid Proxy berada di mesin yang sama.

Pool IP Pribadi untuk membagikan IP kepada klien: 172.21.118.0/24

Seperti yang diharapkan OP, Anda perlu menjalankan -j REDIRECT --to-port 3128beberapa tabel nat (baik PREROUTING atau OUTPUT).

Memeriksa dan masuk dengan tabel yang berbeda, di sini adalah path setiap paket yang berasal dari 172.21.118.0/24 berikut:

mangle PREROUTING -> nat PREROUTING -> mangle FORWARD -> filter FORWARD -> mangle POSTROUTING -> nat POSTROUTING

Saya mengerti cara kerjanya, menggunakan ilustrasi hebat siklus hidup paket iptables:

masukkan deskripsi gambar di sini Sumber: http://64-bit.de/dokumentationen/netzwerk/e/002/DE-IPTABLES-HOWTO-3.html

Ternyata, pengaturan ini tidak mengirim apa pun pada rantai OUTPUT, jadi satu-satunya tempat untuk mengarahkan ulang port adalah rantai PREROUTING.

The solusi hanya:

iptables -t nat -I PREROUTING  -i ppp0 -s 172.21.118.1/24 -j REDIRECT --to-ports 3128

Juga jangan lupa untuk SNAT ke IP publik Anda untuk mencapai internet:

iptables -t nat -A POSTROUTING -j SNAT -s 172.21.118.2/24 --to-source ${IP} -o eth0
#Alternatively but slower:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Moataz Elmasry
sumber