共计 4008 个字符,预计需要花费 11 分钟才能阅读完成。
随着互联网技术的方兴未艾,各种网络应用层出不穷,网络攻击、黑客入侵也成了网民畅游互联网的心头大患,互联网安全也愈加受到了人们的重视。网络防火墙,作为一种简单高效的互联网防御手段,逐渐成为了网民畅游网络世界的保护伞。下面笔者介绍下 Linux 系统的守卫者——iptables/netfilter。
一 兄弟齐心,其利断金
iptables/netfilter 就像一对兄弟,netfilter 是大哥,善使长钩;iptables 是小弟,擅长书记。这两兄弟一武一文,掌握着守城重任。
netfilter 大哥师承名门,身负五把长钩,每一个流经他的数据流都逃不过他的法眼,只见得五把长钩上下翻飞舞得水泄不通,将那不符合规则的数据包挑落马下。这五把长钩埋伏在城门的五个位置,分别是:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_POST_ROUTING、NF_IP_LOCAL_OUT。他们分别对应了下图的五个位置。
iptables 小弟学富五车,手拿生死簿,记载了乱臣贼子的具体情况,netfilter 大哥就是按照生死簿的记载检查每个数据包,以辨忠奸。
二 四章生死簿
生死簿内所载内容分为四个章节:raw、mangle、nat、filter
raw、mangle 记载了极高深的内容,正所谓曲高和寡,平常极少用到。filter 里记录了过滤规则;nat 表记录了地址转换和端口映射相关规则。
三 iptables 命令
iptables [-t tablename] {-A|-D|-I|-F|-L|-Z|-P} 链名 rule-specification
-t 指定表名,默认为 filter 表
-A 追加防火墙规则
-D 删除规则
-I 插入规则
-F 清空规则
-L 列出规则
-R 替换规则
-Z 清空计数
-P 设置链默认规则
链管理:
-N 创建新链
-X 删除用户自定义引用计数为 0 的空链
-E 自定义链重命名
-S 列出选定链的规则
[!] -p 匹配协议
[!] -s 匹配源地址
[!] -d 匹配目标地址
[!] -i 匹配入站网卡地址
[!] -o 匹配出站网卡地址
[!] –sport 匹配源端口
[!] –dport 匹配目的端口
[!] –src-range 匹配源地址范围
[!] –dst-range 匹配目的地址范围
[!] –limit 匹配数据表速率
[!] –mac-source 匹配 mac 地址
[!] –state 匹配状态(INVALID ESTABLISHED NEW RELATED)
[!] –string 匹配应用层字串
触发动作:
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录 syslog 日志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRRECT 重定向
四 filter 表规则
filter 表是最常被使用的表,是 iptables 命令默认修改的表。它包含了 3 条链,分别是 input、forward 和 output,分别用来制定进入本机、转发和离开本机的数据包规则。
1 修改默认规则
使用 iptables - P 命令修改默认规则,例如:
iptables -P INPUT ACCEPT
建议在 input 链最后添加 DROP 规则,例如:
iptables -A INPUT -p tcp -d 172.18.55.7 -j
DROP
这样即使清空规则后也不会断网。
2 增、删、改规则
使用 - A 在链尾增加规则;使用 - I 可以指定添加规则的位置,如不指定位置序号,则在开头增加,例如除了 22 端口以外,禁止连接本机的端口:
iptables -A INPUT -p tcp -d 172.18.55.7 -j
DROP
iptables -I INPUT -d 172.18.55.7 -p tcp
–dport 22 ACCEPT
使用 - D 可以删除某条规则,例如删除某一条规则
iptabels -D INPUT 1
3 扩展规则
扩展规则分为显式扩展和隐式扩展,显式扩展是指使用 - m 参数;隐式扩展是指在 - p 参数后可以省略 - m 参数。
隐式扩展包括的参数有:
-p tcp
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –tcp-flags mask comp
[!] –syn
-p udp
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
-p icmp
[!] –icmp-type {type[/code]|typename}
0/0:echo reply
8/0:echo request
显式扩展包括的参数有:
-m multiport
以离散或连续的
方式定义多端口匹配条件,最多 15 个;
[!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;
[!] –destination-ports,–dports
port[,port|,port:port]…:指定多个目标端口;
例:# iptables -I INPUT -d
172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT
-m iprange
以连续地址块的方式来指明多 IP 地址匹配条件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
例:# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport –dports
22,80,139,445,3306 -m iprange –src-range 172.16.0.61-172.16.0.70 -j REJECT
-m time
以时间或日期作为包过滤条件
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –weekdays day[,day…]
[!] –monthdays day[,day…]
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–kerneltz:使用内核配置的时区而非默认的 UTC;
-m string
以字符串为条件过滤数据包
–algo {bm|kmp}
[!] –string pattern
[!] –hex-string pattern
–from offset
–to offset
~]# iptables -I OUTPUT -m string –algo bm
–string“gay”-j REJECT
-m connlimit
限制每个 IP 连接服务器的连接数
–connlimit-upto n
–connlimit-above n
~]# iptables -I INPUT -d 172.16.0.7 -p tcp
–syn –dport 22 -m connlimit –connlimit-above 2 -j REJECT
-m limit
限制连接速率
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
~]# iptables -I OUTPUT -s 172.16.0.7 -p
icmp –icmp-type 0 -j ACCEPT
-m state
“state”扩展是对”conntrack”子模块的扩展。“state”扩展可以依照连接的状态过滤数据包。
[!] –state state
INVALID, ESTABLISHED, NEW, RELATED or
UNTRACKED.
NEW: 新连接请求;
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
UNTRACKED:未追踪的连接;
state 扩展:
内核模块装载:
nf_conntrack
nf_conntrack_ipv4
手动装载:
nf_conntrack_ftp
追踪到的连接:
/proc/net/nf_conntrack
调整可记录的连接数量最大值:
/proc/sys/net/nf_conntrack_max
调整超时时长:
/proc/sys/net/netfilter/*timeout*
4 处理动作(跳转目标)
-j targetname [per-target-options]
简单 target:
ACCEPT,DROP
扩展 target:
REJECT
–reject-with type
LOG
–log-level
–log-prefix
5 保存和载入规则:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, –noflush:不清除原有规则
-t, –test:仅分析生成规则集,但不提交
五 nat 表规则
iptables 不仅可以实现数据包过滤,还可以实现网络地址转换,这项功能是通过修改 nat 表实现的。nat 表一般作用在 PREROUTING 和 POSTRONTING 链上,然后通过 FORWARD 链过滤流经的数据包。
示例:将流经网关的数据包的源地址改为 192.168.10.254
iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j SNAT –to-source
192.168.10.254
如果是拨号地址,那么可以用 MASQUERADE 参数
示例:将流入网关 80 端口的数据包转发给 192.168.10.2
iptables -t nat -A PREROUTING -d 172.18.55.7 -p tcp –dport 80 -j DNAT
–to-destination 192.168.10.2