iptables/netfilter的网络防火墙

接上文继续讲解网络防火墙和nat功能的基础功能; 
网络防火墙的功能简单讲就是,所有经由本机的一个接口进来的报文在本地路由决策后路由的目标地址不是本机,需要帮忙转发到其它网络当中或来源网络中去的这种请求时的场景,我们就称为转发功能; 
那么转发的报文必须是经由forward链(含三个链,prerouting,forward,postrouting),不过过滤只能在forward实现; 
请注意:定义在forward链上的策略只对那些经由本机转发的报文才有效,进出本主机的报文没有任何效用; 
其它的我们就不多说了,上一些规则测试语句,想必都可以看得懂;

添加规则于FORWARD链,注意几个问题

(1) 请求和响应报文均会经由FORWARD链,要注意规则的方向性; 
    如:iptables -I FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT 
(2) 如果可以启用conntrack机制,注意网关主机所能够追踪的连接数的最大数量要符合需要;

如何使用iptables构建网络防火墙环境

1、环境构建并做相应服务应用测试 
主机1台,CentOS 7.2 构建模型为网关接口 
    NIC 01:172.16.5.40/16 外网主机地址; 
    NIC 02:192.168.22.1/24 内网主机地址; 
    ~]# cat /proc/sys/net/ipv4/ip_forward (这时转发功能未打开 );
主机1台,CentOS 7.2 搭建模型为内网主机客户端 
    IP:192.168.22.2/24; 
    Gateway:192.1.68.22.1; 
主机1台,CentOS 7.2 构建模型为外网主机客户端 
    IP:172.16.5.50/16;
在内网主机客户端安装测试环境; 
    ~]# yum install -y vsftpd httpd telnet-server samba 
测试ping 172.16.5.40能通,因为ip工作与内核只在本机未转发; 
可抓包看地址解析过程; 
    ~]# tcpdump -i eno16777736 -nn icmp 
开启转发后报文还是无法响应,最简单需在本机更改默认网关或添加路由; 
    ~]# route del -net 0.0.0.0 gw 172.16.5.1 
    ~]# route add default gw 172.16.5.40 
增加一个应用服务,并在外网客户端主机上去测试内网主机客户端能否访问; 
    ~]# systemctl start httpd 
    ~]# echo 192.168.22.2 > /var/www/html/index.html 
在外网主机客户端测试;
    ~]# curl 
http://192.168.22.2(通证明网络之间通信没问题) 
同理在外网客户端安装一个应用,并在内网主机做测试能连同网络之间连接正常; 

2、在网关上添加策略
 
先做个黑名单
    ~]# iptables -A FORWORAD -j DROP 
内网客户端测试; 
    ~]# curl 
http://192.168.22.2 
示例如下: 
放行由内而外访问任意外部服务 ;
    ~]# iptables -I FORWARD -s 192.168.22.0/24 -p tcp –dport 80 -j ACCEPT 
开放请求报文出去; 
    ~]# iptables -I FORWARD 2 -d 192.168.22.0/24 -p tcp –sport 80 -j ACCEPT 
放响应报文进来; 
注意: 因为我们做的是黑名单,任何能请求出去的响应报文都是安全的,为了避免规则越来越多,我们可以使用状态追踪机制; 
    ~]# iptables -D FORWARD 2 
添加一条规则,无论从内而外只要是响应报文都可正常允许进行; 
    ~]# iptables -I FORWARD -m state –state ESTABLISHED -j ACCEPT 
以后只要写请求策略就可以了; 
如:内网主机开放ssh连入到外网; 
    ~]# iptables -R FORWARD 2 -s 192.168.22.0/24 -p tcp -m multiport –dport 80,22,23,21 139,445 -m state –state new
         -j ACCEPT 
开放由内网主机去访问外网主机客户端的ftp服务; 
在网关主机上装载ftp状态追踪模块; 
    ~]# modprobe nf_conntrack_ftp,lsmod | grep nf_conntrack_ftp 
    ~]# iptables -R FORWARD 1 -m state –state established,related -j ACCEPT 
注意:一定要在写规则时别把自己挡在墙外面,可定义任务计划,20分钟策略失效 @指定iptables -F ;

NAT功能

NAT是什么我想不用我在这里嗷述,它的全称是(Network Address Translation即网络地址转换); 
它的出现减缓甚至代替了IP地址空间的枯竭; 
更详细的介绍可参考360百科或官方RFC 1632技术文档做参考;

**功能**

源地址转换:SNAT,仅能应用于POSTROUTING INPUT链 只考虑报文的前半段;
        静态转换:地址是固定的,动态转换:地址是随机的;    

目标地址转换:DNAT,仅能应用于PREROUTING OUTPUT链; 
       基于IP+端口转换,地址做转换,端口做判断;

MASQUERADE:地址伪装

REDIRECT: 端口映射

RETURN:返回,自定义链功能,基于地址池定义等

SNAT:源IP地址转换 
对于有Internet访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由Internet发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有IP地址了;
DNAT:目的IP地址转换 
1、发布内部服务器,让外面的internet用户能访问到内网的服务器; 
2、网络重定向;
    (摘自网络)

NAT的功能测试

实验的环境还是沿用之前的环境; 
多个示例袭来: 
所有来自内网中的主机请求都转发到外网中去(在网关中加入) ;
    ~]# iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -j SNAT –to-source 172.16.5.40
    ~]# iptables -t nat -vnL 
在外网主机客户端抓包看一下; 
    ~]# tcpdump -i eno16777736 -nn icmp (目标地址转换自动完成); 
所有来自于外网对公网地址上某一个端口的请求,统统都转发自内网中某一服务器上去; 
    ~]# iptables -t nat -A PREROUTING -d 172.16.5.40 -p tcp –dport 80 -j DNAT –to-destination 192.168.22.2 
    ~]# iptables -t nat -vnL 
外网主机客户端测试 curl 
http://172.16.5.40;
    ~]# iptables -t nat -A PREROUTING -d 172.16.5.40 -j DNAT –to-destination 192.168.22.2:80 
任意端口任意地址; 
端口映射httpd 8080; 
    ~]# iptables -t nat -A PREROUTING -d 172.16.5.40 -p tcp –dport 80 -j DNAT –to-destination 192.168.22.2:8080 
    ~]# iptables -t nat PREROUTING 2 -d 172.16.5.40 -p tcp –dport 22022 -j DNAT –to-destination 192.168.22.3:22 
在外网主机客户端测试; 
~]# ssh -p 22022 [email protected]

自定义链、RETURN

自定义链:需被引用; 
    ~]# iptables -A web_in -d 192.168.22.0/24 -p tcp –dport 80 -m state --state NEW-j ACCEPT 
    ~]# iptables -A FORWARD -j REJECT 
在默认规则前调用上面的规则; 
    ~]# iptables -I FORWARD 2 -d 192.168.22.0/24 -p tcp –dport 80 -j web_in 
    ~]# iptables -A web_in -j RETURN 
注意:自定义链无法被删除,需清除链规则后在删除;
    ~]# iptables -F web_in 
    ~]# iptables -X web_in
其它未讲的可自行参考Linux内核编译系列丛书和最大的***指导性网站Google;

done