天天看點

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
  • linux防火牆Netfilter(iptables)
  • filter is default table.
  • Netfilter Packet Flow
  • linux防火牆Netfilter(iptables)
  • 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      

掃描一下端口:

nmap -P0 -sS 211.3.2.4
lsof -i:1014
存在rpc.statd,使用随機端口
關閉服務
service nfslock stop
chkconfig      
  • 自動分析黑名單白名單的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資訊 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