Docker & Shorewall


16

Tôi đang sử dụng Shorewall trên máy chủ của mình dưới dạng tường lửa độc lập đơn giản và cũng muốn sử dụng Docker .

Bằng cách sử dụng bộ chứa Docker và docker chuyển hướng cổng của nó sẽ thiết lập các quy tắc / chuỗi iptables của riêng nó sẽ bị giết nếu khởi động lại wallwall. Vì vậy, container sẽ trở nên không thể truy cập .

Có ai quản lý để lưu / khôi phục các quy tắc docker khi khởi động lại trên bờ hoặc có ai có cách giải quyết khác không?

Xem thêm:

Câu trả lời:


19

Các thay đổi cấu hình sau sẽ đảm bảo luồng lưu lượng giữa Docker và máy chủ Shorewall. Đã thử nghiệm trên Shorewall 4.5.21.9 nhưng nên áp dụng cho hầu hết các phiên bản gần đây:

/etc/ shorewall / shorewall.conf

Đảm bảo chuyển tiếp IP được bật (hầu hết các mục cấu hình là Có / Không, nhưng mục này là "Bật"):

IP_FORWARDING=On

/ etc / shorewall / masq

Kích hoạt tính năng giả mạo (NAT) cho mạng Docker riêng của bạn (nếu bạn sử dụng một mạng khác, tức là bạn khởi chạy docker với --bip=#.#.#.#/#, sau đó thay đổi tương ứng). Thay đổi eth0bất kỳ giao diện nào trên máy chủ có kết nối bên ngoài:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ etc / shorewall / giao diện

Thêm một mục giao diện để Shorewall biết dockkhu vực nào liên quan đến:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / khu

Tạo một vùng mới; lưu ý, dockerquá dài và sẽ gây ra lỗi "tên khu vực không hợp lệ".

#ZONE   INTERFACE
dock    ipv4

/ etc / shorewall / chính sách

Bạn có thể muốn cho phép các container Docker nói chuyện với máy chủ Internet, vì vậy đây là điểm khởi đầu tốt:

#SOURCE         DEST            POLICY
# ...(other policies)...
dock            all             ACCEPT
# ...(other policies, catch-all)...

Bạn cũng có thể cần một tương tự ACCEPTchính sách đối với lưu lượng từ fwtới dock, nếu bạn không đã mở nó lên với fwtới all.

Bạn có thể thắt chặt điều này hơn nữa trong các tệp chính sách hoặc quy tắc nếu cần. Ví dụ, ở trên không rõ ràng cho phép lưu lượng truy cập bên ngoài đến được các container Docker của bạn; kiểm tra các khu vực / chính sách / quy tắc khác của bạn cho điều đó.


1
IP_FORWARDING=YesIP_FORWARDING=Truelàm việc như là tốt. Tôi có nó trên một số bộ định tuyến sản xuất, nhưng câu trả lời của bạn rõ ràng hơn nhiều so với của tôi. Công việc tuyệt vời
Aaron C. de Bruyn

Tha thứ cho sự thiếu hiểu biết của tôi - khi tôi khởi động lại wallwall sau khi thêm các quy tắc đã cho, tôi nhận được một cảnh báo rằng dock là "Giao diện EMPTY" ... và thực sự, đọc những điều trên, tôi không rõ làm thế nào để có thể suy ra kết nối giữa 172,17 địa chỉ và khu vực 'bến tàu'. Tôi có thiếu một cái gì đó rõ ràng về cách thức hoạt động của wallwall không?
John Clements

Xin lỗi về điều đó, tôi đã bỏ lỡ một sự thay đổi trong tập tin giao diện. Tôi đã chỉnh sửa câu trả lời, xem phần mới/etc/shorewall/interfaces .
fazy

Cảm ơn bạn. Nó cũng hoạt động tốt với Shorewall 5 (được biết đến với docker), để chủ nhà tham gia vào các container của nó.
Drasill

cài đặt masq rất quan trọng, nếu không, docker-container sẽ không thể truy cập vào một container khác bằng IP bên ngoài - nó sẽ bị chặn
Eugen Mayer

6

Do Docker giới thiệu tính năng cách ly mạng, các giải pháp khác được đề cập ở đây không còn đủ nếu bạn muốn sử dụng mạng tùy chỉnh. Shorewall 5.0.6 giới thiệu hỗ trợ cho Docker bao gồm các mạng Docker. Điều này:

  • Cho phép wallwall và docker được bắt đầu / dừng / khởi động lại theo bất kỳ thứ tự nào
  • Tránh sự cần thiết phải duy trì một tập lệnh mở rộng

2

Chỉ cần tìm ra nó trên hộp của tôi. Đảm bảo /etc/ shorewall.conf có:

IP_FORWARDING=Yes

Docker dựa vào chuyển tiếp và tôi đặt khoảng cách 'con rối' đặt nó thành 'Không' trên tất cả các máy chủ của tôi.

Cập nhật: Có lẽ bạn cũng cần giả trang lưu lượng truy cập đến từ docker ra giao diện WAN của bạn.

Biên tập /etc/shorewall/masq và bạn sẽ cần một dòng tương tự như:

br0 172.17.0.0/12

Trong trường hợp này, giao diện WAN của tôi thực sự là br0 (một cây cầu), nhưng giao diện của bạn có thể sẽ giống như eth0. (Sử dụng ifconfigđể xem giao diện của bạn và địa chỉ IP của họ). Trên docker máy của tôi sử dụng 172.17.0.0/24 là dải địa chỉ riêng RFC1918. Điều này có thể khác nhau trên các hệ thống khác, nhưng bạn có thể thấy phạm vi bằng cách sử dụng ifconfigmột lần nữa để tìm giao diện docker0.


2

Bạn có thể đảm bảo rằng bộ quy tắc Docker tồn tại DOCKERkhi khởi động lại trên bờ bằng cách tạo các tập lệnh mở rộng lưu chuỗi trước khi khởi động lại, sau đó khôi phục lại nó sau đó. Tôi vừa mới đăng một bài viết với một ví dụ về cách thực hiện việc này , mặc dù tôi chắc chắn đó là phương pháp khả thi duy nhất.


0

Dịch vụ docker có thể được khởi động lại mà không ảnh hưởng đến các container đang chạy và có thể được chạy sau khi khởi động lại Shorewall để tải lại các quy tắc cụ thể của docker. Rõ ràng sẽ có một thời gian ngắn mà mạng lưới đến (các) container bị gián đoạn.

Điều này đúng ít nhất trên vài lần cài đặt Archlinux của tôi.


0

Hành động làm mới không làm sạch iptable vì vậy nếu bạn chỉ muốn làm mới các quy tắc hoặc chính sách, bạn chỉ có thể chạy làm mới thay vì khởi động lại:

sudo shorewall refresh

Rõ ràng, vấn đề vẫn còn nếu bạn thực sự cần phải khởi động lại bờ. Sau đó, bạn phải khởi động lại docker và sao lưu các container của bạn.


0

Một tùy chọn có thể là chạy Docker với tùy chọn --net = host, để cho phép ứng dụng được truy cập vào mạng máy chủ lưu trữ mà không cần chuyển tiếp ip và NAT.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.