Điểm:0

tại sao MASQUERADE SNAT có thể chặn kết nối localhost?

lá cờ jp

Tôi đã quan sát thấy một hành vi kỳ lạ trên linux:

Đầu tiên, tôi xóa tất cả các quy tắc định tuyến và iptables:

ip route tuôn ra bảng chính
ip route tuôn ra bảng mặc định
ip route flush bảng cục bộ
iptables -P CHẤP NHẬN ĐẦU VÀO
iptables -P CHẤP NHẬN VỀ PHÍA TRƯỚC
iptables -P CHẤP NHẬN ĐẦU RA
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
ip6tables -P CHẤP NHẬN ĐẦU VÀO
ip6tables -P CHẤP NHẬN CHUYỂN ĐỔI
ip6tables -P CHẤP NHẬN ĐẦU RA
ip6tables -t nat -F
ip6tables -t mangle -F
ip6tables -F
ip6tables -X

Sau đó, tôi thêm một tuyến đường địa phương:

tuyến ip thêm local 127.0.0.1 dev lo proto kernel phạm vi Host src 127.0.0.1 bảng local

Sau đó, trên một thiết bị đầu cuối, tôi mở một cổng với nc-lp 12345 và trên một thiết bị đầu cuối khác, tôi kết nối với nó bằng nc 127.0.0.1 12345 và tôi có thể gửi và nhận dữ liệu giữa máy chủ netcat và máy khách. Vì vậy, bây giờ, tất cả là tốt.

Bây giờ, từ nó và sau khi tắt máy chủ và máy khách netcat trước đó, nếu tôi chạy:

iptables -t nat -A POSTROUTING -j MASQUERADE

và tôi khởi động lại máy chủ netcat, sau đó máy khách không kết nối được. Bạn có biết tại sao?

Tôi nhận thấy rằng việc thêm tuyến ip thêm cục bộ 192.168.0.10 dev wlan0 proto kernel phạm vi Host src 192.168.0.10 bảng cục bộ làm cho kết nối netcat hoạt động trở lại. Tuy nhiên, tôi không hiểu tại sao giao diện wlan0 (có 192.168.0.10 là IP) có thể ảnh hưởng đến giao diện loopback?

Để biết thông tin, tôi đang sử dụng ArchLinux

Saïmonn avatar
lá cờ in
Tôi đoán là quy tắc MASQUERADE thay đổi cổng gói nguồn, do đó làm hỏng gói trả về. Bạn có thể đăng một số đầu ra từ tcpdump chạy trên máy chủ cục bộ trong khi bạn đang chơi với netcat không? Tôi chắc rằng điều này có thể đưa chúng ta đến gần hơn với một câu trả lời có thể kiểm chứng được.
Điểm:1
lá cờ in

Tôi không biết đó là một lỗi hay một hành vi dự phòng có chủ ý, nhưng từ những gì tôi có thể thấy ở đây, nó không liên quan gì đến wlan0 tuyến đường cục bộ mà bạn đã đề cập hoặc tất cả cổng mặc định blah blah (không có ý xúc phạm nhưng nó hầu như không có ý nghĩa gì đối với tôi) được nêu trong câu trả lời khác/"đúng".

bình thường như thế nào MẶT NẠ hoạt động là, nó chọn địa chỉ được cấu hình trên hướng ngoại giao diện (được xác định bởi định tuyến, do đó SAU ĐƯỜNG) cho NAT nguồn mà nó thực hiện. (Nếu nhiều địa chỉ được gán trên giao diện, nó có thể sẽ chọn địa chỉ đầu tiên hoặc địa chỉ được đặt làm địa chỉ nguồn ưu tiên trong tuyến đường tương ứng; tôi không quen thuộc với nó và điều đó nằm ngoài phạm vi ở đây dù sao). Nó không liên quan gì đến địa chỉ nexthop/gateway của route mặc định. (Đó không phải là cách NAT nguồn hoạt động.)

Tuy nhiên, khi nói đến giao diện lo, mọi thứ dường như trở nên rắc rối một chút. Chính xác hơn, nó dường như không liên quan gì đến bản thân giao diện (ngoài thực tế là nó sẽ là giao diện gửi đi vì đích đến là một địa chỉ cục bộ), mà thực tế là, các địa chỉ trong 127.0.0.0/8 khối không thuộc phạm vi toàn cầu. Mặc dù tôi không biết chuyện gì đang xảy ra đằng sau hiện trường, nhưng có vẻ như lưu lượng truy cập không thể "xuất hiện" nếu máy chủ không có phạm vi toàn cầu Địa chỉ IP được định cấu hình nhưng cố gắng MẶT NẠ.

Những gì tôi có thể thấy ở đây là, ngay cả khi bạn chỉ định cấu hình một địa chỉ hợp lệ cho phạm vi toàn cầu (ví dụ. 192.168.0.10/32) trên bất kỳ giao diện nào (bao gồm cả lo), bạn sẽ thấy nó hoạt động trở lại. (Tuyến địa phương bạn đã đề cập sẽ được thêm tự động.Nhưng tôi không thấy rằng chỉ thêm tuyến đường hoạt động ở đây.)

Đối với giá trị của nó, các địa chỉ và giao diện không bị ràng buộc chặt chẽ với nhau trong Linux (không phải theo cách đơn giản như, nó sẽ chỉ trả lời các lượt truy cập nếu địa chỉ đích của chúng khớp với địa chỉ được định cấu hình trên giao diện gửi đến, ngay cả khi chuyển tiếp IP là không đáng quan tâm). Vì vậy, nó có thể liên quan đến điều đó: trong trường hợp MẶT NẠ không thể chọn một phạm vi toàn cầu địa chỉ từ những gì được định cấu hình trên giao diện gửi đi, nó chỉ chọn một từ bất kỳ (tôi nghi ngờ rằng quyền ưu tiên có liên quan đến tuyến đường mặc định), nếu vẫn không, nó chỉ từ chối hoạt động theo một cách nào đó.

Trong trường hợp bạn thực sự cần một quy tắc cho phép MẶT NẠ trên tất cả các giao diện nhưng lo, bạn có thể có:

iptables -t nat -A POSTROUTING ! -o lo -j MẶT MẠO
Điểm:1
lá cờ us

Đây là một phỏng đoán có giáo dục. Các MẶT NẠ tùy chọn thay thế địa chỉ IP nguồn trong các gói IP bằng địa chỉ mà nó quyết định sử dụng. Tôi nghĩ trong trường hợp này, nó thay thế địa chỉ nguồn bằng địa chỉ giao diện nơi có thể truy cập cổng mặc định.

Vì vậy, nếu cổng mặc định của bạn là 192.168.0.1, địa chỉ nguồn của gói được thay thế bằng 192.168.0.1. Đích đến là 127.0.0.1và điều này không hoạt động bình thường.

Bạn nên hạn chế MẶT NẠ chỉ các gói trong đó giao diện gửi đi là giao diện hướng tới cổng mặc định.

Bạn có thể làm điều đó với lệnh sau:

iptables -t nat -A POSTROUTING -o <if> -j MASQUERADE
Điểm:0
lá cờ jp

Ngoài các câu trả lời khác, tôi đã thực hiện một số thí nghiệm khác. Xin lưu ý rằng những điều sau đây chỉ là kết luận của tôi, tôi không tìm kiếm bên trong nguồn kernel (nhưng nếu bạn có tài liệu, vui lòng chia sẻ).

Thật vậy, có vẻ như các lo giao diện và 127.0.0.1 tuân theo các quy tắc riêng của họ.

Đối với các giao diện khác, đây là cách tôi tin rằng IP nguồn được gán cho một gói (không nói về MASQUERADE hoặc những thứ như ổ cắm thô):

Khi một người cố gắng gửi một gói đến một IP đích, linux sẽ tìm kiếm một quy tắc định tuyến phù hợp được thêm vào như sau:

định tuyến ip thêm <MẠNG>/<PREFIX> dev <INTERFACE_XX> [src <SRC_IP>]

Nếu thông số src được cung cấp (điều này dường như ngụ ý thêm một quy tắc như định tuyến ip thêm nhà phát triển <SRC_IP> cục bộ <INTERFACE_YY> trước. Lưu ý rằng INTERFACE_XX và INTERFACE_YY không giống nhau khá ngạc nhiên), sau đó gói được gửi trên giao diện GIAO DIỆN_XX với SRC_IP như IP nguồn.

Nếu thông số src không được cung cấp, nó sẽ gửi gói trên GIAO DIỆN_XX và địa chỉ nguồn được chọn bằng cách tìm kiếm IP hợp lệ đầu tiên trên giao diện từ giao diện bắt đầu đầu tiên đến giao diện cuối cùng (ngoại trừ lo). Nếu không tìm thấy IP, IP nguồn được đặt thành 0.0.0.0. Nếu một giao diện có nhiều IP, nó sẽ chọn giao diện đầu tiên. Khá ngạc nhiên, điều này có nghĩa là một gói không nhất thiết phải có IP của giao diện đầu ra mà nó được gửi tới.

Tôi đoán MASQUERADE chọn IP nguồn theo cách tương tự.

Xin hãy sửa tôi là bạn nghĩ đôi khi là sai.

Đă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.