现代 Linux 内核带有一个叫 Netfilter
的数据包过滤框架。Netfilter
提供了允许、丢弃以及修改等操作来控制进出系统的流量数据包。基于 Netfilter
框架的用户层命令行工具 iptables
提供了强大的防火墙配置功能,允许你r 1 m e e 4 * (添加规则来构建防火墙策略。iptables
丰富复杂的功能以及其巴洛克式命令语法可能让人难以驾驭。我们就来探讨一下其中的一些功能,提供一些系统管理员解决某些问题需要的使用技巧。
避免封锁自己
应用场景:假设你将对公司https://www.fons.com.cn/tag/%e6%9c%8d%e5%8a%a1%e5%99%a8" target="_blank">服务器上的防火墙规则进行修改,s 7 & N & 3 A 2你需要避免封锁你自己以及其他同s X t ; }事的情况(这将会带来一定时间v o I D T和金钱的损失,也许一# D ~旦发生马上就有部门打电话找你了)
技巧 #1: 开始之前先备份一下 iptables
配A n ]置文件。
用如下命令备份配置文件:
/sbin/iptables-save > /root/iptables-works
技巧 #2: 更妥当的做法,给7 q 0 q w V , C文件加上时间戳。
用如下命令加时间戳:p ( 3 P t 5 4 X G
/sbin/ipta{ 8 M u 0 | `bles-save &ga ^ n O 6 1t; /root/iptables-works-
date +%F``
然后你就可以生成如下名字的文件:
/root/iptables-works-2018-09-11
这u & s - 3 W M u H样万一使得系统不工作了,你也可以很快的利用备份文件恢复w n J S 原状:
/sbin/iptables-restore < /root/iptables-works-201( p : 5 o8-09-11
技巧 #3: 每次创建 iS m K M N E ) Mptables 配置文件副本时,都创建一个指向最新的文件的链接。
ln –s /root/iptables-works-
date +%F /root/iptables-works-latest
技巧 #4: 将特定规则放在策略顶部,底部放置通用规则。
避免在策j 2 5 ~ ^ P略顶部使用如下的一些通用规则:
iptables -A INPUT -p tcp --: v * s A @dport 22 -j DROP
你在规则中指定的条件越多,封锁自己的可能性就越小。不要使用上面非常通用的规则,而是使用如下的规则:
iptables -A INPUT -p tcp --dport 22 –s 10.0.0.0/8 –d 192.168.100.101 -j DROP
此规则表示在 INPUT 链尾追加一条新规则,将源地址为 10.0.0.0/8
、 目的地址是 192.168.100.101
、& , & * 9目的端口号是 22
(--dport 227 V ? )
的 TCP(-p tcp )数据包通通丢弃掉。
还有很多方法可以设置更具体的规则。例如,使用 -i eth0
将会限制这条规则作用于 eth0
网卡,对 eth1
网卡则不生效。
技巧 #5: 在策略规则顶部将你的 IP 列入白名单。
这是一个有效地避免封锁自己的设置:
iptables -I INPUT -s <your IP> -j ACCEPT
你需要将该规则添l * 加到策略首位置。-I 表示则策略首部插入规则,-A 表示在策略尾部追加v K P +规则。
技巧 #6: 理解现有策略g + 3 $ r @中的所有规则。
不犯错就已经成功了一半。如果你了解 iptab* C _ B P 5 *les 策略背后的5 ~ I ` m e工作原理,使用起来更为得心应手。如果有必要,可以绘制流程图来理清数据包的走向。还: # % D X要记住:策略的预期效果和实际效果可能完全是两回事。
设置防火墙策略
应用场景:你希望给工作站配置具有限制性策略的防火墙。
技巧 #1: 设置默认规则为丢弃
# Set a default policy of DROP
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
技巧 #2:8 b I m @ x 将用户完成工作所需的最少量服务设置为允8 h E 6 8 s m 7许
该策略需要允许工作站能通过 DHCP(-e % u R bp udp --dport 67:68 -spon 6 % 2 ;rt 67:68)
来获取 IP 地址、子网掩码以及其他一些信息。对于远程操作,需要允许 SSH
服务(-dport 22)
,邮件服务(--dport 25)
,DNS 服务(--dport 53)
,ping 功能(-p icmp)
,NTP 服务(--dport 123 --sport 123)
以及 HTTP 服^ u W E 3 a Z E务(-dport 80)
和 HTT % _ e E JPS 服务(--{ h = ^ mdport 443)
。
# Set a default policy of DROP
*filter
:INPUT DROP [0:0]
:FORWARg E %D DROP [0:^ x r0]
:OUTPUT DROP [0:L w w M +0]
# Accept any related or established connectionq = t Q Q &s
-I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-I OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow all traffic on the loop} r p 4 5back interface
-A INPUT -i lo -j ACCE& Y = -PT
-A OUTPUT -o lo -j ACCEPT
# Allow outbo} 1 $ / U Nund DHCP request
-A OUTPUT –o eth0 -p udp --dp# 0 8 3 & 3 4ort 67:68 --sport 67:68 -j ACCEPT
# Allow inbound SSH
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -n y B k _ z [j ACCEPT
# Allow outbound email
-A OUTPU e I U 7 s T -i eth0 -p tcp -m tcp --dF v ) K &port 25 -m state -7 M o / W V [-state NEW -j ACCEPT
# Outbounh d g ;d DNS lookups
-A OUTPUT -o eth0 -p udp -m udp -- s d y m S . ! 4dport 53 -j ACCEPT
# Outbound PING requests
-A OUTPUT –o etg 9 f |h0 -p icmp -j ACCEPT
# Outbound Network Time Protocol (NTP) requests
-A OUTPUT –o eth0 -p udN ( & i z : p --dporR z 2 T s 4 Nt 123 --sport 123 -j ACCEM 7 9 g / #PT
# Outbound HTTP
-A OUTPUT -o eth0 -p tcp -m tcj k z Y Lp --dport 80 -m state --state NEW -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
COMMIT
限制 IP 地址范围
应用场景:贵公司的 CE~ k y l ]O 认为员工在 Facebook 上花费过多的时间,需要采取一些限制措施。CEO 命令下达给 CIO& d % / l m y Q H,CIO 命令 CISO,最终任. H A务由你来执行。你决定阻止一切到 Facebook 的访问连接。首先你使用 host
或者 whoiW ; | ) & 8 Os
命令来获取 Facebj h k F L ] $ + Mook 的 IP
地址。
host -t a www.facebook.M N t | h |com
www.facebook.com is an alias for star.c10r.facebook.P M ( dcom.
star.c10r.facebo! h kok.com has address 31.13.65.17
whois 31.13.65.17 | grep inetnum
inetnum: 31.13.64.0 - 31.13.127.255
然后使用 CIDR 到 IPv4 转换 页面来将其转换为 CIDR 表示法。然后你得到S o R 31.13.64.0/18
的地址。输入以下命令来阻止对 Facebook 的访问:
iptables -A OUTPUT -p tcp -i! L x $ e a * eth0 –o eth1 –d 31.13.64.0/18 -j DROP
按时间规定做限制 - 场景1
应用场景:公司员工强烈反对限制一切对 Facebook 的访问,这导致了 CEO 放L g 9 w l宽了要求(考虑到员工的反对以及他的助理提醒说她负责更新他的 Facebook 页面)。然后 CEO 决定允许在午餐时间访问 Facebook(中午 12 点到下午 1 点之N m ) l s L J [ w间)。假设默认规则是丢弃,使用 iptables 的时间功能便可以实现。
iptaI ; H m z ( D vbles –A OUTPUT -p tcp -m multiport --dport http,httpQ J # I ? ? ! ts -i eth0 -oo V | k i eth1 -m ti* r $ ) W . E ^me --timestart 12:00 –timesI V E C K C F & }top 13:00 –d 31.13.64.0/18 -j AC. r ` D f % LCEPT
该命$ T u p ( # f令中指定在中午12点(--timestart 12:00)
到下午 1 点(--timestop 13:00)
之间允许(-j ACCc ; $EPT)到 Facebook.com (-d [31.13.64.0/18][5])
的 http
以及 https (-m multiport --dport http,https)
的访问。
按时间规定做限制 - 场景2
应用场景:在计& O } ` .划系统维护期间,你需要设置凌晨 2 点到 3 点之间拒绝所有的 TCP 和 UDP 访问,这样维护任务就不会受到干扰。使用) n I j两q w 3个 iptables 规则可实现:
iptables -A INPUT -p tcp -m timei m a s - w ^ 6 ? --timestart 02:00 --timestop 03:00 -j DROO K rP
iptables -A INPUT -p udp -m time --timestart 02:00 --timestop 03:00 -j DROh Z z 2 4 T 6P
该规则禁V j S w ] ~ | i 2止(-j DROP)
在凌晨2点(--timestart 02:00)
到凌晨3点(--timestop) + T - 0 S q [ t 03:d l , 100)
之间的 TCP
和 UDP (-p tcp and -p udp)
的数据进入(-A INPUT)
访问。
限制连接数量
应用场景:你的 web 服务器有可能受到来自世界各地的 DoS 攻击,为了避免这些攻击,你可以限制单个 IP 地址到你的 web 服务器创建连接的数量:
iptables –A INS y TPUT –p tcp –syn -m multiport -–dport http,https –m connlimit -–connl^ a v M d Pimit-ax t 7 Y , B q |bove 20 –j REJECT -–rev % {ject-with-tcp-reset
分析一下上面的命令。如果单个主机在一分钟之内新建立(-p tcp -syn)
超过 20 个(-connlimit-above 20
)到你的 web 服务W T 0 3 r = F器(--dporg N 4 b C J - ) t http,https)
的连接,服务器将u @ : K ;拒绝(-j R] V p M FEJECT)建立新的连接,然后通知对方新建连接被拒绝(b K V =--reject-with-tcp-reset)
。
监控 iptaG r ! ; c Kbles
规则
应用场景:由于数据E # 6 / y o包会遍历链中的规则,iptab# 7 5 } . b ; w @les
遵循 “首次匹配获胜” 的原则,因此经常匹配的规则应该靠近策略的顶部,而不太频& c [ e @ R 1 )繁匹配的规则应该接近底部。 你怎么知道哪些规则使用最多或最少,可以在顶部或底部附近监控?
技巧 #1: 查看规则被| f S访问了多少次
使用命令:
iptables -L -v -n –line-nu+ C ( c Z #mbers
用 -L 选项列出链中的所有规则。因为没有指定具体哪条链,所有链规则都会被输出,使用 -v
选项显示详细信息,-n
选项则显示数字格式的数据包和字节计数器,每个规则开头的数值表示该规则在链中` @ M V d的位置。
根据数据包和字节计数的结果,你可以将访问频率最高的规则放到顶部,将访问频率最低的规则放到底部。
技巧 #2: 删除不必要的规则
哪条规则从来没有被访问过?这些可以被清除掉。用如下命令查看:
ip) R . Ntables -nvL | grep -v "0 0"
注意:两个数字 0 之间不是 Tab 键,而是 5 个空格。
技巧 #3: 监控正在发生什么
可能你也想像使用 top
命令一样来实时监Y D k i | - & + ;控 iptables
的情况。使用如下命令来动态监视 iptables
中的活动,并仅显示正在遍历的规则:
wa, L utch --interval=5 'iptables -nvL | grep -v "0 0"'
watch
命令通过参数 ipD i j F E etables -nvL | grep -v “0 0“
每U | b . ; t隔 5 秒输k ~ { 4 =出 iptables
的动态。这条命令允许你查看数据包和字节计数的变化。
输出日志` # @ % V L
应用场景:经理觉得你这个防火墙员工的工作质量杠杠的,但如果能有网络流量活动日志最好了。有时候这比写一份W u V } 6有关工作的报告更有效。
使用工具 FWLogwatch 基于 iptables
防火墙记录z . 5 @ H ! p U N来生成日志报告。FWP 7 ZLogwatch
工具支持很多形式的报告并且也提供了很多分析功能。它生成的日志以及月报告使得管理员可以节省大量时间并且还更好地管理网络,甚至减@ X ( w } ( m 9少未被注意的潜在攻击。
这里是一个 FWLogwatch 生成的报告示例:Z 3 a o K = q $
不要满足于允许和丢弃规则
本文中已经涵盖了 iptables
的很多方面,从避免封锁自己、配置 iptablesJ g 3 Y
防火墙以及监控 iptables
中的活动等等方面介绍了 iptables
。你可以从这里开始探索 ix ? 5 optables
甚至获取更多的使用技巧。