企业中用硬件防火墙的场景是大多数,但有时候也还是会用到iptables,所以做为运维工程师,使用iptables的做主机防火墙和网络防火墙的规则写法还是需要掌握的,废话不多说,直接来干货。


主机防火墙规则


修改默认入站出站策略为删除数据(修改时慎重考虑)

iptables -P INPUT DROP  //删除所有入站数据

iptables -P OUTPUT DROP //删除所有出站数据


如果是远程连接到服务器上进行防火墙的修改操作时,可能会涉及清空防火墙的操作,如果直接修改了默认策略为删除一切入站出站数据,一不小心来一条清空所有规则,此时的远程连接也就立即被阻止了,所以即便是想设置成最严格的白名单模式,最好是在默认情况下清空所有规则后先把xhell的放行规则写好之后,在其后面添加一条所有入站及出站数据都做删除处理的默认规则,即便不小心清除所有规则后,也不会出现远程连接都被阻止的严重后果,因为默认策略所有的入站出站数据都是被放行的。


开放x-shell连接端口

iptables -A INPUT -s Client-IP -d Server-IP -p tcp --dport 22 -j ACCEPT  //放行x-shell入站数据

iptables -A OUTPUT -s Server-IP -d Client-IP -p tcp --sport 22 -j ACCEPT //放行x-shell出站数据

iptables -A INPUT -j DROP

iptables -A OUTPUT -j DROP


默认出站数据最好设置为放行已建立的连接,这样一来就不用单独放行每一条允许入站的数据的出站动作了

iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT


开放自己使用ping探测别人

iptables -A INPUT -p icmp --icmp-type 0/0 -j ACCEPT  //放行ping响应入站

iptables -A OUTPUT -p icmp --icmp-type 8/0 -j ACCEPT //放行ping请求出站


开放别人使用ping探测自己

iptables -A INPUT -p icmp --icmp-type 8/0 -j ACCEPT  //放行ping请求入站

iptabels -A OUTPUT -p icmp --icmp-type 0/0 -j ACCEPT //放行ping响应出站


开放回环检测

iptables -A INPUT -i lo -p icmp -j ACCEPT


开放http连接端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT


开放https连接端口

iptables -A INPUT -p tcp --dport 443 -j ACCEPT


http、https连接端口合并

iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT


开放mysql连接端口

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT


开放fastcgi连接端口

iptables -A INPUT -p tcp --dport 9000 -j ACCEPT


开放samba连接端口

iptables -A INPUT -p tcp multiport --dports 139,445 -j ACCEPT  //开放samba主服务端口

iptables -A INPUT -p udp multiport --dports 137,138 -j ACCEPT  //开放samba名称解析端口


开放ftp连接端口

iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT  //开放ftp服务端口

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  //开放相关、已建立的连接


开放nfs连接端口

首先到/etc/sysconfig/nfs文件中锁定端口

RQUOTAD_PORT=10001

LOCKD_TCPPORT=10002

LOCKD_UDPPORT=10002

MOUNTD_PORT=10003

STATD_PORT=10004

再开放锁定的多端口

iptables -A INPUT -p tcp multiport --dports 111,2049,10001:10004 -j ACCEPT

iptables -A INPUT -p udp multiport --dports 111,2049,10001:10004 -j ACCEPT


开放dns连接端口

iptables -A INPUT -p tcp --dport 53 -j ACCEPT  //开放区域传送端口

iptables -A INPUT -p udp --dport 53 -j ACCEPT  //开放解析查询端口


注意:测试防火墙的规则时可以先写一个计划任务(20分钟后清空防火墙规则)


网络防火墙规则


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

(1) 请求和响应报文均会经由FORWARD链,要注意规则的方向性;

第一条:iptables -I FORWARD  -m state --state ESTABLISHED,RELATED -j ACCEPT

(2) 如果没有类似ftp的服务,状态中可以不用RELATED选项,如果有FTP服务,需要在网关上启用ftp连接追踪模块(nf_conntrack_ftp)

(3) 如果启用了连接追踪(conntrack)机制,注意网关主机所能够追踪的连接数的最大数量要符合需要,以免过多的连接被拒绝


参考规则写法:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -s 192.168.1.0/24 -p tcp -m multiport --dports 22,21,23,80,443,139,445 -m state --state NEW -j ACCEPT

iptables -A FORWARD -j DROP


iptables DNAT SNAT写法


web服务器的常用映射规则


iptables -t nat -I PREROUTING -p tcp -d 10.0.0.10 --dport 80 -j DNAT --to-destination 192.168.10.254:80

将所有目标地址为防火墙的外网地址10.0.0.10,目标端口为80的数据包修改目标地址为内网服务器的192.168.10.50,目标端口为80后进行转发


iptables -t nat -I POSTROUTING -p tcp -s 192.168.10.254 --sport 80 -j SNAT --to-source 10.0.0.10:80

将所有源地址为内网服务器192.168.10.254,源端口为80的数据包统一修改为防火墙的出口地址10.0.0.10,端口为80后进行转发


ssh服务的常用映射规则


iptables -t nat -I PREROUTING -p tcp -d 10.0.0.10 --dport 1024 -j DNAT --to-destination 192.168.10.254:22

将所有目标地址为防火墙的外网地址10.0.0.10,目标端口为1024的数据包修改目标地址为内网服务器的192.168.10.254,目标端口为22后进行转发


iptables -t nat -I POSTROUTING -p tcp -s 192.168.10.254 --sport 22 -j SNAT --to-source 10.0.0.10:1024

将所有源地址为内网服务器192.168.10.254,源端口为22的数据包统一修改为防火墙的出口地址10.0.0.10,端口为1024后进行转发


前面一部分是主机防火墙需要用到的规则写法,后台一部分是网络防火墙的规则写法,当然本文只是抛砖引玉,更多场景及用法请举一反三!