linux 防火墙-iptables-netfilter
iptables : 对ip层报文进行改写
ebtables: 对二层报文进行改写详解(1):入门简介
1、iptables(包括netfilter)组成Linux平台下的包过滤防火墙,且是免费的,可以代替昂贵的商业防火墙解决方案,完成包过
滤、封包重定向、NAT等功能
2、iptables主要对 5链(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)、
4表(filter、nat、mangle、raw)进行处理
详解(2):查询
1、iptables -nvL --line-numer INPUT -t filter
注:查询INPUT链上的filter表的配置规则(如果不指定表,则默认是查询filter表)
详解(3):简单规则配置
1、iptables -t filter -I INPUT -s 192.168.1.146 -j DROP
注:对进入INPUT链,源地址为192.168.1.146的报文进行丢弃处理
2、service iptables save
注:表示将规则保存至/etc/sysconfig/iptables文件中
详解(4):扩展规则配置
1、iptables -t filter -I INPUT -s 192.168.1.146,192.168.1.146 -j DROP
注:应用逗号匹配更多源地址
2、-p 指定协议号
-i 指定入接口
-o 指定出接口
3、基于端口号匹配
--sport --dport,设置基于端口号匹配,当然先需要使用-p指定是tcp、还是udp协议,并同时设置-m模块
muiltport 选项可以同时指定多个端口
详解(5):扩展规则配置:常用扩展模块
1、iprange 指定ip地址范围
2、string 指定报文中的内容
3、time 指定时间段
4、connlimit 指定链接数量,可以限制每个IP地址同时链接到server端的链接数量
5、limit 类似于connlimit扩展模块,指定单位时间内的某条流的个数
详解(6):扩展规则配置:--tcp-flags
1、--tcp-flags: 指定tcp报文中的flags中的六个字段(SYN ACK FIN RST UGR PSH)进行匹配处理
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
拒绝tcp第一次握手报文,即新建链接的报文(匹配所有标志位,其中SYN为1,其他标志位为0)
2、SYN,ACK,FIN,RST,URG,PSH 也可以用ALL代替
3、第一个握手报文匹配使用较多,iptables提供了简化版:SYN,ACK,FIN,RST,URG,PSH SYN可以用--syn代替
详解(7):扩展规则配置:udp、icmp
1、udp扩展 : 即是对udp端口号进行处理
2、icmp扩展:--icmp-type指定具体的icmp报文,如ping请求包(echo-request)、ping响应包(echo-reply)等
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
注:拒绝ping请求包
详解(8):扩展规则配置:state
1、针对报文的状态(包括udp、icmp,udp居然也有链接状态的说法),主要应用于黑客的恶意攻击
对于state模块而言,“链接”其中的报文可以分为5种状态:NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
注:只同意响应包通过,即主动发起的请求报文将被丢弃
详解(9):黑白名单
1、黑名单:处理动作为DROP、REJECT,此时链的默认策略为ACCEPT(不然全不过)
2、白名单:处理动作为ACCEPT,此时链的默认策略为DROP(不然全过)
比较理想的设置如下:
iptables -P INPUT ACCEPT ## 设置默认策略
......... ## 增加黑名单
iptables -A INPUT -j REJECT ## 没有匹配上的报文全拒绝
这样配置即实现了对报文的严格控制,又实现了因为执行iptables -F导致所有报文不通(管理员自己都登陆不上)
详解(10):自定义链
1、实际应用中,规则太多,一个链中可能存在上百条规则,如果我们想修改某条规则,需要在上百条规则中查询,很繁琐
所以iptables提供了自定义链的方式,即可以把某类规则存储到自定义链中进行归类处理
iptables -t filter -N IN_WEB ## 在filter表中创建IN_WEB自定义链
iptables -I IN_WEB -s 192.168.1.188 -j REJECT ## 在自定义链中添加规则(同默认链)
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB ## 在INPUT链中通过-j选项引用刚才创建的自定义链(即自定
义链需要通过默认链挂接)
详解(11):网络防火墙
1、开启iptables转发功能
2、使用白名单机制,先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则
3、配置规则时,需要考虑方向问题,即请求方向、响应方向
4、可以使用state模块进行优化
详解(12):处理动作总结一
1、常用动作有ACCEPT、DROP、REJECT,还可以通过--reject-with选项设置拒绝原因
2、-j LOG 可以记录匹配到报文到/var/log/message中
详解(13):处理动作总结二
1、 处理动作还有:SNAT、DNAT、MASQUERADE、REDIRECT
2、 SNAT:内网访问外网时,防火墙将所有内网IP替换为防火墙自身设备的公网IP(根据源IP+端口号方式)
DNAT:外网访问内网多个服务器时,防火墙将所有外网IP替换为防火墙自身设备的公网IP
其实,不管是SNAT还是DNAT,都起到了隐藏了内部主机IP的作用
3、iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
注:将进入POSTROUTING链的报文源地址为 10.1.0.0/16 修改为 192.168.1.146
SNAT规则只存在于POSTROUTING链、INPUT链中,因为POSTROUTING链是报文转发的最后一个关卡,我们应该在报文发
去之前修改源地址,否则就再也没有机会修改源地址了,那在PREROUTING等其他链中修改是否可以呢?
4、iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389
注:将进入PREROUTING链的报文源地址为 10.1.0.0/16 端口号为3389的tcp报文修改为目的地址为 10.1.0.6:3389
DNAT规则只存在于PREROUTING、OUTPUT链中,如果不在PREROUTING中修改目的地址,报文就会进入路由层面,进行
了路由转发
5、-j MASOUERADE 可以动态的将源地址转换为可用的IP地址
iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth1 -j MASOUERADE
注: 将进入POSTROUTING链中报文源地址为 10.1.0.0/16 修改为eth1接口的地址(所以无论eth1地址如何变化,不用再重
新修改规则)
6、-j REDIRECT可以在本机上进行端口映射
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
注:其他机器访问本机的80端口时,会被重定向到8080端口
参考文档:
iptables 详解系列(1~14): http://www.zsythink.net/archives/1199
Netfilter学习笔记: http://blog.csdn.net/langeldep/article/details/8788360