vpn ile ağ ad alanındaki uygulamaya bağlantı noktası yönlendirme


13

Bir ağ ad alanı oluşturabiliyor, openvpn ile bir tünel kurabiliyor ve bu tüneli ad alanı içinde kullanan bir uygulama başlatabiliyordum. Şimdiye kadar iyi, ancak bu uygulamaya bir web arayüzü üzerinden erişilebilir ve istekleri LAN'ımdaki web arayüzüne nasıl yönlendireceğimizi anlayamıyorum.

@Schnouki'den bir ağ ad alanının nasıl kurulacağını ve içinde OpenVPN'in nasıl çalıştırılacağını açıklayan bir rehber izledim

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

Bundan sonra, harici ipimi kontrol edebilir ve ad alanının içinde ve dışında farklı sonuçlar elde edebilirim, tıpkı amaçlandığı gibi:

curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>

Uygulama başlatıldı, bu örnek için tufan kullanıyorum. Tufanla ilgili bir sorun olmadığından emin olmak için bir web arayüzü ile birkaç uygulama denedim.

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

Veth vpn1'in ipini belirtirsem, 8112 numaralı bağlantı noktasındaki web arabirimine ad alanından ve dışarıdan erişebiliyorum.

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

Ancak, 8112 numaralı bağlantı noktasını sunucumdan ad alanındaki uygulamaya yeniden yönlendirmek istiyorum. Amaç, LAN'ımın içindeki bir bilgisayarda bir tarayıcı açmak ve web arayüzünü http: // sunucum-ip: 8112 (ağ sunucumun somutlaştırılmış sunucunun statik ipi olmak) ile elde etmektir.

EDIT: iptables kuralları oluşturma girişimlerimi kaldırdım. Ne yapmaya çalışıyorum yukarıda açıklanmıştır ve aşağıdaki komutlar bir HTTP 200 çıktısı vermelidir:

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

DNAT ve SNAT kurallarını denedim ve bir MASQUERADE'e iyi bir ölçü için attım, ama ne yaptığımı bilmediğim için girişimlerim boşuna. Belki birisi bu yapıyı bir araya getirmeme yardımcı olabilir.

EDIT: tcpdump çıktı tcpdump -nn -q tcp port 8112. Şaşırtıcı olmayan bir şekilde, ilk komut bir HTTP 200 döndürür ve ikinci komut reddedilen bir bağlantıyla sona erer.

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 kendisi genel bir iptables TCP proxy açıklayan bir Debian Yönetimi makalesine işaret etti . Eldeki probleme uygulandığında, senaryoları şöyle görünecektir:

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

Maalesef, veth arayüzleri arasındaki trafik ele geçirildi ve başka bir şey olmadı. Bununla birlikte, @schnouki ayrıca socatbir TCP proxy olarak kullanılmasını önerdi ve bu mükemmel çalışıyor.

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

Trafik veth arabirimleri arasında geçiş yaparken garip bağlantı noktası karıştırmayı henüz anlamadım, ama şimdi sorunum çözüldü.


Feragatname: vethCihazlarla hiç tecrübem yok (bunu çok ilginç buluyorum, ama ... ;-)). tcpdumpGelen paketlerin ne kadar uzağa gittiğini kontrol etmek için kullandınız mı ? Eğer tcpdump -i veth0bir şey görünmüyor sonra tcpdumo -i logerekli olabilir.
Hauke ​​Laging

Yanıtlar:


9

Her zaman iptables yönlendirmeleri ile ilgili sorunlar yaşadım (muhtemelen benim hatam, oldukça eminim). Ancak sizinki gibi bir durum için, ipo olmadan kullanıcı arazisinde bunu yapmak daha kolay IMO.

Temel olarak, "varsayılan" çalışma alanınızda TCP bağlantı noktası 8112'yi dinleyen ve tüm trafiği 10.200.200.2 bağlantı noktası 8112'ye yönlendiren bir arka plan programına sahip olmanız gerekir. Yani basit bir TCP proxy'sidir.

Bunu socat ile nasıl yapacağınız aşağıda açıklanmıştır :

socat tcp-listen:8112,reuseaddr,fork tcp-connect:10.200.200.2:8112

(Bu forkseçenek, socatilk proxy bağlantısı kapatıldıktan sonra durmayı önlemek için gereklidir ).

EDIT : reuseaddryorumlarda önerildiği gibi eklendi .

Kesinlikle iptables ile yapmak istiyorsanız, Debian Administration sitesinde bir rehber var . Ancak yine socatde daha ileri şeyleri tercih ediyorum - IPv4'ü IPv6'ya proxy yapmak veya eski Java programlarının güvenli hizmetlere bağlanmasına izin vermek için SSL'yi kaldırmak ...

Ancak, Deluge'deki tüm bağlantıların gerçek istemci IP'si yerine sunucu IP'nizden olacağını unutmayın. Bundan kaçınmak istiyorsanız, bir HTTP üstbilgisindeki proxy istemine orijinal istemci IP'sini ekleyen gerçek bir HTTP ters proxy kullanmanız gerekir.


1
Sen sadece benim günümü yaptın! Hiç rastlamadım socatve iptables ile ne yapmaya çalıştığımı tam olarak başardım. Birkaç uygulamayı test ettim ve hepsi kusursuz çalışıyor, dış dünyaya tun0 aracılığıyla bağlanıyor, yine de veth1 aracılığıyla web arayüzlerine erişim sağlıyor.
pskiebe

1
Biraz test yaptıktan sonra reuseaddrbayrağı ekledim . Bu, port already in usesocat -4 TCP-LISTEN:8112,reuseaddr,fork TCP:10.200.200.2:8112
topluluğun

8

Ağ ad alanını ana ad alanı ile birbirine bağlamak her zaman beni rahatsız ediyor. Genellikle bir ad alanı oluşturmamın nedeni, onu izole etmesini istememdir. Bağlantıları oluşturmak ad alanları ile elde etmeye çalıştığınız ne bağlı olarak bu amacı yenebilir.

Ancak yalıtılmış olsa bile, kolaylık sağlamak için hala ağ üzerinden kurcalamak istiyorum.

Bu çözüm, izolasyonu korumanıza ve bazı bağlantıları yine de iletmenize izin verir. Yalnızca bir bağlantı noktasını iletmek için iki ağ ad alanı arasında tüm bu ağı oluşturmanız gerekmez. Bağlantıları kabul etmek istediğiniz ad alanında çalıştırın. ip netns execÇalışmak için kök olarak çalıştırılmalıdır .

socat tcp-listen:8112,fork,reuseaddr \
  exec:'ip netns exec myvpn socat STDIO tcp-connect\:127.0.0.1\:8112',nofork

8112 numaralı bağlantı noktasında, çalıştırdığınız bir ağ ad alanındaki bağlantıları dinler, daha sonra bağlı istemci , ağ ad alanının içindeki geri kalanını yürütmek execiçin çalışmaya başlar , daha sonra ağ ad alanının içine bir kez daha başka bir bağlantıyla ikinci bağlantı oluşturur .ip netns exec myvpn ...myvpnmyvpnsocat


bir cazibe gibi çalışıyor
yaklaşık

Linux yönetimi konusunda çok tecrübeli olmadığım ve bunu öğrenmek için biraz zamanım olduğu için: :tek tırnak içinde her iki karakterden de kaçtığınızdan emin olun yoksa başka bir hata ile karşılaşabilirsiniz ... wrong number of parameters (2 instead of 1)(2 veya 3). Aksi takdirde: harika çalışıyor! Çok teşekkürler!
Igor

2

Tufan için benim çözümüm. Iptables gerekmez. İşte adımlar:

  1. Openvpn tünelinizi başlatın
  2. Ad alanı oluşturun ve openvpn tünelinizi oraya getirin:
ip ağlar $ NS ekliyor
# TUN'un gelmesini bekleyin
ise [[$ (ip yol | grep $ TUN | wc -l) == 0]]; uyu 1; tamam
MY_IP = $ (ip addr gösterisi $ TUN | grep inet | cut -d '' -f6 | cut -d '/' -f1)
# Ağ geçidi IP'sini ayıklama şekliniz openvpn bağlantınız için farklı olabilir
GATEWAY_IP = $ MY_IP
# jail $ TUN (VPN arayüzü) ad alanına
ip bağlantı $ TUN netns $ NS ayarla
# Arabirimi bir alt ağ ile getirin (VPN sunucusu tarafından bana verilenle eşdeğer)
ip netns exec $ NS ifconfig $ TUN $ MY_IP / 24 yukarı
# Geri döngü getir
ip netns exec $ NS ifconfig lo 127.0.0.1/8 yukarı
# Uzak ağ geçidini ayarlayın (pointtopoint VPN IP adresiniz)
ip netns exec $ NS yolu varsayılan gw $ GATEWAY_IP ekle
  1. Varsayılan ad alanınız ile oluşturduğunuz alan arasında veth bağlantısı kurun:
# Ad alanları arasındaki iletişim için veth arabirimleri ayarlama
ip bağlantı ekleyin veth0 türü veth eş adı veth1
# İkinci veth'i ad alanınıza taşıyın
ip bağlantı seti veth1 netns $ NS
# kullanılmayan IP aralığından ilk veth'e kadar bir IP verin
ifconfig veth0 10.1.1.1/24 yukarı
# Ve ikincisi
ip netns exec $ NS ifconfig veth1 10.1.1.2/24 yukarı
# TODO: veth1 ve eth arayüzü arasında LAN ile iletişim kurmasını sağlamak için bir köprü kurun
# DNS istemcisini kurun. ip netns bu dosyayı kullanarak /etc/resolv.conf öykünür:
mkdir -p / etc / netns / $ NS
echo "ad sunucusu 8.8.4.4"> /etc/netns/$NS/resolv.conf
  1. Delugedinizi $ NS'de ve deluge-web'inizi varsayılan ad alanınızda çalıştırın. Deluge-web'i, delugedilenin bağlantısını dinleyeceği 10.1.1.2 veth IP adresine yönlendirin.

İşte bu kadar! Tufan ağınıza ev ağınızda serbestçe erişirken, VPN'in arkasında güvenceye düştünüz


2

@ AndrDevEK'in cevabı faydalıdır. Bunu genişletmek için yüklemek istemeyebilirsiniz socat. Bu durumda, biraz kıvrımlı SSH bağlantı noktası ileri kurulumuyla aynı şeyi elde edebilirsiniz. Özellikle, unix-etki alanı soketlerinin ağ ad alanlarından bağımsız olarak çalıştığı için, bir unix-etki alanı soketine / bu bağlantı noktasından bağlantı noktası iletme özelliği burada yararlıdır:

sudo ip netns exec myvpn su -c "ssh -N -L /tmp/myunixsock:localhost:8112 localhost" $USER &
ssh_pid1=$!
ssh -N -L localhost:8112:/tmp/myunixsock localhost &
ssh_pid2=$!

Temizlemek:

sudo kill $ssh_pid1
kill $ssh_pid2
rm /tmp/myunixsock

Birincisi ssh -N -Lmyvpn ad alanında başlar. Bu, bir unix-etki alanı soketi oluşturur /tmp/myunixsockve onu dinler. Gelen bağlantılar localhost: 8112'ye (myvpn ad alanının içinde) iletilir. İkincisi ssh -N -Lvarsayılan ad alanında başlatılır. Bu, bir dinleme TCP bağlantı noktası oluşturur ve gelen bağlantıları unix-etki alanı soketine iletir.

Bunun işe yaraması için, sshağ ad alanınızın içinde zaten değilse çalışması gerekir (ve parolasız pubkey işlemi yardımcı olur):

sudo ip netns exec myvpn ip link set up dev lo
sudo ip netns exec myvpn /usr/sbin/sshd -o PidFile=/run/sshd-myvpn.pid
ssh-copy-id localhost
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.