Linux 内核中很早就实现了网络防火墙功能,在不同的Linux内核版本中,使用了不同的软件实现防火墙功能。

在2.0内核中,防火墙操作工具名称:ipfwadm

在2.2内核中,防火墙操作工具名称:ipchains

在2.4以后的内核,防火墙操作工具名称:iptables

ipfwadm 和 ipchains 比较老,已成历史版本,本章主要介绍 iptables

 

iptables 帮助

# iptables --help
iptables v1.4.7

Usage: iptables -[AD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain		Append to chain
  --delete  -D chain		Delete matching rule from chain
  --delete  -D chain rulenum
				Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
				Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
				Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
				List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
				Print the rules in a chain or all chains
  --flush   -F [chain]		Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
				Zero counters in chain or all chains
  --new     -N chain		Create a new user-defined chain
  --delete-chain
            -X [chain]		Delete a user-defined chain
  --policy  -P chain target
				Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
				Change chain name, (moving any references)
Options:
[!] --proto	-p proto	protocol: by number or name, eg. `tcp'
[!] --source	-s address[/mask][...]
				source specification
[!] --destination -d address[/mask][...]
				destination specification
[!] --in-interface -i input name[+]
				network interface name ([+] for wildcard)
 --jump	-j target
				target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match	-m match
				extended match (may load extension)
  --numeric	-n		numeric output of addresses and ports
[!] --out-interface -o output name[+]
				network interface name ([+] for wildcard)
  --table	-t table	table to manipulate (default: `filter')
  --verbose	-v		verbose mode
  --line-numbers		print line numbers when listing
  --exact	-x		expand numbers (display exact values)
[!] --fragment	-f		match second or further fragments only
  --modprobe=<command>		try to insert modules using this command
  --set-counters PKTS BYTES	set the counter during insert/append
[!] --version	-V		print package version.

 

一、iptable 操作命令参数详解

-A  

APPEND,追加一条规则(放到最后)

例如: 

iptables -A INPUT -j ACCEPT  

允许所有访问本机 IP 的数据包通过

 

-I 

 INSERT,插入一条规则 

例如: 

iptables -I INPUT -j DROP 

在 filter 表的 INPUT 链里插入一条规则(插入成第 1 条)

 

-D 

DELETE,删除一条规则 

iptables -D INPUT 3(按号码匹配) 

删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)

 

-R 

REPLACE,替换一条规则

例如: 

iptables -R INPUT 9 -j ACCEPT 

将原来编号为 9 的规则内容替换为“-j ACCEPT”

 

-P 

POLICY,设置某个链的默认规则

例如: 

iptables -P INPUT DROP 

设置 filter 表 INPUT 链的默认规则是 DROP

 

-F 

FLUSH,清空规则

例如

iptables -F

清空 filter 表中的所有规则

 

-p

protocol  比对通讯协议

例如

iptables -A INPUT -p tcp

比对通讯协议类型是否相符

 

-s   

src, source

例如

iptables -I INPUT -s 172.16.0.201 -j DROP

用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例屏蔽:172.16.0.201 IP访问,所有数据都将丢弃

 

--tcp-flags  比对 TCP

例如

iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

TCP状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)

等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对

 

--icmp-type

例如:

iptables -A INPUT -p icmp --icmp-type 8

用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。 案例ICMP类型是:8

 

-m limit --limit

例如

iptables -A INPUT -m limit --limit 3/sec

用来比对某段时间内封包的平均流量,上面的例子是用来比对每秒平均流量是否超过一次 3 个封包。

 

配置文件位置:

/etc/sysconfig/iptables

/etc/sysconfig/iptables-config

 

iptables 管理服务命令

开启  service iptables start

关闭  service iptables stop

重起  service iptables restart

或者

# /etc/init.d/iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]

 

二、案例讲解

本例中的规则将会阻止来自某一特定IP范围内的数据包,因为该IP地址范围被管理员怀疑有大量恶意攻击者在活动

如何判断服务是否受攻击?

1. ping测试服务是否丢掉?

掉包几钟可能原因: 你服务受攻击、机房上层线路受攻击、互联网上某个路由不稳定、机器服务/硬件问题(较少)

2. 可以搭建流量检查服务来监控服务网络流量

如:Cacti 、MRTG 2种较出名的流量监控 ,但都不是实时的,一般5分钟探测一次

3. 在linux上可以用一些脚本代码来监控网卡的实时流量、

查看实时流量脚本 ,用vi创建个脚本文件,将以下代码复制进去赋予权限,运行脚本监测

vim  network_monitor.sh

#!/bin/sh
#
# author: mimvp.com
# date  : 2016.4.18


while [ "1" ]
do
    eth=$1

    RXpre=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
    TXpre=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')

    sleep 1

    RXnext=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
    TXnext=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')

    RX=$((${RXnext}-${RXpre}))
    TX=$((${TXnext}-${TXpre}))

    if [[ $RX -lt 1024 ]];then
        RX="${RX}B/s"
    elif [[ $RX -gt 1048576 ]];then
        RX=$(echo $RX | awk '{print $1/1048576 "MB/s"}')
    else
        RX=$(echo $RX | awk '{print $1/1024 "KB/s"}')
    fi


    if [[ $TX -lt 1024 ]];then
        TX="${TX}B/s"
    elif [[ $TX -gt 1048576 ]];then
        TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}')
    else
        TX=$(echo $TX | awk '{print $1/1024 "KB/s"}')
    fi

#    clear 

    dtime=$(date "+%Y-%m-%d %H:%M:%S")
    echo -e "$dtime \t $eth \t $RX   $TX "
done

查看网卡的流量时   rx是接收(receive)    tx是发送(transport)

# ./network_monitor.sh   eth1
2016-04-18 18:37:23      eth1      9.60156KB/s   6.51367KB/s 
2016-04-18 18:37:24      eth1      5.00879KB/s   6.46582KB/s 
2016-04-18 18:37:25      eth1      9.24707KB/s   13.5234KB/s 
2016-04-18 18:37:26      eth1      8.44824KB/s   8.59766KB/s 
2016-04-18 18:37:27      eth1      5.20312KB/s   4.92871KB/s 
2016-04-18 18:37:29      eth1      7.72168KB/s   10.8086KB/s 

 

假如你认为这流量已是不正常流量,可以用以下命令查看有哪些IP在连接本机80端口,然后进行屏蔽!

# netstat -ant | grep ":80" | awk '{printf "%s %s\n",$5,$6}' | sort -n
0.0.0.0:* LISTEN
41.42.145.40:8080 SYN_SENT
43.241.212.125:47636 ESTABLISHED
49.73.66.152:43425 TIME_WAIT
49.73.66.152:45120 TIME_WAIT
49.73.66.152:45794 TIME_WAIT
49.73.66.152:46470 TIME_WAIT
49.73.66.152:46810 TIME_WAIT
49.73.66.152:47485 TIME_WAIT
49.73.66.152:48164 TIME_WAIT
49.73.66.152:48841 ESTABLISHED
54.183.197.223:56532 TIME_WAIT

假如你认为IP=49.73.66.152有可疑,屏蔽命令

iptables -I INPUT -s 49.73.66.152 -j DROP

解封屏蔽

iptables -D INPUT -s 49.73.66.152 -j DROP

只屏蔽 49.73.66.xxx IP段访问本机80端口,其他端口可以正常,命令如下:

iptables -I INPUT -p tcp --dport 80 -s 49.73.66.1/24 -j DROP

解封屏蔽

iptables -D INPUT -p tcp --dport 80 -s 49.73.66.1/24 -j DROP

 

在添加的规则时,REJECT(拒绝)目标和 DROP(放弃)目标这两种行动有所不同。

REJECT 会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused 的错误消息。DROP 会放弃分组,而对 telnet 用户不发出任何警告.

命令添加的规则只是临时生效,重起iptables服务(/etc/init.d/iptables restart)后将会恢复,永久进行保存命令service iptables save(/etc/init.d/iptables save)或者直接修改配置文件。

# /etc/init.d/iptables --help
Usage: iptables {start|stop|reload|restart|condrestart|status|panic|save}

修改完/etc/sysconfig/iptables 防火墙配置文件,需要重起iptables服务才会生效

 

三、iptables对抗DDOS攻击

默认的iptables规则是无法过滤DDOS攻击数据的,需要添加过滤规则实现iptables拥有抗DDOS的能力

以下防火墙规则是真实linux 邮局服务器上的防火墙规则,曾受过100M的SYN DDOS流量攻击,本人服务器国际带宽只有20M,

几乎使整个服务陷于瘫痪状态,后在iptables上增加了SYN过滤规则后,网络基本恢复正常,不掉包延时在100左右,正常情况延时45,但服务邮局服务收发没有任何问题!

服务器系统:Centos 5.5

linux-iptables-firewall-with-ddos-attack-defense-combat

 

上图,iptable 配置规则讲解:

屏蔽 SYN_RECV 的连接

-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT

限制IP碎片,每秒钟只允许100个碎片,用来防止DoS攻击

-A FORWARD -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT

限制ping包每秒一个,10个后重新开始

-A FORWARD -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT

限制ICMP包回应请求每秒一个

-A FORWARD -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT

此处自定义一个表

-A FORWARD -j RH-Firewall-1-INPUT

完全接受 loopback interface 的封包

-A RH-Firewall-1-INPUT -i lo -j ACCEPT

允许主机接受 ping

-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

网际网路印表机服务 (可以删除)

-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT

允许连线出去后对方主机回应进来的封包

-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

允许防火墙开启指定端口 (本服务器规则开了常用端口 22 21 80 25 110 3306等)

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport port -j ACCEPT

限制SSH登陆

只允许在172.16.0.2上使用ssh远程登录,从其它计算机上禁止使用ssh

iptables -A INPUT -s 172.16.0.2 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP

iptables 防火墙是一种很强悍的防火墙,只要规则配置好,能大量提高系统安全性,要比windows下的很多防火墙都好,有兴趣可以试下!