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.
apk add curl
curl 'http://ipecho.net/plain'
Ini harus mengembalikan yyyyJawaban:
Jika itu yang Anda inginkan, Anda tidak perlu NAT di antara dua instance buruh pelabuhan.
Anda perlu mengaktifkan penerusan pada
proxy
instance (mis. Via sysctl).Jika IP publik
proxy
adalah terlihat dalamproxy
, maka Anda perlu melakukan SNAT dengan itu IP publik dalamproxy
saja (tidak dalamdock
). Ini juga disebut MASQUERADE. Ini adalah pengaturan standar, google untuk "masquerade".Jika IP publik
proxy
adalah tidak terlihat di dalamproxy
(yaitu, terdaftar ketika Anda melakukanip addr
), karena tuan rumahproxy
(atau bahkan beberapa host lain lebih jauh) melakukan NAT maka Anda sebaiknya menghindari double NAT dan membuatdock
tampak seperti wadah lain dengan tuan rumah. Detail tergantung pada bagaimana jaringan diatur pada host (yang tidak Anda katakan), tetapi pada dasarnya tunnel enddock
harus memiliki IP di subnet yang sama dengan wadah padaproxy
host.Sebuah
ipip
terowongan 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 gunakanOpenVPN
atau mudah untuk menyiapkan alternatif seperti tinc .Libreswan
tidak begitu mudah diatur.Sunting
Selangkah demi selangkah:
1) Verifikasi terowongan berfungsi. Aktif
proxy
, lakukanping 192.168.10.2
. Aktifdock
, lakukanping 192.168.10.1
. Debug dengantcpdump
semua antarmuka jaringan yang dapat Anda akses. Jika ipip-tunnel tidak berfungsi, gunakan tunnel yang berbeda dan buat itu berfungsi.2) Hapus semua
iptables
aturandock
. Tetapkan rute default melalui terowongan. Uji denganip route get 8.8.8.8
apakah rute tersebut berfungsi.3) Dengan asumsi bahwa
eth0
padaproxy
memiliki IP publik, hapus semuaiptables
aturan, lakukan:Ini mengatakan "paket forward, menyamarkan semua paket yang diteruskan keluar
eth0
dengan memberi mereka alamat IP publiketh0
sebagai alamat sumber, dan koneksi melacaknya. Paket daritun10
selalu dapat diteruskan keeth0
, paket yang masuketh0
hanya diteruskan ketun10
jika koneksi dibuat olehdock
. "Uji dengan melakukan
ping 8.8.8.8
padadock
, saat menjalankantcpdump
padatun10
daneth0
diproxy
. Anda harus melihat paket diteruskan, dan sumbernya ditulis ulang.4) Setelah semuanya berfungsi, buatlah permanen: Edit
/etc/sysctl.conf
atau file/etc/sysctl.d
untuk dimilikinet.ipv4.ip_forward = 1
. Baik gunakan skrip startup untuk menambahkaniptables
aturan, atau gunakan paket apa pun yang disediakan distro Anda untuk menyimpan aturan.sumber
proxy
dan / ataudock
merupakan kasus buruh pelabuhan atau tidak. Jikaproxy
adalah tuan rumah itu sendiri, hal yang sama berlaku: Apakah IP publikproxy
terlihat dalam proxy (ip addr
), atau tidak (karena layanan hosting Anda memiliki mesin lain yang melakukan NAT)? Bergantung pada itu, Anda baik MASQUERADE hanya padaproxy
, atau Anda berpura-pura siapa pun yang melakukan NAT yangdock
hanyalah mesin lain, rekanproxy
, dengan meneruskan / routing.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,..
.ip addr
padaproxy
, dan melihat apakah IP publik terdaftar di sana, atau tidak? Dan jika tidak terdaftar, dapatkah Anda menjelaskan bagaimanaproxy
menghubungkan ke siapa pun yang memasok IP publik? Itu intinya.