iptables其实不是真正的防火墙,可以把它理解成一个客户端代理,通过这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架的名字叫做netfilter。 netfilter才是真正的安全框(frameword),netfilter位于内核空间。iptables其实就是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。 netfilter\iptables组成linux平台下的包过滤防火墙,与大多数linux软件一样,这个防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换等功能。
filter表:iptables中使用最广泛的表,作用是进行过滤,也是由filter表来决定一个数据包是否继续发往目的地址或者被拒绝。 filter表有三个链组成:INPUT–FORWARD–OUTPUT,INPUT(负责过滤进入主机的数据包),FORWARD(负责过滤转发的数据包),OUTPUT(负责过滤出站的数据包) nat表:用于望楼地址转换,可以改变数据包的源地址或者目标地址。 nat表由三个链组成:OUTPUT–PREROUTING–POSTROUTING,OUTPUT(负责过滤出站的数据包),PREROUTING(一般指的是发往公网的数据包),POSTROUTING(一般指来自公网的数据包) mangle表:用于修改IP的头部信息,如修改TTL。 mangle表由五个链组成:INPUT–FORWARD–OUTPUT–PREROUTING–POSTROUTING raw表:为iptables提供了一种不经过状态追踪的机制,在大流量对外业务的服务器上使用这个表,可以避免状态追踪带来的性能问题。
security表:提供在数据包中加入SELinux特性的功能。在实际应用中,security一般不常用。
CentOS默认的防火墙不是iptables,而是firewalle。 可以通过下面的命令检查是否安装了iptables
#查看iptables服务的状态 service iptables statusfirewalle的开启、停止与禁用命令
#停止firewalld systemctl stop firewalld #开启firewalld systemctl start firewalld #禁用firewalld systemctl mask firewalldfirewalld.service前面绿点表示服务正在运行,白点表示服务停止,红点表示服务出错
可以通过yum命令,安装iptables,安装完成后就可以根据需求进行防火墙的配置了。
#安装命令 yum –y install iptables yum update iptables yum –y install iptables-services #检测是否安装完成 systemctl status iptablesLinux区分大小写,大小写不同作用不同
参数说明-A添加一条规则INPUT链名PREROUTING链名OUTPUT链名-s指定源地址,可以是IP地址或网段。-s “空”表示所有-d目标地址-p指定协议–dport指定主机端口(本机开放或拒绝端口)–sport指定主机端口(如:禁止链接对方某端口)-i指定网卡名,表示报文流入的接口-o指定网卡名,表示报文流出的接口-j指定所需要的操作ACCEPT允许REJECT拒绝, 拒绝提供服务DROP拒绝,丢弃数据包不回应–src-range源地址范围–dsc-range目标地址的范围–mac-source源主机的mac地址-t指定表名,默认的是filter表-v查看详细信息-nvL–line-numbers 查看fliter表中规则的顺序-nvL-t mangle 查看mangle表中的防火墙规则-F清空fliter表-I指定链插入规则-R替换规则-m指定模块iptables -L -n :查看现有的规则 iptables -P INPUT ACCEPT:允许所有(在配置时,先允许) iptables -F:清空所有默认规则 iptables -X:清空所有自定义规则 iptables -Z:所有计数器归0 iptables -A INPUT -i lo -j ACCEPT:允许来自于lo接口的数据包(本地访问) iptables -A INPUT -p tcp --dport 22 -j ACCEPT:开放22端口(远程链接linux端口) iptables -A INPUT -p tcp --dport 21 -j ACCEPT:开放21端口(FTP端口) iptables -A INPUT -p tcp --dport 80 -j ACCEPT:开放80端口(HTTP端口) iptables -A INPUT -p tcp --dport 443 -j ACCEPT:开放443端口(HTTPS端口) iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT:允许ping iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT:允许接受本机请求之后的返回数据related,是为ftp设置的 iptables -P INPUT DROP:其他入站一律丢弃 iptables -P OUTPUT ACCEPT:所有出站都允许 iptables -P FORWARD DROP:所有转发一律丢弃 iptables -A INPUT -p tcp -s 45.96.174.68 -j ACCEPT:添加内网ip信息(接受所有TCP)请求 iptables -P INPUT DROP:过滤所有非以上规则的请求 iptables -I INPUT -s .***.***. -j ACCEPT:封停该ip iptables -D INPUT -s .***.***. -j DROP :解封该ip
通过直接修改配置文件 /esc/sysconfig/iptables 的方式进行修改使用。找到input、output等对应的表,并在下面添加规则指令。iptables -F:清除所有规则 iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1-j ACCEPT:允许某些调用localhost应用访问。 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT:允许其他地方ping iptables -A INPUT -p cmp --icmp-type fragmentation-needed -j ACCEPT :允许从其他主机/网络设备发送MTU调整报文 iptables -A INPUT -p tcp --dport 80 -j ACCEPT:开放80端口(HTTP端口) iptables -A INPUT -p tcp --dport 443 -j ACCEPT:开放443端口(HTTPS端口) iptables -A INPUT -p tcp -s 10.0.1.17 --dport 22 -j ACCEPT:仅允许内网10.0.1.17,通过tcp访问22端口。 iptables -A INPUT -p udp -s 10.0.1.17 --dport 161 -j ACCEPT:仅允许内网10.0.1.17,通过UDP访问161端口。 iptables -A INPUT -j DROP:禁止非开放白名单流量进入。 iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT:允许本机响应规则为01-08的数据包发出 iptables -A OUTPUT -j DROP:禁止本机主动发出外部链接,可以有效的防止类似“反弹shell”的攻击 iptables -A FORWARD -j DROP:禁止本机转发数据包
配置完成后,需要重启iptables服务,启动服务通过如下命令:
#注册iptables服务 systemctl enable iptables.service #开启服务 systenctl start iptables.service #查看状态 systemctl status iptables .service #重启防火墙 systemctl restart iptables.service网络地址转换,可以有效的减少直接部署公网IP地址的服务器数量,增强网络环境的完全性。 NAT (网络地址转换) 技术在平时是很多见的,如家庭中在使用路由器共享上网时,一般用的就是 NAT 技术,它可以实现众多内网 IP 共享一个公网 IP 上网。 NAT的原理:简单的说就是当内网主机访问外网时,当内网主机的数据包要通过路由器时,路由器将数据包中的源内网 IP 地址改为路由器上的公网 IP 地址,同时记录下该数据包的消息;当外网服务器响应这次由内而外发出的请求或数据交换时,当外网服务器发出的数据包经过路由器时,原本是路由器上的公网 IP 地址被路由器改为内网 IP 。
SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。 如果内网主机访问外网而经过路由时,源 IP 会发生改变,这种变更行为就是 SNAT。 当外网的数据经过路由发往内网主机时,数据包中的目的 IP (路由器上的公网 IP) 将修改为内网 IP,这种变更行为就是 DNAT 。
与 SNAT 和 DNAT所对应的两个链分别是 POSTROUTING和PREROUTING 。 通常内网到外网是pre,外网到内网是post,但是外还是内只是个相对概念,在一定条件下是可以转换的。落实到网卡上,对于每个网卡数据流入的时候必然经过pre,数量流出必然经过post POSTROUTING是源地址转换,要把你的内网地址转换成公网地址才能让你上网。 PREROUTING是目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器
PREROUTING
当外网的数据包进入到内网时,我们需要修改数据包中的公网 IP 为内网的主机 IP,这种 DNAT 的行为规则就要在 PREROUTING 链里添加。
POSTROUTING
和 PREROUTING 不同,在执行 SNAT 任务时的行为规则就添加在 POSTROUTING 链中。
代码实现方式
#源地址转换: #1.在Server B上指定其网络默认网关是Server A的内网地址(10.128.70.112) #2.在Server A上启动路由功能。 sysctl -w net.ipv4.ip_forward=1 #3.在Server A上设置iptables规则。 iptables -t filter -A FORWARD -j ACCEPT iptables -t nat -A POSTROUTING -o enth 0 -j SNAT -to 220.217.143.73 #通过上述三步操作,Server B将会通过Server A访问互联网,此时在互联网上看到的源地址是Server A的外网IP。 #目标地址转换: #目标地址转换用于外部用户直接访问无外网IP的服务器,例如:外部用户希望访问Server B上的MySQL数据库,端口3306,那么在Server A上可以进行如下配置: iptables -t nat -A PREROUTING -d 220.217.143.73 -p tcp -m tcp --dport 3306-j DNAT --to-destination 10.128.70.111:3306 iptables -t nat -A POSTROUTING -d 10.128.70.111 -p tcp -m tcp --dport 3306 -j DANT --to-source 10.128.70.112通过ldd命令来查看是否调用了libwrap 库
ldd /usr/sbin/sshd |grep libwarp cd /usr/sbin #无连接时配置、etc/hosts.allow 限制SSHD 的访问通过DenyHosts 下载安装
wegt ‘https://sourceforge.net/projects/denyhosts/files/denyhosts/2.6/DenyHosts-2.6.tar.gz/download’ -O DenyHosts-2.6.tar.gz下载完解压
tar zxvf DenyHosts-2.6.tar.gz解压后进入安装目录,通过Python对服务进行安装
cd DenyHosts-2.6 python setup.py install安装完后对目录进行配置
cd /usr/share/denyhosts列出文件后复制一下
cp daemon-control-dist daemon-control cp danyhosts.cfg-dist denyhosts.cfg创建连接并启动
ln daemon-control /etc/init.d /etc/init.d/daemon-control start