在iptables上实现网络防火墙
前言
?? 关于防火墙的相关概念,我们在之前的文章中已经进行了相关的介绍,这里就不再重复。感兴趣的朋友可以移步
?? 初识Linux防火墙
?? 今天重点记录一下,如何使用iptables来搭建网络防火墙,实现控制访问。
?? 如果要实现网络防火墙,至少需要三台主机A,B,C,B用来搭建网络防火墙,A来模拟局域网内主机,C模拟网络客户端。
?? 根据我们之前四表五链的介绍,我们知道,作为网络防火墙的主机B还要充当网关的角色,使用filter表的FORWARD链。
?? 实验拓扑如下图所示。
?? 这里有一点需要注意,192.168 网段和172.18网段在实际生产中都属于私有地址,只不过,在我这里172.18网段可以实现链接互联网,所以这里我们模拟了了实验环境,请注意不要产生误解。
设置网关?? 主机B虽然担任的是防火墙的角色,但是它还需要把主机A和主机C的数据包进行转发和传输,所以主机主机A和主机C还需要配置一下网关,指向主机B分别链接在内网和外网的两个IP地址。
?? 下面为主机A和主机C添加两个路由。
# 给主机A添加一个默认的网关地址,指向192.168.2.77 route add default gw 192.168.2.77 # 给主机C添加一条默认的网关地址,指向172.18.2.77 route add default gw 172.18.2.77清空主机的防火墙策略,开启主机B的转发功能,关闭SELinux
?? 为了避免对实验环境的影响,首先对三台主机清空防火墙策略。
# 查看目前filter表是否具有防火墙策略 iptables -vnL # 清除filter表的防火墙策略 iptables -F
?? 因为主机B要兼职转发功能,所以要开启主机B的转发功能。
# 开启主机B的转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward
??最后关闭三台主机的SELinux策略。
?? 实验环境准备好之后,可以从主机A ping 到主机C 。如下图所示。
??下面我们开始在主机B上模拟建立防火墙的过滤规则。
允许局域网ping通外网,不允许外网ping局域网?? 我们的目标是只能内网ping通外网,但是不允许外网ping通内部主机,这样的话,我们应该如何操作?
~]#iptables -A FORWARD -s 192.168.2.0/24 -d 172.18.0.0/16 -p icmp --icmp-type 8 -j ACCEPT ~]#iptables -A FORWARD -s 172.18.0.0/16 -d 192.168.2.0/24 -p icmp --icmp-type 0 -j ACCEPT ~]#iptables -A FORWARD -j REJECT # 查看一下建立好的防火墙策略 ~]#iptables -vnL Chain INPUT (policy ACCEPT 72 packets, 7907 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT icmp -- * * 192.168.2.0/24 172.18.0.0/16 icmptype 8 0 0 ACCEPT icmp -- * * 172.18.0.0/16 192.168.2.0/24 icmptype 0 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT 23 packets, 2060 bytes) pkts bytes target prot opt in out source destination
这里解释一下,有两种状态码,分别表示请求和应答。
0/0 echo-reply icmp应答 8/0 echo-request icmp请求?? 第二种方法,我们可以通过状态链接的方式来定义防火墙规则。我们允许从内部网络发出的,凡是ESTABLISHED状态的包,通过防火墙。
# 凡是已经建立的链接都允许通过防火墙 ~]#iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT # 凡是符合源地址为192.168.2的网段 ,目的地址为172.18网段的icmp数据包都允许通过防火墙 ~]#iptables -A FORWARD -s 192.168.2.0/24 -d 172.18.0.0/16 -p icmp --icmp-type 8 -j ACCEPT # 凡是符合源地址为192.168.2的网段 ,目的地址为172.18网段的icmp数据包都允许通过防火墙 # 下面这条命令也同样可行,与上面的命令使用其中一个就可以 # iptables -A FORWARD -s 192.168.2.0/24 -d 172.18.0.0/16 -p icmp -m state --state NEW 8 -j ACCEPT # 其余的协议都拒绝 ~]#iptables -A FORWARD -j REJECT内部主机可以访问互联网上特定服务如httpd服务,SSH服务,ftp服务,但是外网不能访问内网的服务
?? 只是禁用ping 命令话,在实际生产中的作用并不是很大。但是如果我们想让内网的主机能够访问互联网上的特殊服务,而不允许外网的主机访问内网应该如何去做。
# 源地址为内网网段的允许经过防火墙 ~]#iptables -A FORWARD -s 192.168.2.0/24 -p tcp -m multiport --dports 21:22,80 -j ACCEPT # 目的地址为内网地址的允许经过防火墙 ~]#iptables -A FORWARD -d 192.168.2.0/24 -p tcp -m multiport --sports 22,80,21 -j ACCEPT # 其余的全部拒绝 ~]#iptables -A FORWARD -j REJECT # 查看一下定义好的防火墙策略 ~]#iptables -vnL Chain INPUT (policy ACCEPT 60 packets, 6088 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 6 492 ACCEPT tcp -- * * 192.168.2.0/24 0.0.0.0/0 multiport dports 21:22,80 4 471 ACCEPT tcp -- * * 0.0.0.0/0 192.168.2.0/24 multiport sports 22,80,21 10 816 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT 27 packets, 2604 bytes) pkts bytes target prot opt in out source destination
?? 现在内网的主机已经能够顺利的访问外网的主机,而且外网的主机不能够对内网的主机进行访问了。
?? 但是现在又有了新的问题,ftp虽然能够链接到外网的服务,但是ftp却不能访问ftp服务器上的内容,这说明外网的数据不能够通过防火墙返回到内网的主机,所以我们的防火墙策略还要进行一定的修改。也就是说,要允许已经建立链接的,和相关的请求数据,返回时能够通过防火墙。
?? 为此,我们在防火墙策略中,重新插入下面这样一条策略。
# 加载额外的模块 ~]#modprobe nf_conntrack_ftp # 源地址为内网网段的允许经过防火墙 ~]#iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # 查看一下当前的防火墙策略 ~]#iptables -vnL Chain INPUT (policy ACCEPT 69 packets, 5364 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 26 1692 ACCEPT tcp -- * * 192.168.2.0/24 0.0.0.0/0 multiport dports 22,80 4 471 ACCEPT tcp -- * * 0.0.0.0/0 192.168.2.0/24 multiport sports 22,80 373 31092 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT 31 packets, 2940 bytes) pkts bytes target prot opt in out source destination
?? 如果我们使用了状态策略的话,第三条规则已经没有多大必要的了,因为已经包含在状态中了。所以实际生产中,通常建议将状态链接写在第一条,这样可以省略很大的工作量。
?? 还有一点需要注意,如果是扩展的匹配条件,需要加载额外的扩展模块(/usr/lib64/xtables/*.so),方可生效,关于额外的扩展模块可以 man 8 iptables-extensions 来查看。
经过上面的这些操作,我们就实现了一个具有路由功能的网络防火墙,但是,这个防火墙的功能还仅仅限于网络协议的控制和防护,这在实际生产中还远远不够,我们会在后续继续介绍关于网络防火墙的相关知识,欢迎关注。
下一篇: FTP服务:网络共享