Firewall:
组件,工作网络边缘(主机边缘),对进出本网络数据包基于一定的规则进行检查,并在匹配某规则时由规则定义的处理机制进行处理的。
网络层:包过滤,透明
状态检测包过滤型
应用层:代理层网关
5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
tcp/ip,内核中
选择5个位置,hook function
PREROUTING 数据包进入路由表之前
INPUT 通过路由表后目的地为本机
OUTPUT 由本机产生,向外转发
FORWARD 通过路由表后,目的地不为本机
POSTROUTING 发送到网卡接口之前
iptables-->netfilter
4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。
iptables规则:
iptables [-t table] command CHAIN [NUM] match criteria -j TARGET
-t table
过滤(filter):INPUT OUTPUT FOWARD 一般的过滤功能
NAT: PREROUTING OUTPUT POSTROUTING 用于nat功能(端口映射,地址映射等)
Mangle:PREROUTING OUTPUT POSTROUTING INPUT FOWARD 用于对特定数据包的修改
RAW:PREROUTING OUTPUT 优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
命令:
链
-N:new
-X: delete 空链
-F:flush 清空
-Z: zero 重新计数
-P: policy(策略) 默认
规则
-A:append 添加
-I:insert, -I CHAIN NUM
-R:replace, -R CHAIN NUM
-D:delete, -D CHAIN NUM
列表
-L:list 列出规则
-n,numeric 以数字方式显示
-v,verbose -vv -vvv 显示详细信息
-x, 不要做单位换算
--line-numbers
匹配规则:
基本匹配
-s, --src, --source 匹配数据包源地址
-d, --dst, --destination 匹配数据包目标地址
-i, 流入接口
-o, 流出接口
-p, portocol {tcp|udp|icmp} 协议匹配
扩展匹配
隐含扩展
-p tcp
--sport
--dport
--tcp-fags {SYN,ACK,FIN,PSH,URG,RST,ALL,NONE}
--syn
-p udp
--sport
--dport
-p icmp
--icmp-type echo-request 8,发出请求 echo-reply 0允许进来
显式扩展
-m state 状态检测
NEW,ESTABLISHED,RELATED,INVALID
State(状态) Explanation(注释)
NEW NEW说明这个包是我们看到的第一个 包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。
ESTABLISHED ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。
RELATED RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。
-m multiport 多端口匹配
--sports
--dprots 20,21,443,80
--ports
-m connlimit 连接数匹配
! --connlimit-above 5
-m string 字符串匹配
--lago {kmp|bm}
--string pattern
-m time 时间限制
--timestart 07:10
--timestop 23:59:59 stop时间大于start时间
-j TARGET
ACCEPT
DROP
REJECT
SNAT
DNAT
REDIRECT
LOG
NAT:
route add default gw 192.168.0.254 -->添加默认网关
route add -net 192.168.0.0/24 gw 192.168.0.254 -->添加路由条目
查看路由功能是否打开:
cat /proc/sys/net/ipv4/ip_forward
SNAT,MASQUERADE(地址伪装)
ssh,tcp,22,来自于192.168.0.0/24,目标地址此机器的地址,允许通过
iptables -t filter -A INPUT -s 192.168.0.0/24 -d 192.168.0.11 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.11 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
关闭默认:
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
允许本机ping 任何主机:
iptables -A OUTPUT -s 192.168.0.75 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.0.75 -p icmp --icmp-type 0 -j ACCEPT
iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
/etc/rc.d/rc.local 开机自动运行
常用规则小记:
/etc/rc.d/forward
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -A -i eth0 -j ACCEPT
/sbin/iptables -A -s 192.168.0.1 -p tcp --dprot 22 -j ACCEPT
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -m udp -p udp --dport 9000:10000 -j ACCEPT
/sbin/iptables -A -p icmp -s 192.168.0.1 -j ACCEPT
/sbin/iptables -P INPUT DROP
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -p tcp -d 10.10.10.1 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.1.1-192.168.1.10:80-100
例:对连接到本机的SSH连接进行限制,每个IP每小时只限连接5次
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP