linux防火墙Netfilter(iptables)

  • Linux的防火墙由Netfilter实现:
  1. Netfilter的过滤功能在内核中实现,不依靠daemon。
  2. 工作于OSI 7层模型的第2, 3, 4层。
  3. 只检测报文头。
  4. iptables是Netfilter的客户端管理工具。
  5. Netfilter的模块位于/lib/modules/$(uname -r)/kernel/net/netfilter/中。
  • Netfilter Tables and Chains

    filter is default table.

  • Netfilter Packet Flow
    Netfilter Packet Flow

  • iptables的语法

iptables [ -t 表名 ] < -A |I |D |R > 链名[ 规则编号 ] [ -i | o 网卡名称] [ -p 协议类型] [ -s 源IP地址 | 源子网 ] [ --sport 源端口号 ] [ -d 目标IP地址 | 目标子网 ] [ --dport 目标端口号 ] < -j 动作 > 

filter为默认表。

  • 默认策略
    当数据包不符合链中任意一条规则时,iptables将根据该链预先定义的默认策略来处理数据包。
    定义形式
iptables [ -t 表名 ] < -P > < 链名 > < 动作 >
  • DNAT的例子
iptables -t nat  -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest 192.168.0.20

端口重定向
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-dest 192.168.0.200:3128
  • SNAT的例子
地址转换为出接口ens33的外网接口地址
iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

iptables -t nat -A POSTROUTING -j SNAT --to-source 1.2.3.45
  • 状态跟踪(connection tracking)的例子
    以FTP为例:
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/24 -p tcp --sport 21 -j ACCEPT
  • 常用命令
iptables -L -n 查看防火墙配置
iptables -nv -L
iptables -L  --line-numbers 或者--line 显示策略的行号
保持原有连接
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
ping -I 192.168.1.1 192.168.2.1 带原地址ping
查看会话表项conntrack
cat /proc/net/nf_conntrack
[sudo] password for user: 
ipv4     2 tcp      6 299 ESTABLISHED src=192.168.30.1 dst=192.168.30.6 sport=51921 dport=22 src=192.168.30.6 dst=192.168.30.1 sport=22 dport=51921 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
其中:
ASSURED  两个方向上有流量
UNREPLIED  有一个方向没有流量

禁止所有向防火墙发起的连接
iptables -P INPUT DROP
iptables -A INPUT -m state --state NEW -j DROP

自己被iptables挡在外边了!
*/5 * * * * /etc/init.d/iptables stop 

保存配置
iptables-save > /etc/sysconfig/iptables
iptables-save > ipt.20170110

恢复配置
iptables-restore < /etc/sysconfig/iptables
iptables-restore < ipt.20170110
  • 完整的例子
# Flash all rules
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
# Enable ip forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# Enable syn_cookies
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
#modules
modprobe ip_conntrack_ftp
modprobe ip_nat _ftp
#Default chain policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
#Enable interface
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# DNS
iptables -A OUTPUT -o ens33 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i ens33 -p udp --sport 53 -j ACCEPT
# SSH Server
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
#SSH Client
iptables -A OUTPUT -d 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
#ICMP request
iptables -A INPUT -s 192.168.0.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/24 -p icmp --icmp-type 0 -j ACCEPT
# ICMP echo
iptables -A OUTPUT -d 192.168.0.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p icmp --icmp-type 0 -j ACCEPT
# FTP Server
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/24 -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SNAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 1.2.3.4
# DNAT
iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j DNAT --to-dest 192.168.0.254
  • 其他常用例子
    先查看iptables的版本
    iptables --version
    (>1.4.7)
    uname -r
    (>2.6.32)
#!/bin/bash
iptables -F
iptables -X
iptables -Z

modprobe ip_tables
modprobe nf_nat
modprobe nf_conntrack

iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 放开多个端口
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
# 放开“来过的人”
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 入站流量限速(单位:包)
iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
# 防御ping-death(单位:包)
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit 1/s --limit-burst 10 -j ACCEPT
# 防御SYN-flooding(单位:包)
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT
# 防御外部疯狂扫描端口(单位:连接数)
iptables -A INPUT -p tcp --syn -m limit --limit 100/s --limit-burst 100 -j ACCEPT

扫描一下端口:

nmap -P0 -sS 211.3.2.4
lsof -i:1014
存在rpc.statd,使用随机端口
关闭服务
service nfslock stop
chkconfig nsslock off
  • 自动分析黑名单白名单的iptables脚本(不试用于web服务的高并发)
#!/bin/bash
netstat -an | grep :25 | grep -v 127.0.0.1 | awk '{print $5}' | sort | awk -F: '{print $1,$4}' | uniq -c | awk '$1>50 {print $1,$2}' > /root/black.txt
for i in `awk 'print 2' /root/black.txt` ; do
    COUNT=`grep $i /root/black.txt | awk '{print \$1}'`
    DEFINE="1000"
    ZERO="0"
    if [ $COUNT -gt $DEFINE ]; then
        grep  $i /root/white.txt > /dev/null    # 在白名单中的IP除外
        if [ $? -gt $ZERO ]; then
            echo "$COUNT $i"
            iptables -I INPUT -p tcp -s $i -j DROP
        fi
    fi
done
统计相应IP的瞬间连接数,判断并使用iptables的命令进行封堵。

查询公网IP信息 http://www.ip138.com/
判断完成后,设置cron

* /10 * * * * /bin/bash /root/deny_100.sh

可以使用webbench模拟web攻击测试。
安装方法

# yum install -y gcc ctags
# wget http://www.ha97.com/code/webbench-1.5.tar.gz
# tar zxvf webbench-1.5.tar.gz
# cd webbench-1.5
# make
# make install

使用

webbench -c 并发数 -t 运行测试时间 URL

elinks测试web访问(C退出,或者使用-dump选项)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值