iptables Mẹo & Thủ thuật [đã đóng]


60

Tôi chắc chắn rằng các hệ thống Linux khá quen thuộc iptables, giao diện người dùng với netfilterkhung lọc gói.

Bây giờ, "Câu hỏi" này có nghĩa là một Wiki cộng đồng để thu thập các mẩu iptablestrí tuệ khác nhau. Không có gì là quá phổ biến hoặc quá tối nghĩa. Đăng bất cứ điều gì bạn biết sẽ giúp người khác tận dụng tối đa iptables.

Câu trả lời:


26

Sử dụng danh sách trắng và danh sách đen với iptables

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

Script để mở cổng

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

Chặn portscan

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

Các gói giả mạo / không hợp lệ

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

Chặn các cuộc tấn công Smurf

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

Chặn ICMP (còn gọi là ping)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

4
Cân nhắc thêm một nhận xét vào các bình luận "giả mạo", để người dùng ít kinh nghiệm biết lý do tại sao các địa chỉ nguồn được coi là giả mạo (... khi đến trên giao diện wan).
3molo

1
Cuộc gọi tốt :-). Làm xong.
Bart De Vos

chờ đợi. Không chặn dòng ICMP (hay còn gọi là ping) để chặn dòng tấn công smurf: iptables -A INPUT -p icmp -m icmp -j DROP?
Stann

2
Re kịch bản danh sách trắng: Có iptablestrên dòng 8, và sau $IPTABLESđó. Có đủ chỉ để sử dụng iptablesở mọi nơi? Nếu không, tôi cho rằng bạn cần phải gán một cái gì đó như IPTABLES=/sbin/iptablesphải không?
UpTheCux

1
Tôi sẽ không chặn portscans theo cách đó. Thay vào đó có một cái gì đó sẽ chấp nhận các kết nối tcp / udp và tìm kiếm nhiều gói liên quan. tcp rất dễ dàng, chỉ cần tìm các thiết lập cho các cổng đó. Bất cứ điều gì khác, những người khác có thể kiểm tra điều này với các gói giả mạo và chặn bất cứ thứ gì bạn không đưa vào danh sách trắng, chẳng hạn như cổng của bạn.
Aaron

25

Tối ưu hóa hiệu suất của bộ lọc mạng bằng cách sử dụng ipset

Nếu bạn viết nhiều quy tắc tương tự dựa trên chỉ IP, cổng hoặc cả hai, hãy cân nhắc sử dụng ipsetđể tối ưu hóa hiệu suất của bộ lọc mạng.

Ví dụ:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

Điều này có nghĩa là một gói có địa chỉ nguồn 192.168.251.177 trước tiên phải vượt qua hàng trăm quy tắc trước khi có thể nhận được phán quyết của ACCEPT.

Tất nhiên, các sysadmin có kinh nghiệm sẽ phân chia các quy tắc bằng mạng con. Nhưng điều đó vẫn có nghĩa là hàng trăm quy tắc.

ipset để giải cứu!

Đầu tiên, xác định một bộ IP ipmaploại:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

Sau đó, điền địa chỉ:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

Cuối cùng, thay thế hàng trăm quy tắc iptables ở trên bằng một quy tắc:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

Khi một gói đến, netfilter sẽ thực hiện tìm kiếm bitmap rất nhanh cho IP nguồn (src) của gói dựa trên Allowed_HostsIP Set. Tất cả các gói đến từ 192.168.0.0/16 sẽ trải nghiệm một quy tắc. Và hãy tin tôi rằng việc tìm kiếm một bitmap nhanh hơn ít nhất hai bậc so với việc thực hiện kiểm tra hàng trăm quy tắc iptables.

ipsetkhông giới hạn địa chỉ IP. Nó cũng có thể phù hợp dựa trên các cổng, bộ dữ liệu cổng IP, địa chỉ mạng / mạng con, bộ dữ liệu IP-MAC, v.v. Và nó có thể phù hợp với các tiêu chí đó là nguồn hoặc đích hoặc kết hợp cả hai (trong trường hợp bộ dữ liệu).

Và cuối cùng, với ipsetbạn có thể tự động đặt địa chỉ IP vào danh sách đen / danh sách trắng. Các danh sách đen / danh sách trắng này cũng có thể 'tuổi', do đó sẽ tự động xóa địa chỉ IP sau khi một khoảng thời gian có thể định cấu hình đã trôi qua.

Vui lòng tham khảo ipsettrang người đàn ông để biết thêm chi tiết.

LƯU Ý RẤT QUAN TRỌNG:

Một số bản phân phối Linux có thể không có hỗ trợ 'ngoài luồng' cho ipset(ví dụ Ubuntu 10.04 có vấn đề này). Trên các hệ thống này, một phương pháp là cài đặt ipsettừ mã nguồn.

Thay vào đó, hãy tải xuống ipsetnguồn từ trang web của nó: http://ipset.netfilter.org/install.html

Ngoài ra, nếu bạn sử dụng xtables-addons, ipset được bao gồm trong nguồn của nó: http://xtables-addons.sourceforge.net/


3
Thật đáng tiếc, nó không được hỗ trợ theo mặc định trên Debian và Ubuntu. Tôi nghĩ rằng bạn sẽ liệt kê một số distro ám ảnh: /
UpTheCalet

@UpTheCalet Tôi đã chỉnh sửa câu trả lời của mình ... 'lưu ý đặc biệt' được áp dụng trong thời gian đăng câu trả lời, nhưng hiện không còn áp dụng được nữa.
pepoluan

21

Thêm ý kiến ​​cho các quy tắc của bạn:

-m comment --comment "Comments help to read output of iptables -nvL"

16

Chặn các cuộc tấn công TCP được biết đến

Thêm các quy tắc sau, tốt nhất là trong -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

Các cuộc tấn công bị chặn lần lượt là:

  • Cuộc tấn công SYN-FIN
  • Tấn công SYN-RST
  • Tấn công X-Mas
  • quét bản đồ FIN
  • Tấn công NULLflags
  • Tấn công ALLflags

(vui lòng chỉnh sửa tên của các cuộc tấn công ở trên)


4
Cái -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROPcó thể được gỡ bỏ, vì -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROPnó sẽ bắt mọi gói mà nó có thể chặn.

4
Theo security.stackexchange.com/questions/4603/ . "Không cần phải bỏ các gói không hợp lệ hoặc không đúng định dạng, tất cả các cuộc tấn công này đã có tuổi đời. Các nhà phát triển nhân Linux đã cập nhật hơn nhiều so với bạn về loại gói nào là hợp lệ và không phải là gì." , một số người có thể tranh luận. Chà, làm thế nào để bạn biết lỗ hổng trong tương lai sẽ nằm trong trình xử lý TCP chứ không phải trong trình phân tích cú pháp TCP iptables? "
Matt

1
@VlastimilBurian về mặt lý thuyết chúng không còn cần thiết nữa. Nhưng việc thêm các quy tắc này không làm chậm mạng cũng như không tăng tải CPU, vì vậy tôi thấy không có lý do gì để không thêm chúng và quên chúng
pepoluan

7

Kích hoạt NAT

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Bước 1 đặt tham số kernel để cho phép chuyển tiếp ip, bước 2 thiết lập quy tắc iptables cho phép NAT trên giao diện eth0.


4
Điều đó sẽ không được kiên trì thông qua khởi động lại, phải không? Bạn cần chỉnh sửa /etc/sysctl.conf net.ipv4.ip_forward = 1. (Giả sử Red Hat hoặc phái sinh.)
Aaron Copley

6

Chặn các cuộc tấn công ICMP

Thêm các quy tắc sau, tốt nhất là trong -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

Quy tắc đầu tiên chặn tất cả các gói ICMP có "cờ phân mảnh" không bằng 0. (ICMP không bao giờ bị phân mảnh; chúng phải mang tải trọng nhỏ)

Quy tắc thứ hai chặn các gói ICMP không quá khổ.


Điều đó có phá vỡ MTU Discovery không?
Matt

@Matt không, vì khám phá Đường dẫn MTU chỉ sử dụng các gói lớn bằng kích thước tải trọng Ethernet, tức là 1500 byte, trong đó 8 byte được sử dụng bởi tiêu đề IP và tiêu đề ICMP.
pepoluan

Cảm ơn đã làm rõ, nhưng 1492-64k? Tại sao không phải 1500-65k. Tôi có thể hiểu 1492 cho PPPoE nhưng ethernet thẳng.
Matt

Điều này vẫn còn áp dụng?
LinuxSecurityFreak

@VlastimilBurian Tôi muốn nói có. Vẫn không cần các gói ICMP quá khổ.
pepoluan

4

sử dụng FireHOL - iptables thuận tiện bao bọc

Tôi thấy nó trực quan hơn nhiều so với các lệnh iptables trực tiếp. Đặc biệt đối với những người có kinh nghiệm trong quá khứ với các tường lửa khác:

FireHOL là một trình tạo tường lửa iptables tạo ra tường lửa lọc gói iptables trạng thái, trên các máy chủ và bộ định tuyến Linux với bất kỳ số giao diện mạng, bất kỳ số tuyến, bất kỳ số dịch vụ nào được cung cấp, bất kỳ số lượng phức tạp nào giữa các biến thể của dịch vụ (bao gồm cả tích cực và tiêu cực biểu thức).


2
Tôi thích Shorewall được phát triển tích cực, hỗ trợ IPv4 và IPv6 và có thể tạo tường lửa cho các hệ thống iptables khác.
BillThor

4

(từ tệp iptables_tricks.txt của tôi, được biên dịch lại từ rất nhiều nơi: P)

Làm cho iptables đợi 15 giây giữa các kết nối mới từ cùng một IP trên cổng 22 (SSH):

 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

1
Tương tự, nhưng với số lần thử:-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
alexm


3

Xem lại bộ IP

Đã có một câu trả lời đề cập đến bộ IP. Tuy nhiên, nó tập trung vào một chiều ở chỗ nó tập trung vào hiệu suất đạt được so với các quy tắc cổ điển và thực tế là các bộ IP giảm thiểu vấn đề mà người ta gặp phải với rất nhiều địa chỉ IP riêng lẻ không thể được biểu thị như một mạng con trong ký hiệu CIDR.

Ký hiệu được sử dụng dưới đây

ipsettôi sẽ sử dụng ký hiệu được đọc ipset restorevà viết bởi ipset save.

Tương ứng với các quy tắc iptables(và ip6tables) tôi sẽ sử dụng ký hiệu như đã đọc iptables-restorevà viết bởi iptables-save. Điều này tạo ra một ký hiệu ngắn hơn và nó cho phép tôi làm nổi bật các quy tắc tiềm năng chỉ có IPv4 (tiền tố -4) hoặc chỉ IPv6 (tiền tố -6).

Trong một số ví dụ, chúng tôi sẽ chuyển luồng gói vào một chuỗi khác. Chuỗi được giả sử tồn tại tại thời điểm đó, do đó, các dòng để tạo chuỗi không được tạo ra (tên bảng cũng được đề cập hoặc các lệnh được COMMITđặt ở cuối).

Bộ IP nâng cao

Các bộ IP có thể làm được nhiều hơn những gì được đề cập trong câu trả lời khác và bạn chắc chắn nên đọc tài liệu về bộ IP ( ipset(8)) cùng với iptables-extensions(8)mục nhập ngắn gọn này ở đây.

Ví dụ tôi sẽ chủ yếu tập trung vào ba loại thiết lập: hash:ip, hash:netlist:set, nhưng có nhiều hơn những người và tất cả họ đều có trường hợp sử dụng hợp lệ.

Ví dụ, bạn cũng có thể khớp số cổng, không chỉ địa chỉ IP .

Lưu và khôi phục các bộ IP như với iptables-saveiptables-restore

Bạn có thể tạo các khai báo tập hợp IP hàng loạt và nhập chúng bằng cách đưa chúng vào ipset restore. Nếu bạn muốn làm cho lệnh của mình trở nên linh hoạt hơn đối với các mục đã có, hãy sử dụng ipset -exist restore.

Nếu quy tắc của bạn nằm trong một tệp có tên default.setbạn sẽ sử dụng:

ipset -exist restore < default.set

Một tệp như thế có thể chứa các mục nhập để createthiết lập và addcác mục nhập vào chúng. Nhưng nhìn chung hầu hết các lệnh từ dòng lệnh dường như có một phiên bản tương ứng trong các tệp. Ví dụ (tạo một bộ máy chủ DNS):

create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844

Ở đây, một bộ được tạo cho IPv4 ( dns4) và một cho IPv6 ( dns6).

Hết giờ trên bộ IP

Thời gian chờ trong bộ IP có thể được đặt làm mặc định cho mỗi bộ và cũng cho mỗi mục nhập. Điều này rất hữu ích cho các tình huống mà bạn muốn chặn một người tạm thời (ví dụ như quét cổng hoặc cố gắng vũ phu máy chủ SSH của bạn).

Cách thức hoạt động như sau (mặc định trong quá trình tạo bộ IP):

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800

Chúng tôi sẽ quay trở lại các bộ cụ thể dưới đây và lý do tại sao chúng được đặt theo cách chúng.

Nếu bạn muốn đặt thời gian chờ của mình cho một địa chỉ IP cụ thể, bạn có thể chỉ cần nói:

add ssh_dynblock4 1.2.3.4 timeout 7200

Để chặn IP 1.2.3.4 trong hai giờ thay vì nửa giờ mặc định (đã đặt).

Nếu bạn đã xem xét điều đó ipset save ssh_dynblock4sau một thời gian ngắn, bạn sẽ thấy một cái gì đó dọc theo dòng:

create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954

Hết thời gian chờ

  • thời gian chờ là một tính năng trên bất kỳ bộ đã cho. Nếu bộ không được tạo với hỗ trợ hết thời gian, bạn sẽ gặp lỗi (ví dụ Kernel error received: Unknown error -1).
  • thời gian chờ được đưa ra trong vài giây. Ví dụ, sử dụng các biểu thức số học Bash để có được từ vài phút đến vài giây. Ví dụ:sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

Kiểm tra xem một mục có tồn tại trong một bộ IP nhất định không

Bên trong các tập lệnh của bạn, có thể hữu ích để xem liệu một mục đã tồn tại. Điều này có thể đạt được ipset testmà trả về 0 nếu mục nhập tồn tại và khác không. Vì vậy, kiểm tra thông thường có thể được áp dụng trong một tập lệnh:

if ipset test dns4 8.8.8.8; then
  echo "Google DNS is in the set"
fi

Tuy nhiên, trong nhiều trường hợp, bạn sẽ muốn sử dụng công -existtắc ipsetđể chỉ đạo nó không phàn nàn về các mục hiện có.

Đặt các bộ IP từ iptablesquy tắc

Theo tôi, đây là một trong những tính năng giết người của các bộ IP. Bạn không chỉ có thể khớp với các mục của bộ IP, bạn cũng có thể thêm các mục mới vào bộ IP hiện có.

Ví dụ trong câu trả lời cho câu hỏi này, bạn có:

-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

... Với ý định giới hạn tốc độ kết nối với SSH (TCP port 22). Các mô-đun được sử dụng recenttheo dõi các nỗ lực kết nối gần đây. Thay vì statemô-đun, tôi thích conntrackmô-đun, tuy nhiên.

# Say on your input chain of the filter table you have
   -A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
   -A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
#    and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
#    IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT

Trong trường hợp này, tôi đang chuyển hướng dòng chảy sang SSHchuỗi sao cho tôi không phải lặp lại chính mình -p tcp --dport sshcho mỗi quy tắc.

Để nhắc lại:

  • -m setlưu iptablesý rằng chúng tôi đang sử dụng các công tắc từ setmô-đun (xử lý các bộ IP)
  • --match-set ssh_dynblock4 srcnói iptablesđể khớp địa chỉ nguồn ( src) với tập hợp được đặt tên ( ssh_dynblock4)
    • cái này tương ứng với sudo ipset test ssh_dynblock4 $IP(nơi $IPchứa địa chỉ IP nguồn cho gói)
  • -j SET --add-set ssh_dynblock4 src --existthêm hoặc cập nhật địa chỉ nguồn ( src) từ gói vào bộ IP ssh_dynblock4. Nếu một mục tồn tại ( --exist) nó sẽ chỉ được cập nhật.
    • cái này tương ứng với sudo ipset -exist add ssh_dynblock4 $IP(nơi $IPchứa địa chỉ IP nguồn cho gói)

Thay vào đó, nếu bạn muốn khớp địa chỉ đích / đích, bạn sẽ sử dụng dstthay vì src. Tham khảo hướng dẫn để có thêm lựa chọn.

Bộ

Bộ IP có thể chứa các bộ khác. Bây giờ nếu bạn theo dõi bài viết ở đây, bạn sẽ tự hỏi liệu có thể kết hợp các bộ không. Và tất nhiên nó là. Đối với các bộ IP ở trên, chúng ta có thể tạo hai bộ chung ssh_dynblockssh_loggedontương ứng để chứa các bộ chỉ có IPv4 và chỉ IPv6:

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800
# Sets of sets
create ssh_loggedon  list:set
create ssh_dynblock  list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6

Và câu hỏi tiếp theo sẽ xuất hiện trong đầu bạn là liệu điều này có cho phép chúng ta khớp và điều khiển các bộ IP theo kiểu không tin tưởng phiên bản IP hay không.

Và câu trả lời cho điều đó là một tiếng vang: CÓ! (than ôi, điều này không được ghi lại rõ ràng lần trước tôi đã kiểm tra)

Do đó, các quy tắc từ phần trước có thể được viết lại để đọc:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

mà ngắn gọn hơn nhiều Và vâng, điều này đã được thử và thử nghiệm và hoạt động như một lá bùa.

Kết hợp tất cả lại với nhau: SSH brute-force defence

Trên các máy chủ của tôi, tôi có một tập lệnh chạy như một croncông việc lấy một loạt các tên máy chủ và phân giải chúng thành các địa chỉ IP, sau đó đưa nó vào tập hợp IP cho "máy chủ tin cậy". Ý tưởng là các máy chủ đáng tin cậy nhận được nhiều nỗ lực hơn để đăng nhập vào máy chủ và không nhất thiết phải bị chặn miễn là bất kỳ ai khác.

Ngược lại, tôi có toàn bộ các quốc gia bị chặn kết nối với máy chủ SSH của mình, ngoại trừ (tiềm năng) các máy chủ đáng tin cậy (nghĩa là thứ tự các quy tắc).

Tuy nhiên, đó là một bài tập cho người đọc. Ở đây tôi muốn thêm một giải pháp gọn gàng sẽ sử dụng các bộ có trong ssh_loggedonbộ để cho phép các lần thử kết nối tiếp theo được truyền qua và không phải chịu sự giám sát tương tự như các gói khác.

Điều quan trọng cần nhớ là thời gian chờ mặc định là 90 phút ssh_loggedonvà 30 phút ssh_dynblockkhi xem các iptablesquy tắc sau :

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

Bây giờ bạn nên tự hỏi làm thế nào địa chỉ IP kết nối kết thúc trong các ssh_loggedontập hợp con. Vì vậy, hãy đọc tiếp ...

Phần thưởng: thêm IP bạn đăng nhập trong khi đăng nhập SSH

Nếu bạn đã thử nghiệm với sshrcvà bạn bè, bạn sẽ biết về những thiếu sót của nó. Nhưng PAM đến giải cứu. Một mô-đun có tên pam_exec.socho phép chúng tôi gọi một tập lệnh trong khi đăng nhập SSH tại một điểm mà chúng tôi biết rằng người dùng được chấp nhận.

/etc/pam.d/sshdbên dưới pam_envpam_selinuxcác mục thêm dòng sau:

session    optional     pam_exec.so stdout /path/to/your/script

và đảm bảo rằng phiên bản tập lệnh của bạn ( /path/to/your/scriptở trên) tồn tại và có thể thực thi được.

PAM sử dụng các biến môi trường để truyền đạt những gì đang diễn ra, vì vậy bạn có thể sử dụng một tập lệnh đơn giản như thế này:

#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
    [[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
    ipset -exist add $SETNAME "$PAM_RHOST"
fi

Thật không may, ipsettiện ích dường như không có các bộ lọc mạng tích hợp sẵn. Vì vậy, chúng ta cần phân biệt giữa IP IPv4 và IPv6 khi thêm mục nhập của chúng tôi. Nếu không, ipsetsẽ giả sử chúng ta muốn thêm một bộ khác vào tập hợp các bộ, thay vì IP. Và tất nhiên, không chắc sẽ có một bộ được đặt tên theo IP :)

Vì vậy, chúng tôi kiểm tra :địa chỉ IP và thêm 6vào tên đã đặt trong trường hợp đó và 4nếu không.

Kết thúc.


2

Một GUI khác có thể được sử dụng để cấu hình iptables là Firewall Builder . Nó cho phép người dùng tạo các thành phần quy tắc dưới dạng các đối tượng trong cơ sở dữ liệu và sau đó kéo và thả các đối tượng này vào trình chỉnh sửa quy tắc để tạo chính sách tường lửa mong muốn. Sau đó, ứng dụng sẽ tạo một tệp script với tất cả các lệnh iptables cần thiết để thực hiện các quy tắc.

Không giống như một số giải pháp GUI iptables khác, tại đó bạn chỉ có thể quản lý một cấu hình iptables tại một thời điểm, với Trình tạo tường lửa, bạn có thể quản lý một số lượng lớn cấu hình iptables từ một ứng dụng. Firewall Builder chạy trên Linux, Windows và Mac OS X, đã tồn tại hơn 10 năm và có hàng ngàn người dùng hoạt động trên toàn thế giới.

Tiết lộ đầy đủ - Tôi là người đồng sáng lập NetCitadel, công ty phát triển Tường lửa Builder.


1

đăng nhập kết nối với uid

iptables -A OUTPUT -m state --state NEW -m tcp -p tcp -m limit --limit 5/m -j LOG --log-uid --log-prefix="outgoing connection: "

chuyển tiếp cổng / kết nối:

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.1.7:80
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -i eth1 -j ACCEPT

1
Tôi thích NFLOGmục tiêu hơn. Nó cho phép tiền tố dòng dài hơn và trình nền chế độ người dùng cũng có thể đăng nhập vào cơ sở dữ liệu.
0xC0000022L

1

Nối một số tên giao diện với ký tự đại diện

Ví dụ: bạn có eth0 eth1 muốn cho phép bất kỳ lưu lượng nào giữa chúng không?

iptables -A FORWARD -i eth+ -o eth+ -j ACCEPT

Tôi đã sử dụng điều này trong quá khứ để phù hợp với các veth<something>giao diện được tạo và đặt tên động bởi LXC. Vì vậy, tôi có thể kết hợp tất cả cùng một lúc với veth+.

Tôi cũng cố tình đặt tên cho một số giao diện _<something>để phù hợp với _+.


1

Chặn các giá trị MSS không phổ biến

iptables -t mangle -A PREROUTING -p tcp \
-m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

Mục tiêu SYNPROXY để bảo vệ DDos

Mục đích của mục tiêu này là kiểm tra xem máy chủ nào đã gửi gói SYN đã thiết lập kết nối hay không làm gì sau khi bắt đầu kết nối SYN. Nếu nó không làm gì, nó sẽ loại bỏ gói với nỗ lực tối thiểu.

Đặt gói đồng bộ vào bảng theo dõi kết nối trong bảng thô

iptables -t raw -A PREROUTING -p tcp -m tcp --dport 80 --syn -j CT --notrack

Kích hoạt synproxy cho máy chủ http:

iptables -A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate INVALID,UNTRACKED \
-j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460

Tài nguyên: Mục tiêu SYNPROXY từ blog của RHEL


1

Giới hạn tất cả các địa chỉ IP riêng lẻ ở hạn mức băng thông đi với Bộ IP

Bạn có thể vui lòng định cấu hình máy chủ của mình để chỉ cho phép mỗi IP 15GiByte sử dụng băng thông mỗi tháng, với hy vọng phản ánh hoặc tránh một cuộc tấn công sử dụng băng thông, có lẽ đối với hạn mức băng thông được đo tại ISP của bạn. Nó có thể được thực hiện như sau:

Đầu tiên tạo các bộ IP cho IPv4 và IPv6:

ipset create IP_QUOTA_SET_OUT hash:ip timeout 345600 counters
ipset create IP_QUOTA_SET_OUT_INET6 hash:ip timeout 345600 counters family inet6

Bây giờ thêm quy tắc iptables của bạn. Dòng đầu tiên sẽ thêm IP vào tập hợp nếu nó chưa có ở đó. Dòng thứ hai sẽ không khớp nếu các byte được truyền cho IP trong tập hợp lớn hơn số lượng được chỉ định. Sau đó, điều tương tự cũng được thực hiện cho IPv6.

iptables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT dst -j SET --add-set IP_QUOTA_SET_OUT dst --timeout 345600
iptables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT dst --bytes-gt 16106127360 -j DROP

ip6tables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT_INET6 src -j SET --add-set IP_QUOTA_SET_OUT_INET6 src --timeout 345600
ip6tables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT_INET6 src --bytes-gt 16106127360 -j DROP

Điều này sẽ ngăn chặn các cuộc tấn công như người dùng yêu cầu một tệp lớn từ máy chủ web của bạn trong một thời gian dài hoặc từ bất kỳ dịch vụ nào cho vấn đề đó. Điều tương tự có thể được thực hiện cho chuỗi INPUT.


0

Một cái gì đó tôi làm, chủ yếu là do tôi không biết gì về một giải pháp thanh lịch hơn, là kiểm tra thủ công nhật ký Nginx của tôi cứ sau 4 giờ và máy chủ thư sẽ ghi lại cứ sau 2 phút để truy cập quá mức bởi từng IP riêng lẻ. Tôi chạy một vài kịch bản cùng nhau rằng:

  1. Kiểm tra access.logvà liệt kê 10 IP hàng đầu được tổ chức theo số lần truy cập mà họ có đối với máy chủ
  2. Kết quả vào một tệp nhật ký
  3. Có một tập lệnh khác xem tệp nhật ký đó và cấm bất kỳ IP nào đã tấn công máy chủ nhiều hơn X số lần trong X giờ qua
  4. Tiết kiệm của tôi iptables.save

Đây là những gì nó trông giống như:

autoBanIPs_mail.sh
#!/bin/bash

# This script checks the last 2 minutes of log entries to see if any 
# IP has made over 99 connections

now=$(date +"%m_%d_%Y")

/root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt
cat /home/ipChecker/ipcheckMAIL_$now.txt | \
    grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \
    awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh
sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh
/bin/bash /home/ipChecker/badMailIPs_$now.sh
cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log
rm /home/ipChecker/ipcheckMAIL_$now.txt
rm /home/ipChecker/badMailIPs_$now.sh
kiểm traBadIPs_mail.sh

Một điều rất quan trọng cần lưu ý ở đây là bạn CẦN thiết lập danh sách trắng hoặc bạn sẽ bắt đầu chặn rất nhiều IP xác thực từ các máy chủ mà bạn vừa nhận được rất nhiều email từ hoặc trong trường hợp các nhật ký khác, IP đó chỉ cần nhấn máy chủ của bạn rất nhiều vì lý do chính đáng. Danh sách trắng của tôi chỉ được tích hợp vào tập lệnh này bằng cách thêm các ống grep ngay sau | grep ']' | trông giống như thế này "grep -v 127.0 |" .
Bạn cần dành thời gian để dạy cho máy chủ của mình những IP có lưu lượng truy cập cao là hợp pháp và không. Đối với tôi điều này có nghĩa là tôi phải dành tuần đầu tiên để kiểm tra nhật ký của mình một cách thủ công cứ sau vài giờ, tìm kiếm ip lưu lượng truy cập cao trên iplocation.net và sau đó thêm những người hợp pháp như amazon, box.com hoặc thậm chí là nhà / văn phòng của tôi IP phạm vi cho danh sách trắng này. Nếu bạn không có khả năng bạn sẽ bị chặn khỏi máy chủ của chính mình hoặc bạn sẽ bắt đầu chặn các máy chủ thư / web hợp pháp và gây gián đoạn trong email hoặc lưu lượng truy cập.

cat /var/log/mail.log | awk \
    -v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \
    awk '{print $1}' | sort | uniq -c | sort -n | tail -10
BlockIP
#!/bin/bash
sudo iptables -I INPUT -s $1 -j DROP
sudo bash -c "iptables-save > /etc/network/iptables.save"

Một lần nữa tôi biết điều này là thô thiển như địa ngục và có lẽ có một giao thức hiệu quả sạch đẹp thực hiện tất cả những điều này nhưng tôi không biết về nó và điều này đã diễn ra được một hoặc hai năm nay và giữ kẻ xấu ở lại. Một điều tôi rất muốn NGHIÊM TÚC là bạn có proxy hoặc máy chủ khác trong cánh mà bạn có thể sử dụng để truy cập máy chủ chính của mình .. Lý do là nếu bạn đang phát triển web một ngày nào đó và bạn ping bản thân 2000 lần trong 5 giờ đối với một số thử nghiệm mà bạn có thể bị chặn mà không có cách nào quay lại ngoại trừ proxy.

Bạn có thể thấy rằng trong checkBadIPs.shtôi đã đặt grep -v 127.0 và trong các tệp thực tế của mình, tôi có rất nhiều quy tắc bỏ qua cho IP của riêng tôi và các dải IP đáng tin cậy khác nhưng đôi khi IP của bạn thay đổi, bạn quên cập nhật và sau đó bạn bị khóa ra khỏi máy chủ của riêng bạn.

Dù sao, hy vọng rằng sẽ giúp.

CẬP NHẬT

Tôi đã thay đổi mọi thứ một chút để bây giờ thay vì kiểm tra vài giờ tôi có một số nhật ký được kiểm tra cứ sau 2 phút, chủ yếu là nhật ký ssh auth của tôi và nhật ký thư khi chúng bị đập :(.

Tôi thiết lập các tập lệnh cụ thể cho từng tệp nhật ký mặc dù nó có thể dễ dàng từ tập lệnh thủ công mà tôi sử dụng khi muốn kiểm tra nhật ký. Trông như thế này:

#!/bin/bash

log=$1 time=$2

cat /var/log/${log} | awk \
    -v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
    sort | uniq -c | sort -n | tail -10

Điều này yêu cầu 2 đầu vào khi chạy, tệp nhật ký bạn muốn quét và khoảng thời gian quay lại quá khứ bạn muốn quét.

Vì vậy, nếu tôi muốn kiểm tra mail.log về số lượng ip, hãy nói 75 phút trước tôi sẽ chạy:

$ sudo script.sh mail.log 75

Một chút googling đã tìm thấy tôi điều này, dường như làm những gì tôi đã mô tả ở trên: cyberciti.biz/faq/iptables-connection-limits-howto
bắt gặp

1
Đẹp! Tôi sẽ sử dụng ipsetthay vì kéo dài chuỗi iptables, nhưng ý tưởng này rất hay và tôi nghĩ tôi sẽ áp dụng chúng cho các máy chủ sản xuất của mình. Cám ơn vì đã chia sẻ!
pepoluan

2
Tôi mới đọc về ipset lần đầu tiên vào một ngày khác và rất vui mừng khi biết về những gì nó làm .. Tôi hơi sợ khi thực hiện nó chỉ vì có lẽ tôi sẽ làm hỏng nó ngay từ đầu và tắt máy chủ nhưng nó nằm trong danh sách những điều cần học ở đây. Điều đó được nói rằng chuỗi iptable của tôi có lẽ là khoảng 30-40 mặt hàng và chỉ nhận được 1 cái mới mỗi ngày hoặc hai vì vậy đó không phải là lúc tôi quá lo lắng.
bắt

Bạn đã xem fail2ban chưa?
gà con

0

Tôi đồng ý với các ý kiến ​​về ipsets và cờ tcp, nhưng vẫn còn thiếu rất nhiều:

Sử dụng kết hợp xtables-addons Geoip thay vì ipsets cho danh sách quốc gia. Cập nhật dữ liệu Geoip thường xuyên (ít nhất một lần mỗi tháng). Dữ liệu năng động hơn trong danh sách ipset lửa và quên.

Xem xét theo dõi trạng thái kết nối với cờ tcp. Ví dụ, RST tcp hoặc ACK chỉ có ý nghĩa đối với một kết nối được thiết lập. SYN chỉ có ý nghĩa đối với các kết nối mới và liên quan. Một SYN cho một kết nối được thiết lập có nghĩa là SYN + ACK của bạn bị mất hoặc một nỗ lực hack và nên được đặt lại vì cả hai bên của kết nối không đồng ý với trạng thái.

Mặc dù không có gì, SYN + RST và FIN + RST là các kết hợp bất hợp pháp, hiện tại, SYN + FIN có hiệu lực trong TCP mở nhanh (tùy chọn TCP 34), đặc biệt đối với DNS. Các gói SYN, ngay cả khi mở nhanh, không nên bị phân mảnh. Tôi không coi các quy tắc với cờ PSH và URG là hữu ích. Không nhầm lẫn trạng thái theo dõi kết nối với trạng thái TCP: Phản hồi RST cho gói SYN được thiết lập cho mục đích theo dõi.

SYNPROXY dành cho các gói chuyển tiếp và không thêm gì cho các gói được phân phối cục bộ ngoài hỗ trợ syncookie.

Các gói lỗi ICMP sẽ luôn ở trạng thái liên quan và có độ dài 48: 576 nếu chúng hợp lệ. Độ dài 84: 1280 cho IPv6. Tất cả những người khác nên được bỏ qua. Vì kích thước tối đa của chúng cũng là MTU tối thiểu, chúng không bao giờ bị phân mảnh. Các yêu cầu ICMP (ping, dấu thời gian, v.v.) sẽ luôn mới và trả lời được thiết lập. Thả các gói ICMP ở các trạng thái khác.

Giống như ví dụ SSH với một danh sách gần đây và chỉ chấp nhận các gói SYN tiếp theo, điều tương tự cũng nên được thực hiện đối với SMTP và tương tự như chỉ ghi lại dữ liệu địa chỉ IP trên dữ liệu địa chỉ IP.

Trong bảng bộ lọc, quy tắc đầu tiên (hoặc thứ hai, nếu chấp nhận các gói trạng thái được thiết lập trước) trong chuỗi đầu vào và đầu ra sẽ chấp nhận mọi thứ trên giao diện loopback. Bạn nên tin tưởng các gói nội bộ của riêng bạn. Nếu bạn không thể, bạn có vấn đề lớn hơn ngoài giải pháp tường lửa.

Cuối cùng, đừng sao chép một cách mù quáng các quy tắc trừ khi bạn thực sự hiểu những gì họ làm. Vì vậy, nhiều danh sách quy tắc tương tự làm điều đó, và hầu hết thời gian, kết quả là buồn cười.


-2
#!/bin/bash
# The following iptables/ip6tables configurations have
# been kindly shared with us from ArckWiki. There are
# a few additions apart from what has been defined.
#
#=================Flush current definitions==============
    iptables -F
    ip6tables -F
    iptables -X
    ip6tables -X

#
#=================Chains=================================
#
#----Define chains for opened ports
    iptables -N TCP
    ip6tables -N TCP
    iptables -N UDP
    ip6tables -N UDP

#
#----Setting up the filter table for NAT
#   iptables -N fw-interfaces
#   ip6tables -N fw-interfaces
#   iptables -N fw-open
#   ip6tables -N fw-open

#
#================Default Chain reactions=================
#
#----Default FORWARD reaction
    iptables -P FORWARD DROP
    ip6tables -P FORWARD DROP

#
#----Default OUTPUT reaction
    iptables -P OUTPUT ACCEPT
    ip6tables -P OUTPUT ACCEPT

#
#----Shellshock
    iptables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP
    ip6tables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP

#
#----Default INPUT reaction
    iptables -P INPUT DROP
    ip6tables -P INPUT DROP
#
#----Drop spoofing packets
    iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan1 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -s 10.0.0.0/8 -j DROP
    iptables -A INPUT -s 169.254.0.0/16 -j DROP
    iptables -A INPUT -s 172.16.0.0/12 -j DROP
    iptables -A INPUT -s 224.0.0.0/4 -j DROP
    iptables -A INPUT -d 224.0.0.0/4 -j DROP
    iptables -A INPUT -s 240.0.0.0/5 -j DROP
    iptables -A INPUT -d 240.0.0.0/5 -j DROP
    iptables -A INPUT -s 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 239.255.255.0/24 -j DROP
    iptables -A INPUT -d 255.255.255.255 -j DROP

#
#================Ping rate limiting globally=============
    iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/min --limit-burst 8 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 --match limit --limit-burst 8 -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type 8 -j DROP
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 -j DROP

#
#----flooding RST packets, smurf attack Rejection
    iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Bogus packet DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

#
#================RELATED,ESTABLISHED reaction============
    iptables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#
#================unfetered loopback======================
    iptables -A INPUT -i lo -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

#
#================INVALID catagory of packets=============
    iptables -A INPUT -p 41 -j ACCEPT
    iptables -A INPUT --match conntrack --ctstate INVALID -j DROP
    ip6tables -A INPUT --match conntrack --ctstate INVALID -j DROP

#
#================IPv6 reactions and definitions==========
    ip6tables -A INPUT -s fe80::/10 -p icmpv6 -j ACCEPT
    ip6tables -t raw -A PREROUTING -p icmpv6 -s fe80::/10 -j ACCEPT
    ip6tables -t raw -A PREROUTING --match rpfilter -j ACCEPT
    ip6tables -t raw -A PREROUTING -j DROP
#
#=======Acceptable INVALIDs and a curteous response======
    iptables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    ip6tables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    iptables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP
    ip6tables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP

#
#================Defining the TCP and UDP chains
#
#########################################################
#            Notes for port open definitions            #
# It is important to note that this should be config-   #
# ured differently if you're providing any routing      #
# activity for any purpose. it is up to you to actively #
# define what suites your needs to get the job done.    #
# In this example, I'm exempting IPv6 from being able   #
# to interact with SSH protocols for two reasons. The   #
# first is because it is generally easier and more com- #
# for internal networks to be deployed with IPv4. The   #
# second reason is, IPv6 can be deployed globally.      #
#########################################################
#
#----SSH configured for eth0
    iptables -A TCP -i eth0 -p tcp --dport ssh -j ACCEPT

#!---Blocking SSH interactions in IPv6
    ip6tables -A TCP -p tcp --dport ssh -j DROP

#!---Leave commented for end service device
#   iptables -A TCP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 80 -j ACCEPT
#   iptables -A TCP -p tcp --dport 443 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 443 -j ACCEPT
#
#!---Uncomment for remote service to this device
#   iptables -A TCP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 22 -j ACCEPT
#
#!---Uncomment if you're providing routing services
#   iptables -A UDP -p udp 53 -j ACCEPT
#   ip6tables -A UDP -p udp 53 -j ACCEPT
#
#=================Tricking port scanners=================
#
#----SYN scans
    iptables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    ip6tables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    iptables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP
    ip6tables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP

#
#----UDP scans
    iptables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    ip6tables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    iptables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP
    ip6tables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP

#
#----For SMURF attack protection
    iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
    iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
    iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Ending all other undefined connections
    iptables -A INPUT -j DROP
    ip6tables -A INPUT -j DROP

#
#=======Defining the IN_SSH chain for bruteforce of SSH==
#
#!---I've elected to keep IPv6 out of this realm for
#!---ease of use
    iptables -N IN_SSH
    iptables -A INPUT -p tcp --dport ssh --match conntrack --ctstate NEW -j IN_SSH
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --set -j ACCEPT
    iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH

#
#==================Setting up a NAT gateway==============
#
#########################################################
#                                                       #
# I commented this half out because it's not something  #
# that will apply to all setups. Make note of all par-  #
# tinate interfaces and what exactly is going on.       #
#                                                       #
#########################################################
#
#----Setting up the FORWARD chain
#   iptables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#   ip6tables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#
#
#----Defining the fw-interfaces/open chains for FORWARD
#   iptables -A FORWARD -j fw-interfaces
#   ip6tables -A FORWARD -j fw-interfaces
#   iptables -A FORWARD -j fw-open
#   ip6tables -A FORWARD -j fw-open
#   iptables -A FORWARD -j DROP # Should be REJECT. But, fuck them
#   ip6tables -A FORWARD -j DROP
#   iptables -P FORWARD DROP
#   ip6tables -P FORWARD DROP
#
#
#----Setting up the nat table
#   iptables -A fw-interfaces -i ### -j ACCEPT
#   ip6tables -A fw-interfaces -i ### -j ACCEPT
#   iptables -t nat -A POSTROUTING -s w.x.y.z/S -o ppp0 -j MASQUERADE
#   ip6tables -t nat -A POSTROUTING -s fe::/10 -o ppp0 -j MASQUERADE
#----The above lines should be repeated specifically for EACH interface
#
#----Setting up the PREROUTING chain
#
#######################################################
#                             #
# The PREROUTING chain will redirect either port      #
# targets to be redirected. This can also redirect    #
# traffic inbound to your network from the gateway    #
# to this machine. This can be useful if you're using #
# a honeypot or have any service within your network  #
# that you want to be pointed to a specific device.   #
#                             #
#######################################################
#
#----SSH honeypot server
#   iptables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#----With intuition, you can configure the above to also direct specific
#----requests to other devices providing those services. The bellow will
#----be for a squid server
#   iptables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#   ip6tables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#
#===============Declare configurations=================
    iptables -nvL
    ip6tables -nvL

1
Với tất cả những tiếng hét, tôi không thể nắm bắt được thông điệp của bài viết của bạn.
Thợ săn hươu
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.