Điểm:3

Tcpdump hiển thị cổng chuyển hướng khác sau khi thêm quy tắc REDIRECT trong iptables

lá cờ us

Tôi đang cố gắng hướng lưu lượng truy cập của máy khách đến một cụm kubernetes NodePort đang lắng nghe 192.168.1.100.30000.

Nhu cầu của khách hàng để thực hiện một yêu cầu để 192.168.1.100.8000 vì vậy tôi đã thêm quy tắc REDIRECT sau vào iptables:

iptables -t nat -I PREROUTING -p tcp --dst 192.168.1.100 --dport 8000 -j REDIRECT --to-port 30000

sau đó tôi phát hành một curl để 192.168.1.100:8000 tuy nhiên, trong tcpdump tôi thấy một cổng khác:

# tcpdump -i lo -nnvvv host 192.168.1.100 và cổng 8000
tcpdump: lắng nghe trên lo, loại liên kết EN10MB (Ethernet), kích thước chụp 262144 byte
[Giao diện: lo] 20:39:22.685968 IP (tos 0x0, ttl 64, id 20590, offset 0, flags [DF], TCP nguyên mẫu (6), độ dài 40)
[Giao diện: lo] 192.168.1.100.8000 > 192.168.1.100.49816: Flags [R.], cksum 0xacda (đúng), seq 0, ack 3840205844, win 0, độ dài 0
[Giao diện: lo] 20:39:37.519256 IP (tos 0x0, ttl 64, id 34221, offset 0, flags [DF], TCP nguyên mẫu (6), độ dài 40)

Tôi hy vọng tcpdump sẽ hiển thị một cái gì đó như

192.168.1.100.8000 > 192.168.1.100.30000

Tuy nhiên, nó đang hiển thị và gây ra lỗi từ chối kết nối vì không có quy trình nào được liệt kê trên 192.168.1.100.49816.

192.168.1.100.8000 > 192.168.1.100.49816

Tôi đang sử dụng môi trường thử nghiệm nên tôi không có quyền truy cập vào các thiết bị từ xa, đó là lý do tại sao tôi đang sử dụng Xoăn để kiểm tra đường dẫn REDIRECT của iptables.

Có lý do nào khiến việc thêm quy tắc REDIRECT khiến tcpdump chuyển hướng lưu lượng truy cập đến một cổng khác với cổng được chỉ định không?

Chỉnh sửa:

Sau @A.B. đề xuất đã thêm quy tắc OUTPUT sau:

iptables -t nat -I OUTPUT -d 192.168.1.100 -p tcp --dport 8000 -j REDIRECT --to-port 30000

và cuộn tròn tiếp tục tiến hành, số lượng gói cho chuỗi OUTPUT sẽ tăng lên (tuy nhiên, gói chuỗi PREROUTING REDIRECT không tăng):

2 10 600 TRỰC TIẾP tcp -- * * 0.0.0.0/0 192.168.1.100 tcp dpt:8000 cổng chuyển hướng 30000

Tuy nhiên, nhận được lỗi sau:

# cuộn tròn -vk https://192.168.1.100:8000/v1/api
* Sắp kết nối() với cổng 192.168.1.100 8000 (#0)
* Đang thử 192.168.1.100...
* Đã kết nối với cổng 192.168.1.100 (192.168.1.100) 8000 (#0)
* Khởi tạo NSS với certpath: sql:/etc/pki/nssdb
* Lỗi NSS -12263 (SSL_ERROR_RX_RECORD_TOO_LONG)
* SSL đã nhận được bản ghi vượt quá độ dài tối đa cho phép.
* Đóng kết nối 0
curl: (35) SSL đã nhận được bản ghi vượt quá độ dài tối đa cho phép.

Ngoài ra, đã thử thêm một mạng hệ thống từ xa, lần này số lượng gói PREROUTING REDIRECT CHAIN ​​tăng lên sau khi thực hiện cuộn tròn hệ thống từ xa ... (nhưng CHUỖI ĐẦU RA không tăng):

2 34 2040 TRỰC TIẾP tcp -- * * 0.0.0.0/0 172.16.128.1 tcp dpt:8000 cổng chuyển hướng 30000

Lỗi:

# ip netns exec remotesystem curl -vk https://192.168.1.100:8000/v1/api
* Sắp kết nối() với cổng 192.168.1.100 8000 (#0)
* Đang thử 192.168.1.100...
* Kết nối quá hạn
* Không kết nối được với 192.168.1.100:8000; Kết nối quá hạn
* Đóng kết nối 0
curl: (7) Không kết nối được với 192.168.1.100:8000; Kết nối quá hạn
A.B avatar
lá cờ cl
A.B
Quy tắc của bạn sẽ không hoạt động với thử nghiệm từ máy chủ lưu trữ. Kiểm tra lại từ một hệ thống từ xa, không phải từ hệ thống với chính nó.
tiger_groove avatar
lá cờ us
Tại sao nó không hoạt động, bạn có thể giải thích? Có cách nào để làm cho nó hoạt động từ máy chủ với giao diện loopback không?
A.B avatar
lá cờ cl
A.B
Trước tiên, vui lòng thêm ngữ cảnh vào câu hỏi: bạn cho biết bạn đang làm gì, nhưng tôi muốn biết tại sao bạn lại làm việc đó trước (để giải quyết vấn đề thực tế nào khiến bạn sử dụng điều này?)
tiger_groove avatar
lá cờ us
Đã thêm vào bài viết
A.B avatar
lá cờ cl
A.B
Không thể giải thích lý do sử dụng hệ thống cục bộ (chứ không phải từ xa), nhưng cuối cùng câu trả lời sẽ không cần đến nó.
tiger_groove avatar
lá cờ us
Tôi đang sử dụng môi trường thử nghiệm nên tôi không có quyền truy cập vào các thiết bị từ xa, đó là lý do tại sao tôi đang sử dụng `curl` để kiểm tra đường dẫn REDIRECT của iptables. Bạn có ý nghĩa gì khi câu trả lời sẽ không cần nó?
jcaron avatar
lá cờ co
Lưu ý rằng `192.168.1.100.8000 > 192.168.1.100.49816` không có nghĩa là "chuyển hướng từ cổng 8000 sang cổng 49816", nó có nghĩa là "một gói được gửi từ cổng 8000 đến cổng 49816", chỉ đơn giản là cổng được sử dụng bởi máy khách (cục bộ) của bạn và gói là TCP RST ("kết nối bị từ chối"). Bạn nên có một gói trước đó từ 49816 đến 8000 trước đó (yêu cầu kết nối, TCP SYN). Và kết nối bị từ chối không phải vì không có gì nghe trên 49816, mà là không có gì nghe trên 8000.
Điểm:4
lá cờ cl
A.B

Nói rõ hơn: Thử nghiệm của OP được thực hiện từ hệ thống 192.168.1.100 cho chính nó, không phải từ hệ thống từ xa và đó là nguyên nhân của sự cố. Cổng không bị thay đổi trong trường hợp này vì không có quy tắc NAT nào khớp, trong khi nó sẽ khớp nếu được thực hiện từ một hệ thống từ xa.

Sơ đồ dưới đây cho thấy thứ tự các hoạt động được thực hiện trên một gói:

Luồng gói trong Netfilter và Mạng chung

Lý do là cách NAT hoạt động trên Linux: iptables nhìn thấy một gói trong tự nhiên table chỉ dành cho gói đầu tiên của luồng theo dõi mới (do đó ở trạng thái MỚI).

Quy tắc này hoạt động tốt khi từ một hệ thống từ xa. Trong trường hợp này, gói đầu tiên được nhìn thấy sẽ là gói đến:

đến cổng 8000 -> AF_PACKET (tcpdump) -> conntrack -> nat/PREROUTING (iptables REDIRECT): đến cổng 30000
--> quyết định định tuyến --> ... --> nhận quy trình cục bộ trên cổng 30000

Tất cả các gói sau trong cùng một luồng sẽ có conntrack xử lý trực tiếp thay đổi cổng (hoặc đảo ngược cổng để trả lời) và sẽ bỏ qua mọi quy tắc iptables trong tự nhiên bảng (như được viết trong sơ đồ: tự nhiên bảng chỉ được tư vấn cho MỚI kết nối). Vì vậy, (bỏ qua phần gói trả lời), thay vào đó, gói đến tiếp theo sẽ trải qua quá trình này:

đến cổng 8000 -> AF_PACKET (tcpdump) -> conntrack: đến cổng 30000
--> quyết định định tuyến --> ... --> nhận quy trình cục bộ trên cổng 30000

Để tự kiểm tra hệ thống, gói đầu tiên không phải là gói đến mà là gói đi. Thay vào đó, điều này xảy ra bằng cách sử dụng lệnh gửi đi lo giao diện:

máy khách quy trình cục bộ cuộn tròn -> quyết định định tuyến -> conntrack -> nat/OUTPUT (không có quy tắc ở đây)
-> kiểm tra định tuyến lại -> AF_PACKET (tcpdump) -> đến cổng 8000

Và bây giờ gói này được lặp lại trên lo giao diện, nó xuất hiện lại dưới dạng một gói không còn là gói đầu tiên trong kết nối, vì vậy hãy làm theo trường hợp thứ hai như trên: conntrack một mình xử lý NAT và không gọi nat/CHUẨN BỊ. Ngoại trừ nó không được hướng dẫn ở bước trước để thực hiện bất kỳ NAT nào:

đến cổng 8000 -> AF_PACKET (tcpdump) -> conntrack
--> quyết định định tuyến --> ... -->khôngquá trình cục bộ nhận trên cổng8000

vì không có gì lắng nghe trên cổng 8000, hệ điều hành sẽ gửi lại TCP RST.

Để điều này hoạt động trên hệ thống cục bộ, một CHUYỂN ĐỔI quy tắc cũng phải được đưa vào tự nhiên/ĐẦU RA chuỗi:

iptables -t nat -I OUTPUT -d 192.168.1.100 -p tcp --dport 8000 -j REDIRECT --to-port 30000

Ghi chú bổ sung

  • nếu trường hợp được thiết kế để sử dụng từ xa, đừng kiểm tra từ hệ thống cục bộ: các quy tắc được kiểm tra thông qua không giống nhau. Điều này làm cho bài thi không phản ánh đúng thực tế.

    Chỉ cần sử dụng một không gian tên mạng để tạo một hệ thống điều khiển từ xa bỏ túi trong trường hợp không có hệ thống nào khác. Ví dụ sẽ hoạt động với một hệ thống chỉ có OP nat/CHUẨN BỊ quy tắc và làm cuộn tròn http://192.168.1.100/ (không yêu cầu DNS):

    ip netns thêm hệ thống từ xa
    liên kết ip thêm tên vethremote lên loại veth ngang hàng netns tên hệ thống từ xa eth0
    địa chỉ ip add 192.0.2.1/24 dev vethremote
    ip -n địa chỉ hệ thống từ xa thêm 192.0.2.2/24 dev eth0
    thiết lập liên kết hệ thống từ xa ip -n eth0
    ip -n tuyến hệ thống từ xa thêm 192.168.1.100 qua 192.0.2.1
    ip netns exec remotesystem curl http://192.168.1.100:8000/
    
  • tcpdump và NAT

    tcpdump xảy ra tại AF_PACKET các bước trong sơ đồ trên: rất sớm để xâm nhập và rất muộn để đi ra. Điều đó có nghĩa là đối với trường hợp hệ thống từ xa, nó sẽ không bao giờ chiếm được cổng 30000 ngay cả khi nó đang hoạt động. Đối với trường hợp hệ thống cục bộ, một khi tự nhiên/ĐẦU RA quy tắc được thêm vào, nó sẽ chiếm cổng 30000.

    Chỉ cần không tin tưởng một cách mù quáng vào địa chỉ/cổng được hiển thị bởi tcpdump khi thực hiện NAT: nó phụ thuộc vào trường hợp và nơi xảy ra quá trình chụp.

tiger_groove avatar
lá cờ us
Cảm ơn bạn rất nhiều vì đã giải thích chi tiết, tôi vẫn gặp một số vấn đề và đã đưa thêm thông tin vào bài đăng của mình. Nó dường như đang tiến xa hơn trước nhưng có vẻ như vẫn còn thứ gì đó đang cản trở.
A.B avatar
lá cờ cl
A.B
Tôi nghi ngờ rằng 1/quy trình cục bộ không phải là quy trình cục bộ mà là vùng chứa/nhóm (vì đó là về Kubernetes), do đó cũng được định tuyến hoặc lọc thêm (=> không có kết nối với không gian tên mạng mới). Tôi dựa trên câu trả lời của mình dựa trên quy tắc iptables duy nhất có trong câu hỏi và không có gì không khả dụng. Ngoài ra, tôi đã thử thành công những gì tôi đã trình bày trước khi đưa ra câu trả lời 2/như đã giải thích bộ đếm trong bảng nat chỉ tăng cho gói đầu tiên (ở trạng thái MỚI): nó sẽ tăng trong nat/OUTPUT hoặc nat/PREROUTING chứ không phải cả hai. bảng bộ lọc sẽ thấy tất cả các gói. 3/ câu hỏi ban đầu không phải về https
A.B avatar
lá cờ cl
A.B
Tôi sẽ không thay đổi thêm câu trả lời này. Bạn phải tạo một câu hỏi mới, với TẤT CẢ bối cảnh được đưa ra trước.Và tốt nhất là tạo lại sự cố không phụ thuộc vào Q/A hiện tại này (tiếp tục sử dụng quy tắc OUTPUT hoặc với hệ thống từ xa được biết là kết nối)
tiger_groove avatar
lá cờ us
Điều đó tốt, tôi sẽ tạo một câu hỏi mới. Rất biết ơn sự giúp đỡ của bạn!
tiger_groove avatar
lá cờ us
Tôi đã tạo một câu hỏi mới, vui lòng cho tôi biết nếu điều này hợp lý với bạn https://serverfault.com/questions/1097511/iptables-redirect-to-kubernetes-nodeport-causes-request-to-hang
A.B avatar
lá cờ cl
A.B
Vấn đề mới của bạn là về việc thực hiện một yêu cầu cuộn tròn đối với API của bạn, không phải về thời gian chờ vì tôi đã đề xuất một phương pháp thay thế một hệ thống từ xa không hoạt động trong thiết lập cụ thể của bạn. iptables hoàn toàn không nên tham gia vào câu hỏi mới. Tôi xin lỗi tôi đã không giải thích chính xác câu hỏi mới nên như thế nào
tiger_groove avatar
lá cờ us
Thật kỳ lạ vì khi tôi thực hiện cuộn tròn như thế này `ip netns exec remotesystem curl -vk https://192.168.1.100:30000/v1/flight` nó hoạt động tốt và tôi nhận được phản hồi, chỉ khi tôi thay đổi nó thành `192.168 .1.100:8000` nó bị treo, tôi không hoàn toàn chắc tại sao, nhưng có vẻ như có gì đó không giống với quy tắc iptables REDIRECT.
A.B avatar
lá cờ cl
A.B
Tôi đang nói về trường hợp SSL_ERROR_RX_RECORD_TOO_LONG không bị treo.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.