---
# System prepended metadata

title: 'Week1: Iptables Firewall'

---

@iamproz2911
@kidwine29 
Week1 Intern LG Security WebOS of LG Device.  
# Week1: Iptables Firewall 
## Flash WebOS
Link tải: [WebOS](https://www.webosose.org/docs/guides/setup/building-webos-ose/)
Cấu hình yêu cầu: [Requirements](https://www.webosose.org/docs/guides/setup/system-requirements/) 
Link hướng dẫn: [Flash](https://www.webosose.org/docs/guides/setup/flashing-webos-ose/)
## Iptables Firewall for DDoS,PortScanning
### Lý thuyết 
- IPtables là ứng dụng tường lửa miễn phí trong Linux, cho phép thiết lập các quy tắc riêng để kiểm soát truy cập, tăng tính bảo mật.
- IPtables là một ứng dụng tường lửa có sẵn trên Linux, IPtables Linux firewall cho phép người dùng thiết lập các quyền truy cập để kiểm soát lưu lượng một cách chọn lọc trên máy chủ.

**Chains**
Chains được tạo ra với một số lượng nhất định ứng với mỗi Table, giúp lọc gói tin tại các điểm khác nhau.
+ Chain PREROUTING tồn tại trong Nat Table, Mangle Table và Raw Table, các rules trong chain sẽ được thực thi ngay khi gói tin vào đến giao diện mạng (Network Interface).
+ Chain INPUT chỉ có ở Mangle Table và Nat Table với các rules được thực thi ngay trước khi gói tin gặp tiến trình.
+ Chain OUTPUT tồn tại ở Raw Table, Mangle Table và Filter Table, có các rules được thực thi sau khi gói tin được tiến trình tạo ra.
+ Chain FORWARD tồn tại ở Manle Table và Filter Table, có các rules được thực thi cho các gói tin được định tuyến qua host hiện tại.
+ Chain POSTROUTING chỉ tồn tại ở Manle Table và Nat Table với các rules được thực thi khi gói tin rời giao diện mạng.
Luồng xử lý gói tin cơ bản trong iptables:
PREROUTING:
Xử lý tất cả gói tin vừa đến (trước khi quyết định chúng sẽ đi đâu).
→ Tại đây, bạn có thể kiểm tra và loại bỏ gói tin INVALID.

**Tóm tắt**
PREROUTING:
Xử lý tất cả gói tin vừa đến (trước khi quyết định chúng sẽ đi đâu).
→ Tại đây, bạn có thể kiểm tra và loại bỏ gói tin INVALID.

ROUTING DECISION:

Nếu gói tin dành cho máy cục bộ → đi vào chuỗi INPUT.
Nếu gói tin cần chuyển tiếp (forward) → đi vào chuỗi FORWARD.
INPUT:
Xử lý gói tin dành cho máy cục bộ (nếu không bị chặn ở PREROUTING).

FORWARD:
Xử lý gói tin cần được chuyển tiếp đến máy khác.

OUTPUT:
Xử lý gói tin đi từ máy cục bộ ra ngoài.

POSTROUTING:
Xử lý gói tin trước khi ra khỏi giao diện mạng (interface).


**Target**

Target có thể được hiểu là hành động dành cho các gói tin khi gói tin thỏa mãn các rules đặt ra.

    ACCEPT: chấp nhận và cho phép gói tin đi vào hệ thống.
    DROP: loại gói tin, không có gói tin trả lời.
    REJECT: loại gói tin những có trả lời table gói tin khác. Ví dụ: trả lời table 1 gói tin “connection reset” đối với gói TCP hoặc “destination host unreachable” đối với gói UDP và ICMP.
    LOG: chấp nhận gói tin nhưng có ghi lại log.
    
![image](https://hackmd.io/_uploads/S1oXVwm71g.png)

**Rules**

```
IPtables -A INPUT -i lo -j ACCEPT
```

Lệnh này có nghĩa là:

    A INPUT: khai báo kiểu kết nối sẽ được áp dụng (A nghĩa là Append).
    i lo: Khai báo thiết bị mạng được áp dụng (i nghĩa là Interface).
    j ACCEPT: khai báo hành động sẽ được áp dụng cho quy tắc này (j nghĩa là Jump).

Gõ lại lệnh IPtables -L -v -n kiểm tra trạng thái Rules.

### Tạo Rules cho PortScanning,DoS/DDoS
#### Rules Chung
Rules Mở cổng 22 để SSH 
`iptables -A INPUT -p tcp --dport 22 -j ACCEPT`
Rules chấp nhận các kết nối trước đó hoặc xác thực
`iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT`
Có thể chặn các ip lạ đầu vào nếu chưa tạo các rules cụ thể khác.
```
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
```
ACCEPT INPUT for receive request 
Block Forward for checking 
ACCEPT -> OUTPUT 
#### Rules For PortScanning
PortScanning chủ yếu đến từ Nmap,TCP Dump các kĩ thuật quét cổng TCP, Null, XMAS và các cờ như SYN FIN URG... 

#### Rules For DoS/DDoS
Có 4 kiểu tấn công DDoS dùng qua Hping3 Flood: 
```
SYN flood attack: hping3 -S -p 80 169.254.160.86 --flood
Random Source Attack: hping3 -S -p 80 169.254.160.86 --flood --rand-source
Smurf Attack: hping3 --icmp --flood --spoof 169.254.153.216 169.254.160.86
LAND Attack: hping3 -S -p 80 169.254.160.86 -a 169.254.160.86
```
Với mỗi kiểu tấn công sẽ là cách xây dựng Rules khác nhau.
##### **SYN flood attack**
SYN Flood là một dạng của tấn công DoS (Denial of Service), trong đó kẻ tấn công lợi dụng quy trình bắt tay 3 bước (3-way handshake) của giao thức TCP để làm nghẽn hệ thống mạng, gây quá tải tài nguyên của máy chủ hoặc thiết bị mạng.
**Lenh tan cong** 
```
sudo hping3 -S -p 80 169.254.160.86 --flood
```
**Rules Iptables**
Giới hạn số lượng kết nối SYN chưa hoàn thành mà máy chủ có thể chấp nhận.
`iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT`SYN flood attack: hping3 -S -p 80 169.254.160.86 --flood
--syn: Chỉ áp dụng cho các gSYN flood attack: hping3 -S -p 80 169.254.160.86 --floodói SYN.
--limit 1/s: Giới hạn chỉ cho phép 1 gói SYN mỗi giây.
--limit-burst 3: Cho phép tối đa 3 gói SYN trong vòng 3 giây đầu tiên, sau đó sẽ bị giới hạn lại.

Sau do block luon neu vuot qua limit
```
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN -j DROP
```
--tcp-flags SYN,ACK SYN: Kiểm tra các gói TCP với cờ SYN đã bật và không có cờ ACK. Điều này có nghĩa là chỉ những gói SYN chưa hoàn tất một quá trình kết nối (tức là không có phản hồi ACK) sẽ bị chặn. Đây là một phương pháp để chặn các gói SYN từ các cuộc tấn công SYN Flood mà không có phản hồi ACK.
-j DROP: Các gói tin đáp ứng điều kiện trên sẽ bị loại bỏ (DROP), tức là chúng sẽ không được xử lý thêm.
**Demo**

##### **Smurf Attack**
Smurf Attack là một dạng tấn công DoS (Denial of Service), trong đó kẻ tấn công lợi dụng tính năng ICMP (Internet Control Message Protocol) và khai thác các thiết bị mạng có thể phản hồi tới một địa chỉ IP giả mạo. 
Mục tiêu của tấn công Smurf là làm quá tải máy chủ hoặc mạng mục tiêu bằng cách gửi một lượng lớn yêu cầu ICMP Echo (ping) tới mạng mà không cần phải gửi bất kỳ yêu cầu nào đến máy chủ mục tiêu trực tiếp.
**Lenh tan cong** 

```
Smurf Attack: hping3 --icmp --flood --spoof 169.254.153.216 169.254.160.86
```
**Rules Iptables**
Giới hạn số lượng ping vào máy chủ có thể giúp giảm thiểu tấn công Smurf hoặc DoS dựa trên ICMP:
```
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT

```
-A INPUT: Thêm quy tắc vào chuỗi INPUT, áp dụng cho các gói tin vào.
-p icmp: Chỉ áp dụng cho giao thức ICMP (ping).
--icmp-type 8: Đây là cờ để chọn loại ICMP là "Echo Request" (loại gói tin ICMP được sử dụng khi thực hiện ping).
-m limit --limit 1/sec: Giới hạn tần suất của các gói ICMP Echo Request đến 1 gói mỗi giây.
-j ACCEPT: Nếu gói tin ICMP thỏa mãn các điều kiện trên (gói Echo Request, với tần suất <= 1 gói mỗi giây), nó sẽ được chấp nhận.

Quy tắc 2 có thể hữu ích để chặn các gói ICMP không hợp lệ hoặc các gói ICMP gửi quá nhanh (vượt quá tần suất đã giới hạn):
```
-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable

```
=> Tom lai la van ping cac goi icmp nho le duoc va block cac icmp flood
![image](https://hackmd.io/_uploads/S1E_4LEmkg.png)
![image](https://hackmd.io/_uploads/SkrtVLEQJe.png)
**Demo**


##### **LAND Attack**
LAND Attack là một dạng tấn công DoS (Denial of Service) trong đó kẻ tấn công giả mạo địa chỉ nguồn và đích trong một gói tin TCP.
Tấn công này lợi dụng cách mà các hệ thống mạng xử lý các kết nối TCP.
**Lenh tan cong** 
```
hping3 -S -p 80 169.254.160.86 -a 169.254.160.86
```
**Rules Iptables**
Sử dụng mô-đun recent để theo dõi các hành vi đáng ngờ: 
```
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN -m recent --name land_attack --set

```
-A INPUT: Thêm quy tắc vào chuỗi INPUT, áp dụng cho các gói tin đến máy chủ.
-p tcp: Áp dụng cho giao thức TCP.
--tcp-flags SYN,ACK SYN: Chỉ chọn các gói tin TCP có cờ SYN được bật.
-m recent --name land_attack --set: Sử dụng mô-đun recent để đánh dấu các gói SYN có cờ SYN nhưng không có cờ ACK. Khi một gói tin được phát hiện, mô-đun sẽ ghi nhận các địa chỉ IP có hành vi nghi ngờ vào danh sách "land_attack".

Nếu địa chỉ IP bị nghi ngờ thực hiện hành vi tấn công, gói tin sẽ bị loại bỏ:
```
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN -m recent --name land_attack --rcheck --seconds 10 --hitcount 1 -j DROP

```
-m recent --rcheck: Kiểm tra xem địa chỉ IP có trong danh sách các địa chỉ bị nghi ngờ không.
--seconds 10: Các địa chỉ IP trong danh sách land_attack bị kiểm tra trong khoảng thời gian 10 giây.
--hitcount 1: Nếu một địa chỉ IP gửi một gói tin SYN trong khoảng thời gian này, nó sẽ bị xem như có hành vi tấn công.
-j DROP: Nếu địa chỉ IP bị nghi ngờ thực hiện hành vi tấn công, gói tin sẽ bị loại bỏ.
**Demo**

##### **Random Source Attack**
Random Source Attack (Tấn công nguồn ngẫu nhiên) là một loại tấn công trong đó kẻ tấn công gửi các gói tin đến mục tiêu với địa chỉ nguồn ngẫu nhiên.
**Lenh tan cong** 
`hping3 -S -p 80 169.254.160.86 --flood --rand-source`
**Rules Iptables**
Su dung Module32 cua Iptables 
Kiem tra output capture cua Tshark 
![image](https://hackmd.io/_uploads/ry3rm8EmJx.png)
Kiểm tra cờ SYN: Các gói tin có cờ SYN được bật trong TCP.
Kiểm tra Payload: Các gói có payload (dữ liệu) trong phần body của gói tin.
=> Viet rules dua vao module 32 cua iptables 
Kiểm tra gói tin TCP:

    Giá trị Protocol trong header IP sẽ là 6 (cho TCP).
    Biểu thức trong iptables: 6&0xFF=6
Kiểm tra cờ SYN:

    Cờ SYN nằm ở bit thứ 2 trong byte thứ 13 của header TCP.
    Biểu thức trong iptables: 0>>22&0x3C@10>>1&0x1=0x1 (để xác định cờ SYN được bật)
    
Kiểm tra Payload:

    Để kiểm tra payload, cần "nhảy" qua IP Header và TCP Header và kiểm tra dữ liệu trong phần body.
    Biểu thức trong iptables: 0>>22&0x3C@12>>26&0x3C@0>>24=0:255 (để kiểm tra có dữ liệu trong payload)
    
=> Rules cuoi cung la
```
iptables -I INPUT -m u32 --u32 "6&0xFF=6 && 0>>22&0x3C@10>>1&0x1=0x1 && 0>>22&0x3C@12>>26&0x3C@0>>24=0:255" -j DROP
```
6&0xFF=6: Kiểm tra xem gói tin có phải là TCP không (Protocol TCP có giá trị là 6).
0>>22&0x3C@10>>1&0x1=0x1: Kiểm tra xem cờ SYN có được bật trong gói TCP không.
0>>22&0x3C@12>>26&0x3C@0>>24=0:255: Kiểm tra xem gói tin có payload (dữ liệu) không. Nếu có, điều này chứng tỏ gói SYN có mang theo dữ liệu.

### CaseStudy 
**1: Drop invalid packets**
`/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP  `
PREROUTING là một chuỗi (chain) trong bảng mangle (hoặc các bảng khác như filter, nat) được xử lý trước khi gói tin được định tuyến đến đích của nó. Nói cách khác, các quy tắc trong chuỗi PREROUTING sẽ được áp dụng trước khi quyết định định tuyến gói tin đó tới địa chỉ đích cuối cùng (ví dụ, tới máy chủ, dịch vụ, hoặc ứng dụng cụ thể).
![image](https://hackmd.io/_uploads/Hy5p0wSQJe.png)
![image](https://hackmd.io/_uploads/Sku11uSmyx.png)

**2: Drop TCP packets that are new and are not SYN**
/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP 
![image](https://hackmd.io/_uploads/BysgGOBQJl.png)

**3: Drop SYN packets with suspicious MSS value**
`/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP  `
-m tcpmss ! --mss 536:65535: Lọc các gói TCP có trường MSS không nằm trong phạm vi từ 536 đến 65535. MSS là một tham số trong quá trình thiết lập kết nối TCP, chỉ ra kích thước tối đa của một segment TCP có thể được truyền tải.
![image](https://hackmd.io/_uploads/HJYgHUS7Jl.png)
=> Chặn các gói SYN với giá trị MSS (Maximum Segment Size) ngoài phạm vi 536-65535. 

**4: Block packets with bogus TCP flags**

`/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP `
![image](https://hackmd.io/_uploads/ry4oKUrmkx.png)
![image](https://hackmd.io/_uploads/Hkn2KUBQyx.png)

/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
![image](https://hackmd.io/_uploads/H1JzcIB71l.png)
![image](https://hackmd.io/_uploads/By5fq8rQ1g.png)

/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
![image](https://hackmd.io/_uploads/H17PqIHm1l.png)
![image](https://hackmd.io/_uploads/HyeqcLSXJg.png)


/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
![image](https://hackmd.io/_uploads/Skwyo8r7Jl.png)
![image](https://hackmd.io/_uploads/ByresIrmkg.png)

Capture cac flag rieng le
```
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
=> sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags RST RST -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
```
![image](https://hackmd.io/_uploads/S1o5c2rmkl.png)
![image](https://hackmd.io/_uploads/SJUjcnS7Je.png)

/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP  
![image](https://hackmd.io/_uploads/ByoclPHQ1g.png)
![image](https://hackmd.io/_uploads/r1hagDBmyl.png)

**5: Block spoofed packets**
```
/sbin/iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP  
```

**6: Drop ICMP (you usually don't need this protocol)**
/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP  

![image](https://hackmd.io/_uploads/S1iZ_DB71e.png)
![image](https://hackmd.io/_uploads/By5MdwSQJe.png)

**7: Drop fragments in all chains**
/sbin/iptables -t mangle -A PREROUTING -f -j DROP  


**8: Limit connections per source IP**
/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset  
![image](https://hackmd.io/_uploads/ByeN0H6Bmyl.png)
![image](https://hackmd.io/_uploads/r16ASaH71g.png)

**9: Limit RST packets**
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  

**10: Limit new TCP connections per second per source IP**
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP  

**11: Use SYNPROXY on all ports (disables connection limiting rule)
Hidden - unlock content above in "Mitigating SYN Floods With SYNPROXY" section**
Bonus Rules
Here are some more iptables rules that are useful to increase the overall security of a Linux server:

**SSH brute-force protection**
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set 
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP  

### Netfilter
Nếu iptables hỗ trợ connbytes và limit thì có nghĩa lúc xây dựng hệ điều hành WebOS (build webos image) thì đã kích hoạt các tham số sau của netfilter trong file bridge.cfg
 
//$ cd ~/build-webos/meta-webosose/meta-webos-raspberrypi/recipeskernel/linux/linux-raspberrypi/
//$ nano bridge.cfg
```
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
CONFIG_NETFILTER_XT_MATCH_LENGTH=y
CONFIG_NETFILTER_XT_MATCH_LIMIT=y
CONFIG_NETFILTER_XT_MATCH_MAC=y
CONFIG_NETFILTER_XT_MATCH_QUOTA=y
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
CONFIG_NF_LOG_IPV4=y
CONFIG_NETFILTER_XT_MATCH_RECENT=y
CONFIG_NETFILTER_XT_MATCH_TCPMSS=y
CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
CONFIG_NETFILTER_XT_MATCH_NFACCT=y
```

### Rules Iptables AntiDDos/PortScanning
RulesAll.sh 
```
#!/bin/bash

ssh root@10.10.22.239 <<"ENDSSH"
iptables -X
iptables -F
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP  

iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

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

iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

iptables -t mangle -A PREROUTING -p icmp -j DROP  
iptables -t mangle -A PREROUTING -f -j DROP  

iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset
  
iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP 


iptables -N port-scanning 
iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN 
iptables -t mangle -A INPUT -p tcp --syn -m state --state NEW -m recent --set
iptables -t mangle -A INPUT -p tcp --syn -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
iptables -A port-scanning -j DROP
ENDSSH
```

### Kết quả cuối cùng 
![image](https://hackmd.io/_uploads/Sk7fVWvXJx.png)
![image](https://hackmd.io/_uploads/SkTNNZPmJg.png)
![image](https://hackmd.io/_uploads/SkRr4Zwm1l.png)


**TÀI LIỆU VÀ SOURCE CODE**
[IptablesRules](https://) 
[Rules ](https://)
