Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Interesting SNAT bug
Chi tiết
https://tech.xing.com/a-reason-for-unexplained-connection-timeouts-on-kubernetes-docker-abd041cf7e02
Tóm tắt
Vì IP của container là ko public cho network ngoài nên khi một packet đi từ container qua host để ra ngoài thì host sẽ thực hiện SNAT, tức là viết lại source address cho packet, đồng thời đưa vào conntrack để map ngược lại khi có response.
Lúc đưa vào conntrack thì sẽ gọi hàm get_unique_tuple để tìm ra một unique tuple có dạng src (ip, port, ...) <-> dest (ip, port, ...)
dùng để mapping.
Trong hàm này lại gọi hàm nf_nat_used_tuple
để check xem port nào đã được dùng.
Nếu không chỉ định flag để tìm port một cách ngẫu nhiên thì get_unique_tuple
sẽ trả về port bé nhất đang available.
Tuy nhiên từ lúc kết quả được trả về cho đến khi tuple đấy được dùng thì có một khoảng thời gian nhất định và race condition xảy ra ở đây.
Kết quả là packet từ 2 container khác nhau khi đi qua host được map chung vào 1 conn nên packet của 1 container sẽ bị drop.







