Từ chối tất cả các kết nối đến với iptables?


17

Tôi muốn thực hiện một số quy tắc iptables đơn giản để từ chối tất cả các kết nối đến và cho phép gửi đi. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


24

Hãy thử điều này với quyền truy cập root:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Lưu ý rằng điều này sẽ cắt đứt một cách tàn nhẫn tất cả các kết nối đang chạy - điều này bao gồm những thứ như kết nối SSH bạn có thể sử dụng để quản trị máy chủ. Chỉ sử dụng điều này nếu bạn có quyền truy cập vào bảng điều khiển cục bộ.

Xem câu trả lời của Miphix để biết cách thêm ngoại lệ cho SSH.


2
Khi tôi thực hiện quy tắc đầu tiên của bạn, tôi đã bị ngắt kết nối với SSH
holms

7
Câu hỏi là "từ chối tất cả các kết nối đến" và không "từ chối tất cả các kết nối đến ngoại trừ SSH" :)
Yohann

Tôi đã đọc cảnh báo của @holms về quy tắc đầu tiên quá muộn ...
DenisKolodin

Lưu ý rằng điều này không ảnh hưởng đến lưu lượng ipv6. Đọc câu trả lời của tôi dưới đây nếu bạn đã bật ipv6.
bmus

13

Nếu bạn đang làm việc từ xa thông qua SSH, bạn có thể muốn thêm điều này ( -Ichèn nó trước tất cả các quy tắc khác INPUT):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

Nếu dịch vụ SSH của bạn đang lắng nghe trên một cổng khác, bạn sẽ phải sử dụng cổng đó thay vì 22.

Nếu không, bạn có thể vô tình mất quyền truy cập.


2

Xin lưu ý rằng các câu trả lời khác không bao gồm IPv6! Nếu hệ thống của bạn chấp nhận lưu lượng IPv6, không một quy tắc iptables nào sẽ áp dụng cho lưu lượng ipv6.

thay vì sử dụng trực tiếp iptables / ip6tables, tôi khuyên bạn nên sử dụng iptables-restore và lưu. Các công cụ này cho phép chỉ định cấu hình iptables với nhiều quy tắc và dễ dàng tải nó bằng một lệnh.

tạo một tệp (tôi đặt tên là iptables.rules) với nội dung sau:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

Lưu ý tôi đã thêm một số ví dụ bổ sung nếu bạn muốn cho phép ICMP và lưu lượng truy cập vào các cổng cụ thể.

bây giờ bạn có thể tải nó bằng các lệnh sau:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

Bây giờ quy tắc của bạn cũng bao gồm ipv6 và dễ quản lý.

Lưu ý bổ sung cho người dùng Debian: nếu bạn hài lòng với các quy tắc của mình, bạn có thể apt install iptables-persistentđể các quy tắc được khôi phục sau khi khởi động lại. Các quy tắc không được lưu tự động khi tắt máy, vì vậy hãy chạy netfilter-persistent saveđể cập nhật các quy tắc liên tục.


1

Cả hai câu trả lời trên đều đúng, nhưng chúng không đủ chính xác để bắt nguồn câu trả lời. (Xin lỗi tôi không đủ danh tiếng để thêm nhận xét, vì vậy hãy viết câu trả lời hoàn chỉnh).

Tôi trường hợp của tôi, tôi đã gặp máy chủ apache quá tải, quá nổi với các công việc cron, sử dụng quá nhiều cpu. Giới hạn luồng được lưu trữ trong cơ sở dữ liệu SQL, nhưng tôi đã gặp giới hạn của các kết nối. Tôi muốn giới hạn các kết nối apache đến từ máy chủ cục bộ (phần này là tùy chọn), nhưng giữ tất cả các kết nối khác có thể. Bao gồm cả những người đã thực sự được thành lập.

Tôi đã làm nó với lệnh

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

Nó có nghĩa là: đối với mỗi gói tcp đến trên cổng 80, statemô-đun tải và nếu đây là gói đầu tiên (kết nối đến) từ chối nó. Đối với localhost, bạn có thể chỉ cần sử dụng-s 127.0.0.0/8

Và để sử dụng trong thế giới thực, trong một số trường hợp, bạn có thể thêm 'INVALID' vào các tiểu bang NEW,INVALID, bởi vì người ta có thể gửi các gói "độc hại", cố gắng bỏ qua quy tắc của bạn. Và cũng thay thế bằng -j DROPđể lưu lưu lượng truy cập đi của bạn (nó sẽ không gửi đèn hiệu từ chối)

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.