Điểm:1

Tại sao mọi người sử dụng MASQUERADE/SNAT thay vì NAPT/PAT?

lá cờ in

Câu chuyện

Tôi có giao diện ảo bảo vệ dây VPN wg0 (có thể là bất cứ thứ gì khác) và giao diện vật lý eth0. Tôi muốn định tuyến các gói từ VPN đến mạng LAN của mình hoặc từ giao diện này sang giao diện khác.

Hầu như tất cả các blog, bài viết, hướng dẫn đều đưa ra lời khuyên sử dụng MẶT NẠ hoặc Nguồn NAT chỉ có: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Hơn thế nữa, giả mạo IP chỉ đơn giản là SNAT (NAT nguồn), nó không thay đổi cổng nguồn.

Câu hỏi

  • Tôi có sai không khi nghĩ rằng tôi nên sử dụng một GIỮA NGỦ/PAT thay thế?
  • Để hoàn thiện, làm cách nào tôi có thể thêm quy tắc NAPT/PAT với iptables và/hoặc nftables?

suy nghĩ

Có thể có xung đột (cổng nguồn) giữa các gói được tạo bởi máy chủ và được chuyển tiếp từ wg0 (hoặc bất kỳ giao diện ảo/vật lý nào khác). IMHO NAPT phải được sử dụng để tránh những xung đột này.

RFC 2663, Dịch cổng địa chỉ mạng (NAPT)

Điểm:6
lá cờ za

Bằng cách nào đó bạn có sự phân biệt sai lầm giữa SNAT/GIẤU MẶTGIỮA NGỦ/PAT. Nó không có ở đó.

Trong Linux, có hai loại quy tắc NAT động, bạn gọi cả hai loại này là "NAPT":

  • NAT nguồn, có ý định giữ nguyên địa chỉ đích và chỉ thay đổi nguồn Địa chỉ. Đôi khi nó sẽ cũng thay đổi cổng nguồn. Ví dụ: nếu bảng theo dõi kết nối đã chứa bản ghi với thông tin cụ thể này (proto, src-addr, src-port, dst-addr, dst-port) tuple (src-addr và src-port là sau khi dịch), để có thể phân biệt cái nào là cái nào thì bản dịch mới phải dùng một cổng src khác (vì đây là bậc tự do duy nhất) nên hiện tượng "NAPT" tất yếu sẽ xảy ra. Các ví dụ về quy tắc kiểu SNAT là SNATMẶT NẠ. Sự khác biệt giữa chúng là với SNAT, bạn được yêu cầu chỉ định trong quy tắc dịch sang địa chỉ nào (và, có thể, phạm vi cổng nào sẽ sử dụng), trong khi với MASQUERADE, nó tự đưa ra lựa chọn, dựa trên giao diện mà gói được định sẵn để đi ra. Cả hai đều được cài đặt vào SAU ĐƯỜNG chuỗi, sau khi hầu hết quá trình xử lý khác đã diễn ra, bao gồm cả việc định tuyến gói tin. Loại quy tắc này được sử dụng để cho phép nhiều máy tính được ẩn sau một địa chỉ IP thoát duy nhất, ví dụ: để truy cập Internet cho mạng LAN, v.v. Điều này cũng sẽ bao gồm bất kỳ người dùng VPN nào, nếu bạn định truy cập Internet qua VPN.
  • NAT đích, giữ nguyên địa chỉ nguồn và chỉ cập nhật điểm đến và, nếu bạn đã định cấu hình cổng đích, thì đây cũng là quy tắc "NAPT". Quy định của loại này là ADNT, CHUYỂN ĐỔI, CỤM và có thể là một số khác nữa, tôi không nhớ hết; chúng được cài đặt vào ĐẶT TRƯỚC chuỗi, bởi vì quyết định định tuyến thường phải được thay đổi dưới ảnh hưởng của quy tắc. Gói ban đầu được định sẵn cho chính máy (có địa chỉ của nó là đích đến) và sẽ được duyệt qua ĐẦU VÀO và tiếp cận một số quy trình cục bộ, thay vào đó đang được dịch và sau khi duyệt qua PHÍA TRƯỚC chuỗi nó đang được chuyển tiếp đến một số hệ thống khác. Hoặc ngược lại. Đi đâu, INPUT hoặc FORWARD, là quyết định định tuyến mà chúng ta phải thay đổi theo quy tắc. Loại quy tắc này được sử dụng để truy cập vào một số hệ thống nội bộ từ Internet.

Nhân tiện, đôi khi, cả hai các quy tắc có thể được sử dụng cho một gói (và kết nối). Đây là trường hợp đặc biệt, nhưng hữu ích nếu bạn cần các gói từ một số hệ thống bên ngoài (vì vậy DNAT phải được sử dụng trong PREROUTING) xuất hiện như là đến từ một số địa chỉ nội bộ (mà SNAT được sử dụng trong POSTROUTING).

Trong Linux cũng có các quy tắc kiểu NAT tĩnh như NETMAP khá đặc biệt và hiếm khi được sử dụng. Tôi nghi ngờ bạn đang nói về nó và rằng bạn đã thấy bất kỳ hướng dẫn nào đề cập đến loại quy tắc này.

Linux làm cho hoàn toàn không có sự phân biệt giữa địa chỉ riêng (RFC1918) và địa chỉ công cộng. Bạn có thể NAT mạng con công khai của mình nếu muốn (nhưng điều này sẽ gây lãng phí địa chỉ). Bạn có thể để các IP riêng mà không cần dịch (nhưng thông thường điều này sẽ dẫn đến việc không có kết nối Internet cho chúng).

VPN không gì khác hơn là giao diện mạng bổ sung trong máy và nên được xử lý như vậy. Do đó, bạn được phép sử dụng các địa chỉ công cộng cho VPN, nếu bạn có chúng. Ví dụ: tôi có thể có một số /29 mạng con được định tuyến đến bởi bộ định tuyến VPN và thiết lập OpenVPN để toàn bộ mạng con công khai này sẽ là mạng VPN của tôi! Trong khi ví dụ OpenVPN có vẻ giả tạo, thì WireGuard là nhiều nhiều khả năng được cấu hình như vậy. Ví dụ, giải pháp không gian tên mới cho phép wireguard là giao diện duy nhất trong hệ thống. Nếu có yêu cầu hệ thống phải trực tiếp có IP công cộng (tôi sẽ không thảo luận về bất kỳ lý do nào dẫn đến yêu cầu này), thì chắc chắn bạn sẽ phải sử dụng IP công cộng bên trong VPN! Rất có thể, không có bất kỳ NAT nào cho họ.

Alexis avatar
lá cờ in
Cảm ơn câu trả lời dài của bạn. NAT và NAPT có định nghĩa, tôi không hiểu sai. Tôi chưa bao giờ nói về IP công cộng/riêng tư. Tôi đã không gắn thẻ bảo vệ dây vì như bạn đã nói, điều khiển giao diện không quan trọng. Một câu trả lời có thể chấp nhận được cho tôi biết rằng **nguồn NAT** của bộ lọc mạng thực sự đang thực hiện **NAPT/PAT** cùng một lúc. Đó là tất cả những gì tôi đã bỏ lỡ, tôi nghĩ rằng chúng tôi phải nói rõ ràng với bộ lọc mạng rằng chúng tôi muốn dịch cổng **cũng** kết hợp với NAT đơn giản.
Nikita Kipriyanov avatar
lá cờ za
Tại sao bạn cho rằng định nghĩa mà bạn gặp phải là đúng, hoặc không thể có định nghĩa nào khác? NAT có thể được định nghĩa để nó bao gồm cả dịch cổng và định nghĩa *that* được sử dụng trong Linux chứ không chỉ trong Linux. Trên thực tế, phiên bản "nghiêm ngặt" khá không thực tế, vì việc sử dụng NAT phổ biến hiện nay là cho phép nhiều máy truy cập Internet bằng một địa chỉ IP công cộng duy nhất và điều này * yêu cầu * dịch cổng cũng vì lý do tôi đã đề cập trong câu trả lời của mình. Vì vậy, đối với các mục đích thực tế, sẽ khôn ngoan hơn khi lấy định nghĩa về NAT * bao gồm * bản dịch cổng.
Alexis avatar
lá cờ in
**rfc2663**:`Dịch địa chỉ mạng là phương pháp mà theo đó **địa chỉ IP** được ánh xạ từ vùng địa chỉ này sang vùng địa chỉ khác, cung cấp khả năng định tuyến minh bạch tới máy chủ cuối.` Tôi chỉ đọc định nghĩa và nó không bao gồm NAPT . Tuy nhiên, bạn phù hợp với mục đích thực tế, sẽ khôn ngoan hơn nếu tất cả các tài liệu/người đề cập đến NAT cũng đưa PAT vào định nghĩa của họ một cách rõ ràng.
Alexis avatar
lá cờ in
Trên thực tế, theo định nghĩa, Linux và tất cả đều sai và tất cả nên sử dụng NAPT thay vì NAT...trong một thế giới nơi mọi người sử dụng các thuật ngữ chính xác.
Nikita Kipriyanov avatar
lá cờ za
Không phải bạn hay RFC là người định nghĩa từ vựng chính xác. Ngôn ngữ là một con thú sống mà dường như chúng ta hoàn toàn không kiểm soát được ;) Điều duy nhất có giá trị ở đây là sự đồng thuận của công chúng.
Alexis avatar
lá cờ in
Đồng ý, trong trường hợp đó nó phải được ghi lại hoặc đề cập rộng rãi hơn. Rất hiếm khi đề cập đến việc dịch cổng kết hợp với NAT doc/blog/tutorials/trang bất kỳ. Do đó câu hỏi của tôi.
TooTea avatar
lá cờ in
@Alexis "NAT" chỉ là thuật ngữ công nghiệp chung tiêu chuẩn cho bất kỳ loại dịch mạng và cổng nào. Trừ khi bạn đang viết một RFC, bạn không cần phải phân biệt rõ ràng giữa NAT, NAPT và PAT. (Bạn cũng sẽ thấy mọi người nói về "NAT hình nón đầy đủ" và "NAT đối xứng" và những thứ tương tự.)
Điểm:6
lá cờ gr

Nếu đích có thể định tuyến lưu lượng truy cập của nó tới nguồn thì không cần NAT hoặc PAT.

Ví dụ: không cần NAT/PAT nếu máy khách VPN trong 10.8.0.0/24 muốn nói chuyện với các thiết bị LAN của bạn trong 192.168.1.0/24, miễn là các thiết bị liên quan có thể định tuyến đến mạng khác (thông qua cổng của chúng ).

Khi nguồn nằm trong mạng rfc1918 (IP riêng) và đích là IP công cộng, vì mạng rfc1918 không thể định tuyến qua Internet, cần có NAT để thay thế IP riêng bằng IP công cộng. Đây là bản dịch địa chỉ nguồn. Công việc này có thể được thực hiện bởi SNAT, không phải PAT.

Hơn nữa, bạn đã sai khi cho rằng SNAT/MASQUERADE không thay đổi cổng nguồn.

Tùy chọn --to-source được sử dụng để chỉ định nguồn nào mà gói sẽ sử dụng. Tùy chọn này, đơn giản nhất, lấy một địa chỉ IP mà chúng tôi muốn sử dụng cho địa chỉ IP nguồn trong tiêu đề IP. Nếu chúng tôi muốn cân bằng giữa một số địa chỉ IP, chúng tôi có thể sử dụng một dải địa chỉ IP, được phân tách bằng dấu gạch nối. Ví dụ: số --to--source IP có thể giống như trong ví dụ trên: 194.236.50.155-194.236.50.160. IP nguồn cho mỗi luồng mà chúng tôi mở sau đó sẽ được phân bổ ngẫu nhiên từ những luồng này và một luồng sẽ luôn sử dụng cùng một địa chỉ IP cho tất cả các gói trong luồng đó. Chúng tôi cũng có thể chỉ định một loạt các cổng sẽ được sử dụng bởi SNAT. Tất cả các cổng nguồn sau đó sẽ được giới hạn trong các cổng được chỉ định. Sau đó, bit cổng của quy tắc sẽ giống như trong ví dụ trên, :1024-32000. Điều này chỉ hợp lệ nếu -p tcp hoặc -p udp được chỉ định ở đâu đó trong sự phù hợp của quy tắc được đề cập. iptables sẽ luôn cố gắng tránh thực hiện bất kỳ thay đổi cổng nào nếu có thể, nhưng nếu hai máy chủ cố gắng sử dụng cùng một cổng, iptables sẽ ánh xạ một trong số chúng sang một cổng khác. Nếu không có phạm vi cổng nào được chỉ định, thì nếu cần, tất cả các cổng nguồn bên dưới 512 sẽ được ánh xạ tới các cổng khác bên dưới 512. Những cổng nằm giữa cổng nguồn 512 và 1023 sẽ được ánh xạ tới các cổng bên dưới 1024. Tất cả các cổng khác sẽ được ánh xạ tới 1024 trở lên.Như đã nêu trước đây, iptables sẽ luôn cố gắng duy trì các cổng nguồn được sử dụng bởi máy trạm thực tế tạo kết nối. Lưu ý rằng điều này không liên quan gì đến cổng đích, vì vậy nếu máy khách cố gắng liên lạc với máy chủ HTTP bên ngoài tường lửa, nó sẽ không được ánh xạ tới cổng điều khiển FTP.

https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#SNATTARGET

Lưu ý rằng nếu thiết bị của bạn muốn truy cập máy chủ từ xa trên một cổng đích nhất định, có khả năng hệ điều hành đã chỉ định một cổng nguồn ngẫu nhiên trên 1024. Tiếp cận máy chủ HTTPS từ xa trên cổng 443, không liên quan đến việc cổng nguồn là 443.

Alexis avatar
lá cờ in
Nếu không thêm các tuyến tĩnh trong cổng hoặc tất cả các nút mạng cục bộ, chúng sẽ không thể định tuyến lại các gói tới mạng con VPN. Cần có NAT/NAPT.
Alexis avatar
lá cờ in
Tôi không đồng ý với `Công việc này có thể được thực hiện bởi SNAT, không phải PAT`, NAPT là cần thiết nếu có nhiều máy tính sử dụng cùng một IP công cộng.
Alexis avatar
lá cờ in
Cảm ơn vì liên kết, đó không phải là tài liệu chính thức của iptables và đó là vấn đề của tôi. Nếu nó thực sự hoạt động như vậy đối với quy tắc NAT, thì nó chống lại rfc. Tôi không muốn iptables làm những gì tôi không yêu cầu (thay đổi lớp 4).Bạn có bất kỳ **tài liệu chính thức** nào nói như vậy không? netfilter, iptables hay nftables? Ngoài ra, đừng trộn thuật ngữ SNAT mô tả khái niệm với tên của mục tiêu trong iptables. Theo định nghĩa của nó, `SNAT/MASQUERADE` không **KHÔNG** thay đổi lớp 4. Nếu `iptables` cho phép thực hiện PAT/NAPT trên cái gọi là mục tiêu SNAT của nó, thì điều đó lại khác.
lá cờ gr
Có, PAT là cần thiết nhưng nhiệm vụ này được xử lý bởi mục tiêu SNAT của iptables (hoặc MASQUERADE, về cơ bản là SNAT). Đây là lý do tại sao SNAT (hoặc MASQUERADE) của iptables là đủ, bạn không cần phải thực hiện PAT một cách rõ ràng. SNAT thực hiện dịch cổng, như đã nêu trong tài liệu không chính thức, nhưng được xác nhận bởi tài liệu chính thức của bộ lọc mạng. Xem phần " 6.3.4. Ánh xạ cổng nguồn tiềm ẩn". https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.txt
Alexis avatar
lá cờ in
Cảm ơn. Nắm bắt tốt, tôi sẽ coi nó vẫn hợp lệ đối với các nhân> 2.4. `SNAT/MASQUERADE` không nên thực hiện dịch cổng hoàn toàn. Tôi tin rằng quyết định của bộ lọc mạng là kết hợp cả hai. (như được chỉ định trong rfc2663) Tôi ước điều này có thể được giải thích hoặc nêu chi tiết ở đâu đó. Tôi sẽ cẩn thận với các hệ thống khác.
ilkkachu avatar
lá cờ us
@Alexis, TBH, bạn hơi ngớ ngẩn. Trang hướng dẫn [`iptables`](https://man7.org/linux/man-pages/man8/iptables-extensions.8.html) cho biết `SNAT` thực hiện dịch cổng và `MASQUERADE` cũng tương tự. Và RFC mà bạn đã liên kết thậm chí không đề cập đến một trong hai thuật ngữ đó. Vì vậy, nó được ghi lại để làm những gì nó làm và RFC thậm chí không sử dụng các thuật ngữ tương tự, vì vậy nó thậm chí không phải là một ý nghĩa quá tải. Không có vấn đề ở đó. Nếu bạn chỉ muốn dịch địa chỉ, thì bạn sẽ phải sử dụng một số chức năng khác. `NETMAP` có vẻ như là một, nhưng tôi chưa sử dụng nó.
Alexis avatar
lá cờ in
@ilkkachu hãy giữ sự ngớ ngẩn cho bạn, tôi không phải là bạn của bạn.Trang web bạn đã liên kết không cho biết nó thực hiện dịch cổng tự động cho `SNAT` hay `MASQUERADE`, chỉ các tùy chọn mà chúng tôi có thể hiểu là **tùy chọn** cho biết một tính năng **chủ yếu/99%** được sử dụng cho * rõ ràng *cổng chuyển tiếp**.
ilkkachu avatar
lá cờ us
@Alexis, phải không? Đối với SNAT: "--to-source [...] Nếu không có phạm vi cổng nào được chỉ định, sau đó các cổng nguồn bên dưới 512 sẽ được ánh xạ tới các cổng khác dưới 512: bao gồm từ 512 đến 1023 sẽ là được ánh xạ tới các cổng bên dưới 1024 và các cổng khác sẽ được ánh xạ đến 1024 hoặc cao hơn. Nếu có thể, sẽ không có thay đổi cổng xảy ra." cho MASQUERADE: "--to-ports port[-port] Điều này chỉ định một loạt các cổng nguồn để sử dụng, ghi đè phỏng đoán lựa chọn cổng nguồn SNAT mặc định (xem ở trên)."
ilkkachu avatar
lá cờ us
@Alexis, và tôi chưa bao giờ nói bạn như vậy. Chỉ là bạn dường như có một số kỳ vọng đơn giản là không áp dụng và RFC mà bạn đề cập đến thậm chí không hỗ trợ bạn trong câu hỏi đặt tên. Những người Linux có thể đặt tên cho công cụ của họ theo bất cứ thứ gì họ thích, và sau nhiều năm như vậy, họ sẽ không có khả năng thay đổi nó. Vì vậy, về cơ bản, bạn có thể chọn xem bạn muốn chiến đấu chống lại những chiếc cối xay gió (điều này, IMO, hơi ngớ ngẩn), hoặc chấp nhận nó như nó vốn có. Nếu bạn nghĩ rằng tài liệu không đủ rõ ràng, tất nhiên bạn có thể gửi cho họ một báo cáo lỗi để làm rõ điều đó?

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