Saya dapat mengatur namespace jaringan, membuat terowongan dengan openvpn dan memulai aplikasi yang menggunakan terowongan ini di dalam namespace. Sejauh ini bagus, tetapi aplikasi ini dapat diakses melalui antarmuka web dan saya tidak tahu cara merutekan permintaan ke antarmuka web di dalam LAN saya.
Saya mengikuti panduan dari @schnouki yang menjelaskan cara mengatur namespace jaringan dan menjalankan OpenVPN di dalamnya
ip netns add myvpn
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o en+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
Setelah itu, saya dapat memeriksa ip eksternal saya dan mendapatkan hasil yang berbeda di dalam dan di luar namespace, seperti yang dimaksudkan:
curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>
Aplikasi dimulai, saya menggunakan banjir untuk contoh ini. Saya mencoba beberapa aplikasi dengan antarmuka web untuk memastikan itu bukan masalah khusus banjir.
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluged
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluge-web -f
ps $(ip netns pids myvpn)
PID TTY STAT TIME COMMAND
1468 ? Ss 0:13 openvpn --config /etc/openvpn/myvpn/myvpn.conf
9302 ? Sl 10:10 /usr/bin/python /usr/bin/deluged
9707 ? S 0:37 /usr/bin/python /usr/bin/deluge-web -f
Saya dapat mengakses antarmuka web pada port 8112 dari dalam namespace dan dari luar jika saya menentukan ip veth vpn1.
ip netns exec myvpn curl -Is localhost:8112 | head -1
HTTP/1.1 200 OK
ip netns exec myvpn curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
Tapi saya ingin mengarahkan port 8112 dari server saya ke aplikasi di namespace. Tujuannya adalah untuk membuka browser pada komputer di dalam LAN saya dan mendapatkan antarmuka web dengan http: // my-server-ip: 8112 (my-server-ip menjadi ip statis dari server yang membuat antarmuka jaringan)
EDIT: Saya menghapus upaya saya untuk membuat aturan iptables. Apa yang saya coba lakukan dijelaskan di atas dan perintah berikut harus menghasilkan HTTP 200:
curl -I localhost:8112
curl: (7) Failed to connect to localhost port 8112: Connection refused
curl -I <my-server-ip>:8112
curl: (7) Failed to connect to <my-server-ip> port 8112: Connection refused
Saya mencoba aturan DNAT dan SNAT dan melemparkan MASQUERADE untuk ukuran yang baik, tetapi karena saya tidak tahu apa yang saya lakukan, usaha saya sia-sia. Mungkin seseorang dapat membantu saya menyusun konstruksi ini.
EDIT: Output tcpdump dari tcpdump -nn -q tcp port 8112
. Tidak mengherankan, perintah pertama mengembalikan HTTP 200 dan perintah kedua berakhir dengan koneksi yang ditolak.
curl -Is 10.200.200.2:8112 | head -1
listening on vpn0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.200.200.1.36208 > 10.200.200.2.8112: tcp 82
IP 10.200.200.2.8112 > 10.200.200.1.36208: tcp 145
curl -Is <my-server-ip>:8112 | head -1
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP <my-server-ip>.58228 > <my-server-ip>.8112: tcp 0
IP <my-server-ip>.8112 > <my-server-ip>.58228: tcp 0
EDIT: @schnouki sendiri menunjuk saya ke artikel Administrasi Debian yang menjelaskan proksi TCP iptables generik . Diterapkan pada masalah yang dihadapi, skrip mereka akan terlihat seperti ini:
YourIP=<my-server-ip>
YourPort=8112
TargetIP=10.200.200.2
TargetPort=8112
iptables -t nat -A PREROUTING --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
iptables -t nat -A POSTROUTING -p tcp --dst $TargetIP --dport $TargetPort -j SNAT \
--to-source $YourIP
iptables -t nat -A OUTPUT --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
Sayangnya, lalu lintas antara antarmuka veth disita dan tidak ada lagi yang terjadi. Namun, @schnouki juga menyarankan penggunaan socat
sebagai proksi TCP dan ini berfungsi dengan baik.
curl -Is <my-server-ip>:8112 | head -1
IP 10.200.200.1.43384 > 10.200.200.2.8112: tcp 913
IP 10.200.200.2.8112 > 10.200.200.1.43384: tcp 1495
Saya belum mengerti port aneh yang bergerak sambil lalu lintas melintasi antarmuka veth, tetapi masalah saya terpecahkan sekarang.
veth
perangkat (menemukan ini sangat menarik, ... ;-)). Sudahkah Anda terbiasatcpdump
memeriksa sejauh mana paket yang masuk? Jikatcpdump -i veth0
tidak menunjukkan apa-apa makatcpdumo -i lo
mungkin diperlukan.