Đấu tranh với các quy tắc tường lửa với bộ chứa Docker.
Việc thiết lập như sau.
Cài đặt mỏng Debian 11 chạy Docker (Độc lập).
Được cài đặt trên Docker là Portainer và 4 web container khác.
Tất cả được gắn vào một mạng Cầu nối duy nhất có tên là dkr-lan.
Bỏ qua container portainer, các container khác có các cổng sau được ánh xạ
- web01 8081:80
- web02 8082:80
- web03 8083:80
- web04 8084:80
web01 và web03 có thể được truy cập công khai từ mọi nơi trên cổng 8081 và 8083.
Tuy nhiên, web02 chỉ có thể được truy cập bởi hai IP công cộng 1.2.3.4 và 1.2.3.5.
Tương tự như vậy, web04 chỉ có thể được truy cập bởi một IP công cộng 1.2.3.4.
Tôi đang sử dụng iptables và ban đầu đã thử thiết lập các quy tắc trong chuỗi DOCKER-USER, tuy nhiên, điều này dường như chỉ lọc các gói sau khi NAT diễn ra và dường như tất cả các vùng chứa sau NAT đều sử dụng cổng 80. Tôi không thể tìm ra cách CHẤP NHẬN web02 và web04 cho các IP đó và DROP phần còn lại.
Sau một hồi tìm kiếm, tôi bắt đầu nghĩ rằng tùy chọn tốt nhất là lọc trong chuỗi PREROUTING.
với các quy tắc như dưới đây
# Đối với web01
iptables -t mangle -A PREROUTING -p TCP -s 0/0 --dport 8081 -j MARK --set-mark 1
# Dành cho web02
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.4 --dport 8082 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.5 --dport 8082 -j MARK --set-mark 1
# Dành cho web03
iptables -t mangle -A PREROUTING -p TCP -s 0/0 --dport 8083 -j MARK --set-mark 1
# Dành cho web04
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.4 --dport 8084 -j MARK --set-mark 1
# Cho phép tất cả lưu lượng được đánh dấu trong PREROUTING
# Chặn tất cả lưu lượng truy cập khác
iptables -A DOCKER-USER -m mark --mark 1 -j CHẤP NHẬN
iptables -A DOCKER-USER -p TCP --dport 8082 -j DROP
iptables -A DOCKER-USER -p TCP --dport 8084 -j DROP
Tôi có thể thấy lưu lượng truy cập đến đang đạt quy tắc PREROUTING, vì bộ đếm đang tăng lên và điều đó có vẻ ổn.
Tuy nhiên, các khối không hoạt động. Điều này là do đã được thực hiện trong chuỗi DOCKER-USER và ở giai đoạn đó, họ đang theo đuổi NAT.
Vậy làm cách nào tôi có thể thiết lập các quy tắc cho phép IP dựa trên DPORT và sau đó chặn thiết lập lại cũng dựa trên DPORT?
Đoán điều này phải được thực hiện trong chuỗi PREROUTING?
Và cũng cần phải kiên trì. Hiện tại, mỗi khi tôi dừng và khởi động một vùng chứa, nó dường như làm hỏng các quy tắc tường lửa và tất cả đều mở lại cho TẤT CẢ. Điều này đang được thực hiện trong chuỗi DOCKER. Vì vậy, đoán rằng tôi cần đặt các quy tắc của mình trong PREROUTING hoặc DOCKER-USER.
Tôi đang thiếu gì?