quy tắc iptables chỉ cho phép lưu lượng HTTP đến một tên miền


20

Tôi cần định cấu hình máy của mình để chỉ cho phép lưu lượng HTTP đến / từ serverfault.com. Tất cả các trang web, cổng dịch vụ khác không thể truy cập. Tôi đã đưa ra các quy tắc iptables này:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

Nó không hoạt động khá tốt:

  • Sau khi tôi bỏ mọi thứ và chuyển sang quy tắc 3:

    iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j CHẤP NHẬN

Tôi nhận được lỗi này:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

Bạn có nghĩ rằng nó có liên quan đến DNS? Tôi có nên cho phép nó là tốt? Hoặc tôi chỉ nên đặt địa chỉ IP trong các quy tắc? Bạn có nghĩ rằng những gì tôi đang cố gắng có thể đạt được với các quy tắc đơn giản hơn không? Làm sao?

Tôi sẽ đánh giá cao bất kỳ sự giúp đỡ hoặc gợi ý về điều này. Cảm ơn rất nhiều!


2
Đừng quên sstatic.net và những người khác. serverfault.com không hoàn toàn đến từ serverfault.com
Zoredache

Bạn có thể chạy proxy trên một hệ thống khác không? Đây là giải pháp tốt nhất / dễ nhất: serverfault.com/questions/215134
mattdm

Câu trả lời:


29

Với quy tắc IPTables, vấn đề đặt hàng. Các quy tắc được thêm vào, và áp dụng, theo thứ tự. Hơn nữa, khi thêm quy tắc thủ công, họ sẽ được áp dụng ngay lập tức. Do đó, trong ví dụ của bạn, mọi gói tin đi qua chuỗi INPUT và OUTPUT bắt đầu bị hủy ngay khi chính sách mặc định được đặt. Đây cũng là lý do tại sao bạn nhận được thông báo lỗi bạn đã làm. Điều gì đang xảy ra là đây:

  1. Chính sách DROP mặc định được áp dụng
  2. IPTables nhận tên máy chủ làm đích
  3. IPTables thử tra cứu DNS trên 'serverfault.com'
  4. Tra cứu DNS bị chặn bởi hành động DROP

Mặc dù các tùy chọn nguồn / đích sẽ chấp nhận tên máy chủ lưu trữ, nhưng nó không được khuyến khích. Để trích dẫn trang người đàn ông,

Tên máy chủ sẽ chỉ được giải quyết một lần, trước khi quy tắc được gửi tới kernel. Xin lưu ý rằng việc chỉ định bất kỳ tên nào sẽ được giải quyết bằng một truy vấn từ xa như DNS là một ý tưởng thực sự tồi tệ.

Slillibri đánh vào đầu mà câu trả lời của anh ta, bạn đã bỏ lỡ quy tắc ACCEPT DNS. Trong trường hợp của bạn, điều đó không thành vấn đề, nhưng nhìn chung tôi sẽ đặt chính sách mặc định sau này cho quy trình. Điều cuối cùng bạn muốn là làm việc từ xa và cho phép SSH sau khi bật từ chối mặc định.

Ngoài ra, tùy thuộc vào bản phân phối của bạn, bạn sẽ có thể lưu các quy tắc tường lửa của mình sao cho chúng sẽ được áp dụng tự động khi bắt đầu.

Biết tất cả những điều đó và sắp xếp lại kịch bản của bạn, đây là những gì tôi muốn giới thiệu.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

3
Đẹp, câu trả lời cũng được chế tác.
JakeRobinson

1
Tôi đánh giá cao nó, mặc dù bạn cũng đã bỏ lỡ sai lầm của tôi. Rất tiếc.
Scott Pack

3
Trên thực tế, bạn có thể đặt các iptables -Pcâu lệnh của mình ở bất cứ đâu trong tập lệnh của bạn, vì các chính sách chuỗi chỉ được áp dụng khi các gói "rơi" vào cuối chuỗi. Tôi thường đặt các báo cáo chính sách (thường là DROPchính sách) ở đầu các tập lệnh iptables của mình.
Steven Thứ Hai

1
@Steven: Bạn hoàn toàn đúng. OP dường như đang gõ chúng tương tác. Hãy giả vờ rằng bạn được kết nối với máy chủ của mình qua SSH và quy tắc đầu tiên của bạn là dành cho DROP chính sách. Kết nối SSH của bạn sẽ bị hủy trước khi bạn có thể nhập thêm bất kỳ quy tắc nào. Đây là cùng một vấn đề thời gian, nếu một biểu hiện khác, hơn là cô ấy gặp phải.
Scott Pack

Cảm ơn. Đã thử điều này. Nhưng không làm việc mà không thêm sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Không nên thêm nó?
Kiran

7

Thêm vào

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

để cho phép tra cứu DNS.


5

Loại yêu cầu này có thể được xử lý tốt hơn với proxy web và / hoặc bộ lọc. Dansgaurdian có thể được cấu hình để làm điều này. Bạn sẽ cần sử dụng các quy tắc NAT để buộc lưu lượng truy cập của mình thông qua bộ lọc.

Sử dụng iptables để lọc sẽ cho phép mọi trang web có sẵn từ các địa chỉ IP có liên quan. Đây thường là một tập hợp con nhỏ của toàn bộ web.


1
Hoàn toàn đồng ý với điều này. iptablescó lẽ là công cụ sai để sử dụng ở đây, vì nó không xử lý đặc biệt tốt với tên DNS. Một proxy web với các cài đặt bộ lọc phù hợp là phù hợp hơn nhiều.
Steven Thứ Hai

2

Tôi sợ iptables không hoạt động ở cấp độ này, nó chỉ quan tâm đến địa chỉ IP, không phải tên máy chủ. Nếu bạn muốn chặn quyền truy cập vào các máy chủ ảo tên khác trên cùng một ip, bạn sẽ cần xem xét việc đưa vào các tệp .htaccess.


Vấn đề là, khi tôi thử quy tắc 3 mà không "bỏ mọi thứ" thì nó hoạt động tốt với iptables!
Zenet

2
hmm, tôi đọc sai câu hỏi Đúng vậy, những gì đang diễn ra trong nền là iptables sẽ phân giải serverfault.com thành 64.34.119.12 (xem câu trả lời từ slillibri để hiểu lý do giải quyết không hoạt động). Tuy nhiên, vì iptables không hiểu tên máy chủ và chỉ cho phép ip, bạn sẽ có thể kết nối với bất kỳ trang web nào trên ip đó, nếu nó có nhiều trang web.
Niall Donegan

2
@Emily, nó có thể hoạt động tốt, trong đó quy tắc được thêm vào, nhưng nếu IP của serverfault.com thay đổi, lưu lượng sẽ không được phép. Cho phép một trang web như google.com có ​​hàng trăm địa chỉ được thay đổi thường xuyên sẽ không hoạt động.
Zoredache

1

Bạn cần cấu hình cái này ở máy chủ web của bạn. iptables là một bộ lọc gói. Các giao dịch HTTP gửi tên trang web (tức là stackoverflow) như một phần của tải trọng TCP (nghĩa là không phải là một phần của tiêu đề TCP, đây là những gì iptables đọc dễ dàng).

Do đó, và thực tế là các giao dịch HTTP gần như chắc chắn sẽ được trải rộng trên nhiều gói (nghĩa là bạn không thể khớp chuỗi trong tiêu đề HTTP), điều này được xử lý tốt hơn nhiều bởi cấu hình máy chủ web của bạn hoặc bằng proxy ở phía trước của nó

Sẽ rất hữu ích khi biết lý do đằng sau điều này, có một vài lựa chọn thay thế khác:

  1. Chuyển hướng đến URL chính xác nếu họ nhập sai URL (ví dụ: chuyển hướng đến stackoverflow.com nếu họ nhập www.stackoverflow.com)
  2. Yêu cầu máy chủ web của bạn không phục vụ các máy chủ khác ngoài stackoverflow.com
  3. Đặt trang web trên một IP riêng mà không có gì khác giải quyết và chỉ khiến máy chủ web của bạn lắng nghe điều đó.

Xin chào Phil, tôi không chắc tôi hiểu máy chủ web là gì? Tôi không có máy chủ web. Tôi đang thực hiện cấu hình này trên máy tính của mình.
Zenet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.