Thông tin lai lịch
Tôi có một máy chủ với hai giao diện mạng đang chạy Docker. Docker, giống như một số công cụ ảo hóa, tạo ra một giao diện cầu nối Linux được gọi là docker0
. Giao diện này được cấu hình theo mặc định với IP 172.17.42.1
và tất cả các container Docker giao tiếp với giao diện này là cổng của chúng và được gán địa chỉ IP trong cùng /16
phạm vi. Theo tôi hiểu, tất cả lưu lượng truy cập mạng đến / từ các container đều đi qua NAT, do đó, nó xuất hiện từ bên ngoài 172.17.42.1
và đến trong đó nó được gửi đến 172.17.42.1
.
Thiết lập của tôi trông như vậy:
+------------+ /
| | |
+-------------+ 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| |
+------------+
Vấn đề
Tôi muốn định tuyến tất cả lưu lượng truy cập từ / đến bất kỳ bộ chứa Docker nào từ eth1
192.168.1.2
giao diện thứ hai đến một cổng mặc định của 192.168.1.1
, trong khi tất cả lưu lượng truy cập từ / đến máy chủ đi ra ngoài eth0
10.1.1.2
giao diện đến một cổng mặc định của 10.1.1.1
. Tôi đã thử rất nhiều thứ cho đến nay nhưng không có kết quả, nhưng một điều mà tôi nghĩ là gần nhất để sửa là sử dụng iproute2 như vậy:
# 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
Khi tôi mang lên một container tôi không thể ping ra khỏi nó sau khi làm điều này. Tôi không chắc chắn nếu các giao diện cầu được xử lý giống như các giao diện vật lý dành cho loại định tuyến này và chỉ muốn kiểm tra độ tỉnh táo cũng như bất kỳ mẹo nào về cách tôi có thể thực hiện nhiệm vụ có vẻ đơn giản này.