Informasi latar belakang
Saya memiliki server dengan dua antarmuka jaringan yang menjalankan Docker. Docker, seperti beberapa alat virtualisasi, menciptakan antarmuka jembatan Linux yang disebut docker0
. Antarmuka ini dikonfigurasi secara default dengan IP 172.17.42.1
dan semua wadah Docker berkomunikasi dengan antarmuka ini sebagai gateway mereka dan diberi alamat IP dalam /16
kisaran yang sama . Seperti yang saya pahami, semua lalu lintas jaringan ke / dari kontainer melewati NAT, jadi keluar sepertinya berasal 172.17.42.1
, dan masuk itu akan dikirim ke 172.17.42.1
.
Pengaturan saya terlihat seperti ini:
+------------+ /
| | |
+-------------+ Gateway 1 +-------
| | 10.1.1.1 | /
+------+-------+ +------------+ |
| eth0 | /
| 10.1.1.2 | |
| | |
| DOCKER HOST | |
| | | Internet
| docker0 | |
| (bridge) | |
| 172.17.42.1 | |
| | |
| eth1 | |
| 192.168.1.2 | \
+------+-------+ +------------+ |
| | | \
+-------------+ Gateway 2 +-------
| 192.168.1.1| |
+------------+
Masalah
Saya ingin merutekan semua lalu lintas dari / ke wadah Docker apa pun dari eth1
192.168.1.2
antarmuka kedua ke gateway default 192.168.1.1
, sementara semua lalu lintas dari / ke mesin host keluar eth0
10.1.1.2
antarmuka ke gateway default 10.1.1.1
. Saya sudah mencoba berbagai hal sejauh ini tidak berhasil tetapi satu hal yang saya pikir paling dekat dengan yang benar adalah dengan menggunakan iproute2 seperti:
# Create a new routing table just for docker
echo "1 docker" >> /etc/iproute2/rt_tables
# Add a rule stating any traffic from the docker0 bridge interface should use
# the newly added docker routing table
ip rule add from 172.17.42.1 table docker
# Add a route to the newly added docker routing table that dictates all traffic
# go out the 192.168.1.2 interface on eth1
ip route add default via 192.168.1.2 dev eth1 table docker
# Flush the route cache
ip route flush cache
# Restart the Docker daemon so it uses the correct network settings
# Note, I do this as I found Docker containers often won't be able
# to connect out if any changes to the network are made while it's
# running
/etc/init.d/docker restart
Ketika saya membawa wadah saya tidak bisa keluar sama sekali setelah melakukan ini. Saya tidak yakin apakah antarmuka jembatan ditangani dengan cara yang sama dengan antarmuka fisik untuk jenis perutean ini, dan hanya ingin pemeriksaan kewarasan serta tips tentang cara menyelesaikan tugas yang tampaknya sederhana ini.
Jawaban:
Anda mungkin harus melihat lebih jauh pada pengaturan iptables juga. Docker menyamarkan semua lalu lintas yang berasal dari subnet wadah, katakan 172.17.0.0/16, ke 0.0.0.0. Jika Anda menjalankan
iptables -L -n -t nat
, Anda dapat melihat rantai POSTROUTING di bawah tabel nat yang melakukan ini -Sekarang, Anda dapat menghapus aturan ini dan menggantinya dengan aturan yang menyamarkan semua lalu lintas yang berasal dari subnet wadah ke IP antarmuka kedua Anda - 192.168.1.2, karena itulah yang Anda inginkan. Aturan penghapusan akan, dengan asumsi bahwa itu adalah aturan pertama di bawah rantai POSTROUTING -
Kemudian Anda menambahkan aturan khusus ini -
sumber
ip rule add from 172.17.0.0/16 table docker
ip route add default via 192.168.1.2 dev eth1 table docker
ip route flush cache
iptables -t nat -D POSTROUTING 1
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j SNAT --to-source 192.168.1.2
/etc/init.d/docker restart
. Kemudian saya mencoba menjalankan ping dan traceroute dari sebuah wadah, dan tidak dapat mencapai apa pun.Seorang teman dan saya mengalami masalah persis di mana kami ingin memiliki buruh pelabuhan mendukung beberapa permintaan antarmuka jaringan melayani. Kami secara khusus bekerja dengan layanan AWS EC2 di mana kami juga melampirkan / mengkonfigurasi / memunculkan antarmuka tambahan. Dalam proyek ini , ada lebih dari apa yang Anda butuhkan jadi saya akan mencoba untuk hanya memasukkan apa yang Anda butuhkan di sini.
Pertama, yang kami lakukan adalah membuat tabel rute terpisah untuk
eth1
:Selanjutnya kita mengonfigurasi tabel mangle untuk menetapkan beberapa tanda koneksi yang masuk
eth1
:Akhirnya kami menambahkan aturan ini untuk semua
fwmark
untuk menggunakan tabel baru yang kami buat.iptables
Perintah di bawah ini akan mengembalikan tanda koneksi dan kemudian memungkinkan aturan routing menggunakan tabel routing yang benar.Saya percaya ini semua yang diperlukan dari contoh kami yang lebih kompleks di mana (seperti saya katakan) proyek kami melampirkan / mengkonfigurasi / membuka
eth1
antarmuka pada saat boot.Sekarang contoh ini tidak akan menghentikan koneksi dari
eth0
melayani permintaan hinggadocker0
tetapi saya yakin Anda bisa menambahkan aturan routing untuk mencegahnya.sumber
Masquerade bukan dari 172.17.42.1 melainkan
Yang berarti aturan ini tidak akan berfungsi dengan baik.
Coba saja
sumber
ip rule add from 172.17.0.0/16 table docker
ip route add default via 192.168.1.2 dev eth1 table docker
ip route flush cache
/etc/init.d/docker restart
Dari dalam wadah saya berlari traceroute dan hop pertama adalah 10.1.1.1 padahal seharusnya 192.168.1.1