Wadah Docker mengenai iptables ke proxy

2

Saya punya dua VPS, mesin pertama ( proxy dari sekarang) untuk proxy dan mesin kedua ( dock dari sekarang) adalah host buruh pelabuhan. Saya ingin mengarahkan semua lalu lintas yang dihasilkan di dalam wadah buruh pelabuhan itu sendiri melalui proxy , untuk tidak mengekspos mesin dok IP publik.

Karena koneksi antara VPS melalui internet, tidak ada koneksi lokal, membuat terowongan di antara mereka dengan ip tunnel sebagai berikut:

Pada proxy :

ip tunnel add tun10 mode ipip remote x.x.x.x local y.y.y.y dev eth0
ip addr add 192.168.10.1/24 peer 192.168.10.2 dev tun10
ip link set dev tun10 mtu 1492
ip link set dev tun10 up

Di dermaga :

ip tunnel add tun10 mode ipip remote y.y.y.y local x.x.x.x dev eth0
ip addr add 192.168.10.2/24 peer 192.168.10.1 dev tun10
ip link set dev tun10 mtu 1492
ip link set dev tun10 up

PS: Tidak tahu apakah ip terowongan dapat digunakan untuk produksi, itu adalah pertanyaan lain, tetap berencana untuk menggunakan libreswan atau openvpn sebagai terowongan antara VPS.

Setelah itu, tambahkan aturan SNAT ke iptables di kedua VPS dan beberapa aturan perutean sebagai berikut:

Pada proxy :

iptables -t nat -A POSTROUTING -s 192.168.10.2/32 -j SNAT --to-source y.y.y.y

Di dermaga :

iptables -t nat -A POSTROUTING -s 172.27.10.0/24 -j SNAT --to-source 192.168.10.2
ip route add default via 192.168.10.1 dev tun10 table rt2
ip rule add from 192.168.10.2 table rt2

Dan yang tak kalah pentingnya menciptakan jaringan buruh pelabuhan dengan satu wadah uji yang melekat padanya sebagai berikut:

docker network create --attachable --opt com.docker.network.bridge.name=br-test --opt com.docker.network.bridge.enable_ip_masquerade=false --subnet=172.27.10.0/24 testnet
docker run --network testnet alpine:latest /bin/sh

Sayangnya semua ini berakhir tanpa hasil. Jadi pertanyaannya adalah bagaimana cara men-debug itu? Apakah itu cara yang benar? Bagaimana Anda akan melakukan redirection melalui proxy?

Beberapa kata tentang teori: Lalu lintas yang berasal dari 172.27.10.0/24 subnet hits iptables aturan SNAT, sumber perubahan IP ke 192.168.10.2. Dengan aturan routing, rute melalui perangkat tun10, itu adalah terowongan. Dan mengenai aturan SNAT iptables lain yang mengubah IP menjadi yyyy dan akhirnya pergi ke tujuan.

teeper
sumber
Untuk memeriksa di dalam wadah, Anda dapat menggunakan: apk add curl curl 'http://ipecho.net/plain'Ini harus mengembalikan yyyy
teeper

Jawaban:

1

Saya ingin mengarahkan semua lalu lintas yang dihasilkan di dalam wadah buruh pelabuhan itu sendiri melalui proxy, untuk tidak mengekspos mesin dok IP publik.

Jika itu yang Anda inginkan, Anda tidak perlu NAT di antara dua instance buruh pelabuhan.

Anda perlu mengaktifkan penerusan pada proxyinstance (mis. Via sysctl).

Jika IP publik proxyadalah terlihat dalam proxy, maka Anda perlu melakukan SNAT dengan itu IP publik dalam proxysaja (tidak dalam dock). Ini juga disebut MASQUERADE. Ini adalah pengaturan standar, google untuk "masquerade".

Jika IP publik proxyadalah tidak terlihat di dalam proxy(yaitu, terdaftar ketika Anda melakukan ip addr), karena tuan rumah proxy(atau bahkan beberapa host lain lebih jauh) melakukan NAT maka Anda sebaiknya menghindari double NAT dan membuat docktampak seperti wadah lain dengan tuan rumah. Detail tergantung pada bagaimana jaringan diatur pada host (yang tidak Anda katakan), tetapi pada dasarnya tunnel end dockharus memiliki IP di subnet yang sama dengan wadah pada proxyhost.

Sebuah ipipterowongan tidak dienkripsi; Anda tidak boleh menggunakan terowongan ini kecuali transpornya sepenuhnya di dalam jaringan tepercaya (yang mungkin bukan itu masalahnya, karena Anda sepertinya menginginkan alamat IP publik yang berbeda). Jadi gunakan OpenVPNatau mudah untuk menyiapkan alternatif seperti tinc . Libreswantidak begitu mudah diatur.

Sunting

Selangkah demi selangkah:

1) Verifikasi terowongan berfungsi. Aktif proxy, lakukan ping 192.168.10.2. Aktif dock, lakukan ping 192.168.10.1. Debug dengan tcpdumpsemua antarmuka jaringan yang dapat Anda akses. Jika ipip-tunnel tidak berfungsi, gunakan tunnel yang berbeda dan buat itu berfungsi.

2) Hapus semua iptablesaturan dock. Tetapkan rute default melalui terowongan. Uji dengan ip route get 8.8.8.8apakah rute tersebut berfungsi.

3) Dengan asumsi bahwa eth0pada proxymemiliki IP publik, hapus semua iptablesaturan, lakukan:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o tun10 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -i tun10 -j ACCEPT

Ini mengatakan "paket forward, menyamarkan semua paket yang diteruskan keluar eth0dengan memberi mereka alamat IP publik eth0sebagai alamat sumber, dan koneksi melacaknya. Paket dari tun10selalu dapat diteruskan ke eth0, paket yang masuk eth0hanya diteruskan ke tun10jika koneksi dibuat oleh dock. "

Uji dengan melakukan ping 8.8.8.8pada dock, saat menjalankan tcpdumppada tun10dan eth0di proxy. Anda harus melihat paket diteruskan, dan sumbernya ditulis ulang.

4) Setelah semuanya berfungsi, buatlah permanen: Edit /etc/sysctl.confatau file /etc/sysctl.duntuk dimiliki net.ipv4.ip_forward = 1. Baik gunakan skrip startup untuk menambahkan iptablesaturan, atau gunakan paket apa pun yang disediakan distro Anda untuk menyimpan aturan.

dirkt
sumber
Terima kasih atas balasannya Tapi ketika saya melihat Anda tidak mengerti dengan benar. Tidak ada instance docker di proxy , tapi instance docker ada di mesin dock . Hal yang ingin saya capai adalah mengarahkan lalu lintas dari buruh pelabuhan ke mesin proxy , bukan dari mesin dermaga itu sendiri, jadi saat mengakses beberapa sumber daya dari dalam instance IP publik Anda akan menjadi IP publik proxy . Docker menggunakan penyamaran untuk menyediakan konektivitas keluar / masuk untuk instansnya di host.
teeper
Tidak masalah apakah proxydan / atau dockmerupakan kasus buruh pelabuhan atau tidak. Jika proxyadalah tuan rumah itu sendiri, hal yang sama berlaku: Apakah IP publik proxyterlihat dalam proxy ( ip addr), atau tidak (karena layanan hosting Anda memiliki mesin lain yang melakukan NAT)? Bergantung pada itu, Anda baik MASQUERADE hanya pada proxy, atau Anda berpura-pura siapa pun yang melakukan NAT yang dockhanyalah mesin lain, rekan proxy, dengan meneruskan / routing.
dirkt
Anda berkata: Details depend on how the network is setup on the host (which you didn't say)...Apakah ini tidak cukup? As connection between VPSs is over internet, no local connection,...
teeper
Aku tidak bisa mengerti kamu Tolong tunjukkan contoh kerja nyata. Terima kasih
penggoda
Ya, saya mengerti koneksi antara VPS melalui internet. Ini bukan intinya. Bisakah Anda melihat output ip addrpada proxy, dan melihat apakah IP publik terdaftar di sana, atau tidak? Dan jika tidak terdaftar, dapatkah Anda menjelaskan bagaimana proxymenghubungkan ke siapa pun yang memasok IP publik? Itu intinya.
dirkt