网络安全-防火墙
防火墙的原理
防火墙的作用
主要作用:过滤两个网络之间的数据包
INERNET------fire wall------server------LAN
Linux内核的Netfilter
Linux内核空间和应用程序空间是不一样的
内核空间是受保护的,任何进出服务器的数据包都要经过内核处理
所有发送给本地的数据包都要经过INPUT
任何从本机产生的数据包发送给其它人都要经过OUTPUT
一个数据从本机路由转发,目标不是自己,是发给别人的将从FORWARD经过
INPUT/OUTPUT保护的是本机FORWARD保护的是局域网用户
包过滤原理
一个数据包要经过本地的路由,要判断怎么走,ROUTING是非常重要的,它决定了要怎么走
如果一个包和我本地网卡地址一样,本地可以收到,进入INPUT,否则FORWARD
如果一个包是本地产生的,发出去的经过OUTPUT
包过滤就是在这三个地方设置条件,设置障碍,阻止或通过数据包,及设置包的处理方式
包的处理方式
iptable -A INPUT -p icmp -j DROP
包的处理方式常见的有目标(Target) 丢弃(DROP) 接受(ACCEPT) (弹回)REJECT 日志(LOG)等
iptables命令
iptables -A INPUT -p icmp -j DROP 增加一个过滤规则
ping 192.168.0.101
iptables -L -n查看过滤规则
iptables -F清空过滤规则
iptables --help | more
iptables -L -n –line-number
增加一条规则把拒绝所有访问21端口的数据包
iptables -A INPUT -p tcp -d 192.168.0.101 --dport 21 -j DROP
iptables -F修改的时候要把防火墙的门全部关起来 然后一个一个端口打开
iptables -L -n –line-numbers
假设我们一个服务器只开启一个http
那么我们要开启http/ssh(远程管理)
所有的http 端口grep http /etc/services
打开ssh grep ssh /etc/services
iptables -A INPUT -p tcp -d 192.168.0.101 --dport 22 -j ACCEPT 接收进来,目标IP是本地IP,目标端口是22
iptables -A OUTPUT -p tcp -s 192.168.0.101 --sport 22 -j ACCEPT 发送出去,源IP是本地IP,源端口是22
iptables -L -n
iptables -P INPUT DROP改变防火墙的默认策略为DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p tcp -d 192.168.0.101 --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -s 192.168.0.101 --sport 80 -j ACCEPT
iptables -L -n
iptables -L -n --line-numbers
netstat -tnl 就算本地开启了很多服务,但只有22和80端口可以被访问到
service iptables save保存当前的设置或用iptables-save > /etc/sysconfig/iptables
对于作何一个服务器来说都少不了DNS解析请求,自己作为客户机
grep domain /etc/services 搜索域名服务的端口号
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT DNS解析回应,目标端口是53
iptables -A INPUT -p udp --sport 53 -j ACCEPT 请求DNS解析,源端口是53
检查客户机DNS服务器配置
more /etc/resolv.conf
host www.redhat.org.cn
如果这台服务器本身也是DNS服务器
iptables -A INPUT -p udp --dport 53 -j ACCEPT 接收来自别的机器的DNS解析请求
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT这台DNS服务器发送DNS解析回应
iptables -D INPUT 5删除在INPUT上的第5条规则
如果这台服务器也要连上其它服务器的SSH
到目前为止,在本机访问本机的服务给忽略
在本机上,有很多服务都守护在127.0.01上,所以我们要打开本地的回环设备
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
^IN^OUT命令替换功能
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
service iptables save
现在我们注意一下22端口
Chain INPUT (policy DROP)
1 ACCEPT tcp -- 0.0.0.0/0 192.168.0.101 tcp dpt:22
Chain OUTPUT (policy DROP)
1 ACCEPT tcp -- 192.168.0.101 0.0.0.0/0 tcp spt:22
所有进来的包都要通过22端口
所有出去的包都要通过22端口,但是如果由于系统漏洞或是病毒,从22端口主动送出包出去,而不是通过请求进来的包回应的,这时就会出现比较大的问题
所以我们要增加一条规则看这个包是不是别人请求我,我回应别人的
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -D OUTPUT 1删除第一条规则
iptables -n -L --line-numbers
Chain OUTPUT (policy DROP)
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22 state ESTABLISHED
针对80端口也是一样
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
service iptables save
作为客户机访问别人的SSH也是有问题的
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT从客户机发送出去的包,肯定被无条件接受
iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT接受别人的服务
器SSH回应如果有病毒,是主动发给本客机的,就出现问题了,这时加上必须是我请求过SSH服务数据包回应的
LOG目标
iptables -A INPUT -p tcp –dport 22 -j LOG –log-level 5 –log-prefix “IPTABLES”
编辑/etc/syslog.conf
注意:日志级别5要跟syslog.conf中的级别一致。级别可以通过syslog的manual帮助获得。
iptables -A INPUT -p tcp --dport 22 -j LOG --log-level 5 --log-prefix "iptable:"
vi /etc/rsyslog.conf
kern.=notice /var/log/firewall.log
这里为什么是notice?
man syslog查看消息的级别
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
在防火墙中我们定的级别是5,所以对应的内核是notice
iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -n -L –line-number
iptables -D INPUT 8
iptables -I INPUT 6 -p tcp --dport 22 -j LOG --log-level 5 --log-prefix "iptable:"
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -D INPUT 1 把前拥同样规则的移到日志后面
service iptables save
tail /var/log/firewall.log -f
NAT地址转换
http://www.netfilter.org/
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT允许本地互联网访问
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
光这样还不行,还要打开内核里的转发文件
more /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward
这时只能临时生效,若服务器重启,这个值又变成0
vi /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
service iptables save
此时我们还是不能用,因为局域网通过本机转发到互联网上,网络上的地址并不知道本地局域网的IP
所以我们要通过NAT
iptables -t nat -L -n
Netfilter的NAT表
内核空间---->PREROUTING---->ROUTING---->FORWARD---->POSTROUTING
SNAT发生在POSTROUTING
PREROUTING---->FORWARD---->POSTROUTING
destination: 11.22.33.1:22 destination: 11.22.33.1:22
source: 10.0.0.1:<port> source: 11.22.33.44:<port>
proto: tcp proto: tcp
本机地址:
eth0: 10.0.0.254
eth1: 11.22.33.44
SNAT应用
10.0.0.241 eth0:10.0.0.254 /eth1:192.168.0.254 192.168.0.1
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT –to-source 192.168.0.254
IP:10.0.0.241 getway: 10.0.0.254 subnet mask:255.255.255.0
ping 192.168.0.1若能ping通,说明访问成功
在实际的运用中
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE支持动态的翻译
回来时自动找到源IP
iptables -t nat -F
DNAT发生在PREROUTING
PREROUTING---->FORWARD---->POSTROUTING
destination: 11.22.33.44:22 destination: 10.0.0.1:22
source: 11.22.33.1:<port> source: 11.22.33.1:<port>
proto: tcp proto: tcp
本机地址:
eth0: 10.0.0.254
eth1: 11.22.33.44
DNAT应用
10.0.0.241 eth0:10.0.0.254 /eth1:192.168.0.254 192.168.0.1
iptables -t nat -A PREROUTING -d 10.0.0.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1
192.168.0.1这是一台实际的服务器,不让访问者10.0.0.241看到,访问者看到只是一个防火墙