- Linux的防火牆由Netfilter實作:
- Netfilter的過濾功能在核心中實作,不依靠daemon。
- 工作于OSI 7層模型的第2, 3, 4層。
- 隻檢測封包頭。
- iptables是Netfilter的用戶端管理工具。
- Netfilter的子產品位于/lib/modules/$(uname -r)/kernel/net/netfilter/中。
- Netfilter Tables and Chains
- filter is default table.
- 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
掃描一下端口:
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