防火墙搭建及NET机制

来源:互联网 发布:快乐大本营知乎 编辑:程序博客网 时间:2024/06/17 14:10

(五)防火墙规则书写注意点小结(掌握)


  • 书写规则时的几个注意点
1)匹配规则越严格的需要放在越上面,越松散的放在越下面
2)规则的检查次序:规则在链上的次序即为检查时生效的次序,因此,其优化使用有一定的法则
1:同类规则(访问同一个应用),匹配范围小的放在前面,用于特殊处理
2:不同类的规则(访问不同的应用),匹配范围大的放在前面,也就是规则被报文匹配次数多的放在前面
3:应该将那些由一条规则描述的多个规则合并为一个规则,这样使得规则查询的效率提高
  • 防火墙规则优化实战示例
1:开放ssh、web、telnet服务
# 由于 ESTABLISHED会经常被访问,因此写在第一个
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# 特定的服务开放
iptables -A INPUT -d 192.168.10.222 -p tcp -m multiport --dports 22,80,23 -m state --state NEW -j ACCEPT
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
# 所有的入栈报文,出栈全部被允许
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
2:开放ftp、ssh、web、telnet服务
思考:对于ftp服务来说,有两个端口,2021,如果想使用RELATED关联追踪,应该让内核加载nf_conntrack_ftp模块
# 内核加载nf_conntrack_ftp模块
modprobe nf_conntrack_ftp
# 放行了ftp协议的数据连接的端口,由于端口是随机的,所以不要给定端口号,并且指明连接追踪是related和established
iptables -A INPUT -d 192.168.10.222 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 特定的服务开放
iptalbes -A INPUT -d 192.168.10.222 -p tcp -m miltiport --dports 22,23,80,21 -m state --state NEW -j ACCEPT
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
# 所有的入栈报文,出栈全部被允许
iptables -A OUTPUT -s 192.168.10.222 -m state --state ESTABLISHED -j ACCEPT

(六)如何保存写好的防火墙规则(掌握)


  • 保存规则的方法
CentOS 6
1)service iptables save
2)iptables-save > /etc/sysconfig/iptables (也可以重定向保存至任意位置)
CentOS 7
1)iptables -S > 指定保存规则的文件路径
2)iptables-save > 指定保存规则的文件路径
  • 让内核加载写好的规则
CentOS 6和CentOS 7
iptables-restore < 指定保存规则的文件路径
CentOS 6:会自动从/etc/sysconfig/iptables重载规则
service iptables restart
  • 如果自动生效规则文件中的规则
1)把iptables命令放在脚本文件中,让脚本文件开机自动运行
/etc/rc.d/rc.local 中写入执行iptables的命令的脚本
2)将保存的规则通过脚本命令自动开机重载
/etc/rc.d/rc.local 中 写入 iptables-restore < 指定保存规则的文件路径

(七)如何搭建网络防火墙(掌握)


Alt text

(八)另外几个规则处理动作(了解)


  • LOG
--log-level level :设定日志级别
emerg, alert, crit, error, warning, notice, info or debug.
--log-prefix prefix :添加日志行前缀
例如:iptables -I FORWARD -s 192.168.23.0/24 -p tcp -m multiport --dports 80,22,21,23 -m state --state NEW -j LOG --log-prefix "firewall connection:"
开启日志功能,并且制定日志行的前缀
日志记录的文件为/var/log/messages 内核日志
  • RETURN
返回调用者:很多时候都可以不用写明,其会隐含的
应用场景:就是内置链调用外链的时候,外链没有匹配到规则会直接返回
例如:
iptables -N in_stack
iptables -N out_stack
iptables -A in_stack -p icmp --icmp-type 8 -j ACCEPT
iptables -A out_stack -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -j in_stack
iptables -A OUTPUT -j out_stack
其他主机ping下本主机
  • REDIRECT
这个只能用在nat表上的PREROUTING和OUTPUT链上,能够实现指明的端口完成映射
--to-ports port[-port]:将端口转变为其他的端口
例如:iptables -t nat -A PREROUTING -d 192.168.10.223 -p tcp --dport 80 -j REDIRECT --to-ports 8000 这里将prerouting链上的80端口转发为8080端口,使得监听在8000的httpd服务可以监听到,这就是一个简单的引用场景

(九)NAT(掌握)

前言1:通过路由功能使得报文在非本地局域网内通信时,报文到达时,显示的是报文的原始IP地址。在正常路由模型下,报文外封装一个http首部,再封装一个TCP首部(主要是源端口和目标端口),再封装一个IP首部(主要是源IP和目标IP),如果需要路由转发,会在外面封装一个Mac地址(源Mac和目标Mac),那么整个路由的过程就是一个Mac地址解封装的过程,知道最后一个目标Mac的主机,发现目标IP是自己,目标端口也是自己,因此,拆包之后,源端口和目标端口以及源IP和目标IP都不变,这就是路由的地址转换模型
前言2 :整个互联网就是通过一个一个的公网地址组成的局域网通过层层路由器连接而成的,那么一个私网的IP访问公网的IP时,可以通过层层的路由器到达公网的IP上,一定会有网关将其转发到公网上的,其网关一定有一个接口是公网地址,但是公网的IP响应私网的IP是不会进行公网的路由的,公网IP只会其内部的局域网寻找这台私网的IP主机,如果找不到就会丢弃的,那么私网的客户端就无法获得公网响应的报文。那么如果解决这个问题呢?由于私网IP的网关一定有一个接口是公网地址,那么在离公网最近的网关上把报文的原地址改为公网接口的地址,而目标地址不变,因此在目标主机收到报文的时候发现原地址是公网地址,因此可以通过路由转发出去,目标IP就会响应给公网地址,而不会私网地址,在响应报文到达公网地址的时候(进入公网的网关)会将响应报文里面的目标地址改为私网的地址,原地址不变,响应给私网地址。这就实现了私网地址可以访问公网了,这就是SNAT,原地址转换
前言3:如果客户端请求访问的是本地的服务器,那么在客户端与本地服务器之间需要通过目标地址转换,来隐藏本地服务器地址,当客户端访问本地主机的时候,并不是直接访问本地主机的,请求报文中的源IP为客户端IP,目标IP为一个公网的IP,这个公网IP的主机上还会有一个私网的IP,私网的IP就通过nat机制,将目标地址改为了服务器的IP地址。那么当服务器接到请求之后,就会将响应报文的原地址为服务器自己的地址,目标地址为外网防火墙主机的地址,当报文到达公网的网关后,网关就会发现这是改过的地址,将报文的原地址改为网关自己的地址,目标地址为客户端地址,就是现实了本地主机的地址的隐藏,那么这一台公网地址转发的服务器就是负载均衡器,这就是DNAT,目标地址转换

Alt text

  • SNAT:source NAT
修改IP报文中的源IP地址
让本地网络中的主机可以使用同一的地址与外部通信,从而实现地址伪装
请求:由内网主机发起,修改源IP,如何修改由管理员定义
响应:修改目标IP,由nat自动根据会话表中的追踪机制实现相应的修改
  • DNAT:destination NAT
修改IP报文中的目标IP地址
让本地网络中的服务器使用统一的地址向外提供服务,但是隐藏了自己的真实地址
请求:由外网主机发起,管理员负责修改其目标地址
响应:修改原地址,由nat自动根据会话表中的追踪机制实现相应的修改
PNAT:port NAT
现实端口转发
  • 实现SNAT规则
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
--to-source [ipaddr[-ipaddr]][:port[-port]] :指定修改的源IP(外网IP地址)
例如:这里指明了经过路由之后的源IP地址
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 0/0 -j SNAT --to-source 192.168.10.222
  • 实现MASQUERADE
This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: 当外网地址是拨号上网的时候,外网地址持续变化,用户替换的时候,用于替换SNAT,因此, SNAT只用于静态IP
例如:如果用户外网地址是动态的,可以使用MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE

小结:SNAT和MASQUERADE都是实现了内网的客户端可以上网,访问公网的主机,如果关闭的话,内网客户端的请求到达了公网IP也不会被路由回来了,因为公网的路由不会转发目标地址是私网的报文


  • 实现DNAT规则
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]] : 指定需要改变的目标IP(内网IP地址)
例如:
iptables -t nat -A PREROUTING -s 0/0 -d 192.168.10.222 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22
或者修改IP和端口:
iptables -t nat -A PREROUTING -s 0/0 -d 192.168.10.222 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
原创粉丝点击