1、黑白名单
当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是"黑名单"机制。
当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是"白名单"机制。
如果使用白名单机制,我们就要把所有人都当做坏人,只放行好人。如果使用黑名单机制,我们就要把所有人都当成好人,只拒绝坏人。白名单机制似乎更加安全一些,黑名单机制似乎更加灵活一些。
白名单机制设置技巧:默认策略设置为ACCEPT,先将放行规则放在前面,最后插入一条拒绝所有报文的规则。不是将默认策略设置为DROP,否则管理员都登录不进去。
eg:
iptables -P INPUT ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j REJECT
2、自定义链
自定义一条链,链名叫IN_WEB,我们可以将所有针对80端口的入站规则都写入到这条自定义链中,当以后想要修改针对web服务的入站规则时,就直接修改IN_WEB链中的规则就好了;
同理,可以将针对sshd的出站规则放入到OUT_SSH自定义链中,将针对Nginx的入站规则放入到IN_NGINX自定义链中,这样,我们就能想改哪里改哪里,再也不同担心找不到规则在哪里了。
(1)新建
#新建名字为IN_WEB的自定义链
iptables -t filter -N IN_WEB
(2)引用
让自定义链生效,需要用默认链引用自定义链,-j后面不是动作而是自定义链
eg:
iptables -I INPUT -p tcp --dport 80 -j IN_WEB
(3)修改
#将自定义链IN_WEB名字改为WEB
iptables -E IN_WEB WEB
(4)删除
#删除自定义链WEB
iptables -X IN_WEB WEB
删除自定义链要满足两个条件:
(4.1)自定义链没有被任何默认链引用,即自定义链的引用计数为0,否则报错:Too many links
eg:iptables -D INPUT 1
(4.2)自定义链中没有任何规则,即自定义链为空,否则报错:Directory not empty
eg:iptables -t filter -F WEB
3、网络防火墙
防火墙从逻辑上讲,可以分为主机防火墙与网络防火墙。
主机防火墙:针对于单个主机进行防护,起作用的是INPUT链与OUTPUT链;
网络防火墙: 往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
网络防火墙的职责就是"过滤并转发",要想"过滤",只能在INPUT、OUTPUT、FORWARD三条链中实现,要想"转发",报文则只会经过FORWARD链(发往本机的报文才会经过INPUT链),所以,iptables的角色变为"网络防火墙"时,规则只能定义在FORWARD链中。
上图中,橘黄色主机为iptables所在主机,iptables充当网络防火墙的角色,浅蓝色圆形表示网络防火墙所防护的网络区域,圆形内的蓝色矩形表示网络内的主机。
当外部网络中的主机与网络内部主机通讯时,不管是由外部主机发往内部主机的报文,还是由内部主机发往外部主机的报文,都需要经过iptables所在的主机,由iptables所在的主机进行"过滤并转发",所以,防火墙主机的主要工作就是"过滤并转发"。
网络防火墙设置
(1)开启网络防火墙的转发功能
#如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文。
#使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启
cat /proc/sys/net/ipv4/ip_forward
#使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。
方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
方法二:sysctl -w net.ipv4.ip_forward=1
#使用如下方法开启核心转发功能,重启网络服务后永久生效。
配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1
(2)配置防火墙FORWAED链规则
#示例为允许网络内主机访问网络外主机的web服务与sshd服务。
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT
#可以使用state扩展模块,对上述规则进行优化,使用如下配置可以省略许多"回应报文放行规则"。
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
4、常用动作
4.1 REJECT
使用--reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝。
icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable(默认值)
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-pro-hibited
icmp-admin-prohibited
eg:
iptables -I INPUT 2 -j REJECT --reject-with icmp-host-unreachable
4.2 LOG
使用LOG动作,可以将符合条件的报文的相关信息记录到日志中,默认记录到/var/log/messages
修改日志文件:/etc/rsyslog.conf文件(或者/etc/syslog.conf),在rsyslog配置文件中添加如下配置即可,然后重启:
#vim /etc/rsyslog.conf
kern.warning /var/log/iptables.log
#service rsyslog restart
--log-level选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。
--log-prefix选项可以给记录到的相关信息添加"标签"之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。
注:--log-prefix对应的值不能超过29个字符。
4.3 SNAT
网络内部的主机可借助SNAT隐藏自己的IP地址,同时还能够共享合法的公网IP,让局域网内的多台主机共享公网IP访问互联网。
eg:
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
将10.1.0.0/16网段的报文的源地址改为公司的公网IP地址。
-t nat表示操作nat表,filter表的功能是过滤,nat表的功能就是地址转换,所以我们需要在nat表中定义nat规则。
-A POSTROUTING表示将SNAT规则添加到POSTROUTING链的末尾,在centos7中,SNAT规则只能存在于POSTROUTING链与INPUT链中,在centos6中,SNAT规则只能存在于POSTROUTING链中。
-j SNAT表示使用SNAT动作,对匹配到的报文进行处理,对匹配到的报文进行源地址转换。
--to-source 192.168.1.146"表示将匹配到的报文的源IP修改为192.168.1.146,"--to-source"就是SNAT动作的常用选项,用于指定SNAT需要将报文的源IP修改为哪个IP地址。
4.4 DNAT
利用DNAT,将公网客户端发送过来的报文的目标地址与端口号做了映射,将访问web服务的报文转发到了内网中的C主机中,将访问远程桌面的报文转发到了内网中的D主机中。
eg:
iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389
-j DNAT --to-destination 10.1.0.6:3389表示将符合条件的报文进行DNAT,也就是目标地址转换,将符合条件的报文的目标地址与目标端口修改为10.1.0.6:3389
--to-destination就是动作DNAT的常用选项。
4.5 MASQUERADE
MASQUERADE理解为动态的、自动化的SNAT.
当拨号网上时,每次分配的IP地址往往不同,不会长期分给我们一个固定的IP地址,如果这时,我们想要让内网主机共享公网IP上网,就会很麻烦,因为每次IP地址发生变化以后,我们都要重新配置SNAT规则,通过MASQUERADE动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址
eg:
iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eno50332184 -j MASQUERADE
4.6 REDIRECT
使用REDIRECT动作可以在本机上进行端口映射,只能定义在PREROUTING链或者OUTPUT链中。
eg:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
当别的机器访问本机的80端口时,报文会被重定向到本机的8080端口上。
参考: