Linux Firewall prevents DOS and DDOS attacks

Source: Internet
Author: User

Use the firewall function of Linux to defend against Network Attacks
VM service providers may be attacked by hackers during operation. Common attacks include SYN and DDOS attacks. By changing the IP address, it is possible to find the attacked site to avoid the attack, but the service interruption takes a long time. A thorough solution is to add a hardware firewall. However, hardware firewalls are expensive. You can consider using the firewall function provided by the Linux system to defend against attacks.
1. resist SYN
SYN attacks use the three-way handshake principle of the TCP/IP protocol to send a large number of network packets that establish connections, but do not actually establish connections. As a result, the network queue of the attacked server is full, cannot be accessed by normal users.
The Linux Kernel provides several SYN-related configurations. Run the following command:
Sysctl-a | grep syn
See:
Net. ipv4.tcp _ max_syn_backlog = 1024
Net. ipv4.tcp _ syncookies = 0
Net. ipv4.tcp _ synack_retries = 5
Net. ipv4.tcp _ syn_retries = 5
Tcp_max_syn_backlog is the length of the SYN queue, and tcp_syncookies are a function. Whether to enable the SYN Cookie function can prevent some SYN attacks. Tcp_synack_retries and tcp_syn_retries define the number of retries of SYN.
Increasing the SYN queue length can accommodate more network connections waiting for connection. Enabling the SYN Cookie function can prevent some SYN attacks and reduce the number of retries.
To adjust the preceding settings, follow these steps:
Increase the SYN queue length to 2048:
Sysctl-w net. ipv4.tcp _ max_syn_backlog = 2048
Enable the syn cookie function:
Sysctl-w net. ipv4.tcp _ syncookies = 1
Reduce the number of retries:
Sysctl-w net. ipv4.tcp _ synack_retries = 3
Sysctl-w net. ipv4.tcp _ syn_retries = 3
To maintain the preceding configuration during system restart, you can add the preceding command to the/etc/rc. d/rc. local file.
2. Resist DDOS attacks
DDOS and distributed denial of access (DDOS) attacks mean that hackers send a large number of connections to common ports, such as 80 and 25, to many hosts from different sources. However, these clients only establish connections, not normal access. Generally, due to the limited number of accepted connections configured by Apache (usually 256), these "fake" access will fill up Apache and normal access will fail.
Linux provides a firewall tool called ipchains to shield connections from specific IP addresses or IP address segments to specific ports. To use ipchains to defend against DDOS attacks, you must first use the netstat command to find the source address of the attack, and then use the ipchains command to block the attack. One block is found.
* ** Enable the ipchains Function
First, check whether the ipchains service is set to auto start:
Chkconfig -- list ipchains
The output is generally:
Ipchains 0: off 1: off 2: on 3: on 4: on 5: on 6: off
If the column 345 is on, the ipchains service has been set to auto start.
If not, run the following command:
Chkconfig -- add ipchains
Set ipchains to auto start
Next, check whether the ipchains configuration file/etc/sysconfig/ipchains exists. If this file does not exist, ipchains
It does not take effect even if it is set to automatic start. The default ipchains configuration file is as follows:
# Firewall configuration written by lokkit
# Manual customization of this file is not recommended.
# Note: ifup-post will punch the current nameservers through
# Firewall; such entries will ** not * be listed here.
: Input ACCEPT
: Forward ACCEPT
: Output ACCEPT
-A input-s 0/0-d 0/0-I lo-j ACCEPT
# Allow http, ftp, smtp, ssh, domain via tcp; domain via udp
-A input-p tcp-s 0/0-d 0/0 pop3-y-j ACCEPT
-A input-p tcp-s 0/0-d 0/0 http-y-j ACCEPT
-A input-p tcp-s 0/0-d 0/0 https-y-j ACCEPT
-A input-p tcp-s 0/0-d 0/0 ftp-y-j ACCEPT
-A input-p tcp-s 0/0-d 0/0 smtp-y-j ACCEPT
-A input-p tcp-s 0/0-d 0/0 ssh-y-j ACCEPT
-A input-p TCP/IP 0/0-d 0/0 domain-y-j ACCEPT
-A input-p udp-s 0/0-d 0/0 domain-j ACCEPT
# Deny icmp packet
#-A input-p icmp-s 0/0-d 0/0-j DENY
# Default rules
-A input-p tcp-s 0/0-d 0/0-y-j REJECT
-A input-p tcp-s 0/0-d 0/0 2049-y-j REJECT
-A input-p udp-s 0/0-d 0/0-j REJECT
-A input-p udp-s 0/0-d 0/0 2049-j REJECT
-A input-p tcp-s 0/0-d 0/0 6000: 6009-y-j REJECT
-A input-p tcp-s 0/0-d 0/0 7100-y-j REJECT
If the/etc/sysconfig/ipchains file does not exist, you can use the above content to create it. After creation, start ipchains Server:
/Etc/init. d/ipchains start
* ** Use the netstat command to find the attack source
If the hacker attacks port 80 on the Web, view the IP address and port of the Client Connected to port 80. The command is as follows:
Netstat-an-t tcp | grep ": 80" | grep ESTABLISHED | awk '{printf "% s \ n", $5, $6}' | sort
Output:
161.2.8.9: 123 FIN_WAIT2
161.2.8.9: 124 FIN_WAIT2
61.233.85.253: 23656 FIN_WAIT2
...
The first column is the Client IP address and port, and the second column is the connection status.
If there are many connections from the same IP address (more than 50 connections) and they are continuous ports, it is likely to be an attack.
If you only want to view the established connection, run the following command:
Netstat-an-t tcp | grep ": 80" | grep ESTABLISHED | awk '{printf "% s \ n", $5, $6}' | sort
* ** Use ipchains to block attack sources
You can use ipchains to block attack sources in two ways. One is to add it to/etc/sysconfig/ipchains and restart the ipchains service. The other is to directly use the ipchains command. After the attack is blocked, you may need to restart the attacked service. The attack connection has expired.
* Add/etc/sysconfig/ipchains
Assume that the connection from 218.202.8.151 to 80 is blocked. Edit the/etc/sysconfig/ipchains file in: output ACCEPT
Add the following lines:
-A input-s 218.202.8.151-d 0/0 http-y-j REJECT
Save the changes and restart ipchains:
/Etc/init. d/ipchains restart
If you want to block the entire network segment of 218.202.8, add:
-A input-s 218.202.8.0/255.255.255.0-d 0/0 http-y-j REJECT
* Directly use the command line
The method of adding the/etc/sysconfig/ipchains file and restarting ipchains is slow, and some connections may be drilled in when ipchains are restarted. The most convenient method is to directly use the ipchains command.
If the connection from 218.202.8.151 to 80 is blocked, run the following command:
Ipchains-I input 1-p tcp-s 218.202.8.151-d 0/0 http-y-j REJECT
If you want to block the entire network segment of 218.202.8, run the following command:
Ipchains-I input 1-p tcp-s 218.202.8.0/255.255.255.0-d 0/0 http-y-j REJECT
Here,-I indicates insertion, input indicates rule connection, and 1 indicates adding to the first one.
You can edit a shell script to make it easier. The command is as follows:
Vi blockit
Content:
#! /Bin/sh
If [! -Z "$1"]; then
Echo "Blocking: $1"
Ipchains-I input 1-p tcp-s "$1"-d 0/0 http-y-j REJECT
Else
Echo "which ip to block? "
Fi
Save, and then:
Chmod 700 blockit
Usage:
./Blockit 218.202.8.151
./Blockit 218.202.8.0/255.255.255.0
The rules created by the preceding command line method will expire after the restart. You can use the ipchains-save command to print the rules:
Ipchains-save
Output:
: Input ACCEPT
: Forward ACCEPT
: Output ACCEPT
Saving 'input '.
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0-I lo-j ACCEPT
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 110:110-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 80: 80-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 22: 22-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 88: 88-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 89: 89-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 90: 90-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 91: 91-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 8180: 8180-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 443: 443-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 21:21-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 25:25-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 22:22-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 53: 53-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 9095: 9095-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 8007: 8007-p 6-j ACCEPT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 53: 53-p 17-j ACCEPT
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 0: 1023-p 6-j REJECT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 2049: 2049-p 6-j REJECT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 :1023-p 17-j REJECT
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 2049: 2049-p 17-j REJECT
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 6000: 6009-p 6-j REJECT-y
-A input-s 0.0.0.0/0.0.0.0-d 0.0.0.0/0.0.0.0 7100: 7100-p 6-j REJECT-y
You need to set "Saving 'input '. "Remove and save the other content to the/etc/sysconfig/ipchains file. In this way, after the next restart, the created rule will take effect again.
3. If iptables is used
In RH 8.0 and later versions, iptables is enabled to replace ipchains. The two are very similar and different.
* Enable iptables
If the iptables file does not exist in/etc/sysconfig/, you can create:
# Firewall configuration written by lokkit
# Manual customization of this file is not recommended.
# Note: ifup-post will punch the current nameservers through
# Firewall; such entries will ** not * be listed here.
* Filter
: Input accept [0: 0]
: Forward accept [0: 0]
: Output accept [0: 0]
: RH-Lokkit-0-50-INPUT-[0: 0]
-A input-j RH-Lokkit-0-50-INPUT
-A RH-Lokkit-0-50-INPUT-I lo-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport ftp-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport ssh-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport http-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport smtp-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport pop3-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport mysql-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport 2001-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport domain-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p udp-m udp -- dport domain-j ACCEPT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport -- syn-j REJECT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport 2049 -- syn-j REJECT
-A RH-Lokkit-0-50-INPUT-p udp-m udp -- dport-j REJECT
-A RH-Lokkit-0-50-INPUT-p udp-m udp -- dport 2049-j REJECT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport 6000: 6009 -- syn-j REJECT
-A RH-Lokkit-0-50-INPUT-p tcp-m tcp -- dport 7100 -- syn-j REJECT
COMMIT
The preceding configuration allows ftp, ssh, http, smtp, pop3, mysql, 2001 (Prim @ Hosting ACA port), and domain port.
* Start iptables
/Etc/init. d/iptables start
* Set iptables to auto start
Chkconfig -- level 2345 iptables on
* Use iptables to shield IP addresses
Iptables-I RH-Lokkit-0-50-INPUT 1-p tcp-m tcp-s 213.8.166.227 -- dport 80 -- syn-j REJECT
Note that the difference with ipchains is:
-The parameters of the rule name after I are different from those of ipchains. They are not uniform input, but defined in/etc/sysconfig/iptables, with-m tcp added, the parameter of the specified port is -- dport 80, and the -- syn parameter is added to automatically detect sync attacks.
Disable ping using iptables:
-A input-p icmp-m icmp -- icmp-type 8-m limit -- limit 6/min -- limit-burst 2-j ACCEPT
-A input-p icmp-m icmp -- icmp-type 8-j REJECT -- reject-with icmp-port-unreachable
######################################## ######################################## #

 
 

Anti-DDOS in Linux
Method 1: first, this simple method is ineffective. in Linux, apache is generally used as a web service software. Generally, port 80 is set according to access habits. You can change the service port and edit the httpd. conf file. The path is unknown in Linux.
Find/-name httpd. conf
Then
Vi $ path $/httpd. conf
Find
Listen: 80

Change
Listen: 8080
Restart apache so that your site runs under port 8080.
Method 2: If the attacker pays enough attention to you in method 1, the attacker will attack your port 8080 again, so it will still die badly. How can this effectively prevent the attack. This requires iptables. Install iptables and configure it again.
Download iptables:
Http://www.netfilter.org/downloads.html
The download file name is generally iptables-1. *. * .tar.bz2
Decompress the package after the download.
Tar-xvjf./iptables-1. *. * .tar.bz2-C/usr/src
I decompressed it to/usr/src.
Then
Cd/usr/src/iptables-1 .*.*
Installation:
/Bin/sh-c make
/Bin/sh-c make install
You can use iptables-V to check whether the installation is correct.
Use this command to fix the problem.
Cp./iptables/sbin
Iptables usage:
Disable the ICMP service after iptables is installed.
Iptables-a output-p icmp-d 0/0-j DROP
What is this? The simplest and most intuitive way is that the ip address on your server cannot be pinged, which can prevent some attacks.
For example, if you contact your ISP and you know the source ip address of the ddos service 200.200.200.1, you can use the following command to block data streams from this ip address.
Iptables-a input-s 200.200.200.1-j DROP
Note: The 200.200.200.1/24 200.200.200. * format is valid. I believe everyone knows this.
After the command is executed, enter the command
Iptables-L
The following result is displayed.
Chain INPUT (policy ACCEPT)
Target prot opt source destination

DROP all -- 200.200.200.1 anywhere
Each time you enter an iptables command, there will be a corresponding num number. For example, if you run this command for the first time, the corresponding input id is 1. to delete this restriction
Iptables-d input 1
You can.
Because in the Process of DDOS, many ip addresses are forged. If you can find the mac address of their source (You are too powerful, it is too relevant) you can also use this command to disable data streams from this mac address:
Iptables-a input -- mac-source 00: 0B: AB: 45: 56: 42-j DROP
The above are some simple applications. For some other applications, I will provide the English document below. You can use iptables to prevent DDOS attacks based on your own situation.
By the way, after you enter some restrictions after installing iptables for the first time, you have to submit the rules again after the server is started. This is too troublesome. What should I do? You only need to use this command.
/Etc/init. d/iptables start


The author's "txgc1009 column"

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.