使用iptables构建安全防护盾
一、什么是iptables,常用人员有哪些?
iptables是常见于Linux系统下的应用层防火墙工具,是Linux内核集成的IP信息包过滤系统。如果linux系统连接到因特网或LAN、服务器或连接LAN和因特网的代理服务器,则系统有利于在linux系统上更好地控制IP信息包过滤和防火墙配置。
常用人员:系统管理人员、网络工程人员,安全人员
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
二、压力测试小试验:
目标机器:192.168.1.51 开启HTTP服务
service httpd start # 开启http服务
iptables -F # 清除规则
netstat -an |grep 80 |grep 192.168.1.190 |grep EST -c # 查看并发数
w # 查看
iptables -I INPUT -p tcp --dport 80 -s 192.168.1.190 -m connlimit --connlimit-above 10 -j REJECT # 针对固定IP做策略,进行连接限制,最大访问为10个包
客户端:192.168.1.190 使用ab指令对192.168.1.51进行压力测试,windows系统ab工具下载地址:http://httpd.apache.org/
yum install apache2 # 安装ab(Apache Benchmark)
ab --help ab -n 100000 -c 40 http://192.168.1.51/test.txt -n 发送数量 -c 累增
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
思考:
1、如何用iptables搭建一套如何企业实际使用的防火墙规则
2、如何用iptables进行防攻击
3、如何利用iptables进行数据转发
4、明白iptables的强大及实际使用意义
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
什么是netfilter?
是Linux操作系统核心层内部的一个数据包处理模块
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
什么是Hook point?
是数据包在Netfilter中的挂载点(PRE_ROUTING INPUT OUTPUT FORWARD POST_ROUTING)
iptables规则组成
组成部分:四张表 + 五条链(Hook point)+ 规则
四张表:filter表 nat表 (mangle表 raw表-不常用)
五条链:INPUT OUTPUT PRE_ROUTING FORWARD POST_ROUTING
mangle表:修改数据包,改变包头中内容(TTL TOS MARK)
数据包访问控制:ACCEPT:接受 DROP:丢弃 REJECT:拒绝
数据包改写:SNAT DNAT
信息记录:LOG
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
三、实现如下要需求:
规则1、对所有地址开放本机的TCP(80、22、10-21)端口的访问
规则2、允许对所有的地址开放本机的基于ICMP协议的数据包访问
规则3、其它未被允许的端口则禁止访问
netstat -tlnp # 查看本机所有开放的端口 iptables -v # 查看版本 iptables -nL # 查看当前规则,n为不显示主机名 iptables -F # 清除规则 iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 对自己的TCP80端口允许访问 iptables -I INPUT -p tcp --dport 22 -j ACCEPT iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT iptables -L # 查看当前规则 iptables -I INPUT -p icmp -j ACCEPT iptables -A INPUT -j ACCEPT # 其它的包拒绝掉 iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 删除规则 iptables -I INPUT -p tcp --dport 80 -j REJECT # 插入一条不允许访问80端口 iptables -nL # 查看当前规则,n为不显示主机名
以上存在的问题:本机无法访问本机,本机无法访问其它主机
iptables -I INPUT -i lo -j ACCEPT # lo是网卡,允许本机访问本机 iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外网 curl - I http://127.0.0.1
在此基础上,修改只允许192.168.1.190访问本机的httpd服务
iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 删除之前的规则 iptables -I INPUT -p tcp -s 192.168.1.190 --dport 80 -j ACCEPT # 只允许0.11访问httpd
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
四、ftp下的使用案例
1、ftp主动模式下iptables的规则配置
ftp连接的默认模式为被动模式
vsftpd服务支持主动模式需要注意配置选项,vim /etc/vsftpd/vsftpd.conf
port_enable=yes
connect_from_port_20=YES
/etc/init.d/vsftpd restart
iptables -F # 服务端清除所有规则 iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 开启22端口的访问权限 iptables -I INPUT -p tcp -dport 21 -j ACCEPT # 开启21端口的访问权限 iptables -I INPUT -p icmp -j ACCEPT iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -j REJECT iptables -nL # 查看规则
客户端模拟登录
ftp 10.113.0.10
name:anonymous
连接后被动模式被拒绝
passive # 客户端改为主动模式
ls # 查看
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
2、ftp被动模式下iptables的规则配置
方法一:为vsftpd指定数据端口,并且通过iptables开放相应需要传输的端口段
iptables -I INPUT -p tcp -dport 21 -j ACCEPT vim /etc/vsftpd/vsftpd.conf pasv_min_port=50000 pasv_max_port=60000 iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
方法二:使用连接追踪模块
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -I INPUT -p tcp -dport 21 -j ACCEPT modprobe nf_conntrack_ftp # 临时加载内核模块ftp modprobe -l|grep ftp # 查看模块加载 vim /etc/sysconfig/iptables-config # 开机自动加载 IPTABLES_MODULES="nf_conntrack_ftp"
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
五、案例:如下需求,进行实现
1、员工在公司内部(192.168.1.0/24,192.168.2.0/24)能访问服务器上的任何服务
2、当员工出差例如在上海,通过vpn连接到公司
3、外网员工===拨号到====VPN服务器===内网FTP,SAMBA.NFS.SSH
4、公司有一个门户网站需要公网访问
常见外网访问的服务
网站 www http 80/tcp
https 443/tcp
邮件 mail smtp 25/tcp
smtps 465/tcp
pop3 110/tcp
pop3s 995/tcp
imap 143/tcp
一些不允许外网访问的服务
文件服务器: NFS 123/udp
SAMBA 137 138 139 /tcp 445/tcp
ftp 20/tcp 21/tcp
远程服务: ssh 22/tcp
mysql 3306/tcp
oracle 1521/tcp
基本思路
允许本地访问
允许已监听状态数据包通过
允许规则中允许的数据包通过,开启远程ssh管理端口
拒绝未被允许的数据包
规则保存成配置文件
iptables -I INPUT -i lo -j ACCEPT iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 1723 -j ACCEPT # VPN端口 iptables -I INPUT -p icmp -j ACCEPT iptables -A INPUT -j REJECT
/etc/init.d/iptables save more /etc/sysconfig/iptables chkconfig iptables on chkconfig --list |grep iptables
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
六、nat表规则配置
SNAT 源地址转换 出口 postrouting
DNAT 目标地址 进口 prerouting
SANT模拟
转发需要编辑 vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
sysctl -a |grep ip_forward
iptables -t nat -A POSTROUTING -s 10.113.0.0/24 -j SNAT --to 10.113.100.232(自己地址)
iptables -t nat -L
在源机器加一条路由 vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost
GATEWAY=10.113.100.232
DNAT模拟
iptables -t nat -A PREROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80
iptables -t nat -L
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
七、防CC攻击
connlimit模块
作用:用于限制每一个客户端IP的并发连接数
参数:--connlimit-above n # 限制并发个数
iptables -I INPUT -p tcp -syn -dport 80 -m connlimit --connlimit-above 100 -j REJECT
Limit 模块
作用:限速,控制流量
例:iptables -A INPUT -m limit --limit 3/hour
--limit-burst 默认值为5
iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT # 每分钟只接受10个包 iptables -A INPUT -p icmp -j DROP
-------------------------------------------------------------------------羞 涩 的 分 隔 符---------------------------------------------------------------------------------------
八、一个规则比较常见的脚本,日常可以选取自己需要的拿来使用
#This program is about iptables rules #history # 20190904 By 那个不是我 FirstRelease PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
modprobe ipt_MASQUERADE modprobe ip_conntrack_ftp modprobe ip_nat_ftp iptables -F iptables -t nat -F iptables -X iptables -t nat -X
iptables -P INPUT DROP # 默认规则 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp -m ultiport --dports 110,80,25 -j ACCEPT iptables -A INPUT -p tcp -s 10.113.0.0/24 --dport 139 -j ACCEPT iptables -A INPUT -I eth1 -p udp -m multiport --dports 53 -j ACCEPT iptables -A INPUT -p tcp --dport 1723 - ACCEPT # VPN iptables -A INPUT gre -j ACCEPT # gre隧道 iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP iptables -A INPUT -p icmp -j DROP iptables -t nat -A POSTROUTING -o ppp0 -s 10.113.0.0/24 -j MASQUERADE # 地址转发 iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptalbes -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN iptables -A syn-flood -j REJECT iptables -P FORWARD DROP iptables -A FORWARD -p tcp -s 10.113.0.0/24 -m multiport --dports 80,110,21,25,1723 -j ACCEPT iptables -A FORWARD -p udp -s 10.113.0.0/24 --dport 53 -j ACCEPT iptables -A FORWARD -p gre -s 10.113.0.0/24 -j ACCEPT iptables -A FORWARD -p icmp 10.113.0.0/24 -j ACCEPT iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 8:15 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP iptables -I FORWARD -p udp --dport 53 -m string --string "qq.com" -m time --timestart 8:15 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP iptables -I FORWARD -s 10.113.0.0/24 -m string --string "ay2000.net" -j DROP # 关键词屏蔽 iptables -I FORWARD -s 10.113.0.0/24 -m string --string "eroticism" -j DROP iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP sysctl -w net.ipv4.ip.forward=1 &>/dev/null sysctl -w net.ipv4.tcp.syncookies=1 &>/dev/null iptables -I INPUT -s 10.113.0.9 -j ACCEPT # 自己机器允许所有 iptalbes -I FORWARD -s 10.113.0.9 -j ACCEPT