说明
什么是iptables,常用人员有哪些?
iptables是常见于Linux系统下的应用层防火墙工具,是Linux内核集成的IP信息包过滤系统。如果linux系统连接到因特网或LAN、服务器或连接LAN和因特网的代理服务器,则系统有利于在linux系统上更好地控制IP信息包过滤和防火墙配置。
常用人员:系统管理人员、网络工程人员,安全人员。
压力测试
1.目标机器: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个包
2.客户端: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
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