编写iptables脚本实现IP地址、端口过滤
案例需求
Benet公司使用一台运行RHEL5系统的服务器作为网关,分别连接三个网络,其中LAN1为普通员工电脑所在的局域网,LAN2为DNS缓存等服务器所在的局域网。eth0通过10M光纤接入Internet。为了有效地管理网络环境及加强内部网络的安全性,需要配置iptables防火墙规则实现基于IP地址和端口的过滤控制。
拓扑环境
使用VM Workstation Linux三台(一台做iptables网关服务器,一台做LAN1计算机,一台虚拟机做DNS缓存服务器)真实机模拟Internet远程管理工作站,网关服务器三张网卡,依次设置网卡为vmnet0、wmnet1、vmnet2,LAN1接入vmnet1、LAN2接入vmnet2.Internet使用vmnet0模拟
需求描述
入站控制:
允许从Internet访问本机的21、25、80、110、143端口
允许从主机 192.168.1.106访问本机的22端口(远程登录服务),每15分钟记录一次日志
允许从主机 192.168.10.2(MAC地址为00:0C:27:30:4E:5D)访问网关的22端口
允许局域网主机(LAN1:192.168.10.0/24)访问本机的3128端口(代理服务)
转发控制:
允许LAN1的主机访问位于LAN2的DNS服务器(192.168.20.2)
本机出站的数据包均允许
其他未经明确许可的入站数据包,均予以丢弃;
将以上各条防火墙策略,整理为Shell脚本文件;注意如下内容:
开启路由转发;预先定义网卡、局域网、各接口IP地址等变量;注意各条规则的顺序关系
注意:在网关服务器上设置SNAT转换和FORWARD允许转发才可以访问互联网
如果设置默认丢弃的话,需要手动添加相应网段,才可以访问互联网
实现思路
一、针对实验需求,分别编写iptables规则并进行测试
1.入站控制
允许从Internet访问本机的21、25、80、110、143端口
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 21,25,80,110,143 -j ACCEPT
允许从主机 192.168.1.106 访问本机的22端口,每15分钟记录一次日志
[root@localhost ~]# iptables -A INPUT -s 192.168.1.106 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -s 192.168.1.106 -p tcp --dport 22 -m limit --limit 4/hour -j LOG
允许从主机 192.168.10.2(MAC地址为00:0C:27:30:4E:5D)访问网关的22端口
[root@localhost ~]# iptables -I INPUT -i eth1 -s 192.168.10.2 -m mac --mac-source 00:0C:27:30:4E:5D -p tcp --dport 22 -j ACCEPT
允许局域网主机(LAN1:192.168.10.0/24)访问本机的3128端口(代理服务)
[root@localhost ~]# iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 3128 -j ACCEPT
2.转发控制
允许LAN1的主机访问位于LAN2的DNS服务器(192.168.20.2)
[root@localhost ~]# iptables -A FORWARD -s 192.168.10.0/24 -d 192.168.20.2 -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -s 192.168.20.2 -d 192.168.10.0/24 -p udp --sport 53 -j ACCEPT
二、filter表INPUT、FORWARD链的缺省策略设为DROP,OUTPUT链设为允许
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P FORWARD ACCEPT
[root@localhost ~]# iptables -P OUTPUT ACCEPT
三、将上述各规则整理为防火墙脚本
[root@localhost ~]# vim /opt/iptables.sh
#!/bin/bash
#IPTABLES
#----------------定义网段、网卡、IP地址等变量---------------#
INET_IP="192.168.1.254"
INET_IF="eth0"
LAN1_IP="192.168.10.1"
LAN1_IF="eth1"
LAN2_IP="192.168.20.1"
LAN2_IF="eth2"
LAN1_NW="192.168.10.0/24"
LAN2_NW="192.168.20.0/24"
SSH_INET="192.168.1.106"
SSH_LAN1_IP="192.168.10.2"
SSH_LAN1_MAC="00:0C:27:30:4E:5D"
DNS_CS="192.168.20.2"
#----------------加载包过滤相关的内核模块-------------------#
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_raw
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_iprange
/sbin/modprobe xt_tcpudp
/sbin/modprobe xt_state
/sbin/modprobe xt_multiport
/sbin/modprobe xt_mac
/sbin/modprobe xt_limit
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
#----------------开启路由转发功能---------------------------#
/sbin/sysctl -w net.ipv4.ip_forward=1 &> /dev/null
/sbin/sysctl -p &> /dev/null
#----------------设置iptables规则---------------------------#
/sbin/iptables -X
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -X
/sbin/iptables -t raw -X
/sbin/iptables –F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -t raw -F
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -A INPUT -p tcp -m multiport --dport 21,25,80,110,143 -j ACCEPT
/sbin/iptables -A INPUT -s $SSH_INET -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -s $SSH_INET -p tcp --dport 22 -m limit --limit 4/hour -j LOG
/sbin/iptables -A INPUT -i $LAN1_IF -s $SSH_LAN1_IP -m mac --mac-source $SSH_LAN1_MAC -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -s $LAN1_NW -p tcp --dport 3128 -j ACCEPT
/sbin/iptables -A FORWARD -s $LAN1_NW -d $DNS_CS -p udp --dport 53 -j ACCEPT
/sbin/iptables -A FORWARD -s $DNS_CS -d $LAN1_NW -p udp --sport 53 -j ACCEPT
[root@localhost ~]# chmod +x /opt/iptables.sh
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables //将规则导入配置文件
[root@localhost ~]# service iptables restart
[root@localhost ~]# chkconfig iptables on
四、测试
1.允许从主机 192.168.1.106 访问本机的22端口
2.允许从主机 192.168.10.2(MAC地址为00:0C:27:30:4E:5D)访问网关的22端口
3.允许LAN1的主机通过缓存服务器192.168.20.2 访问互联网