常见于Linux系统下的应用层防火墙工具
Netfilter
Netfilter 是 Linux操作系统核心层内部的一个数据包处理模块
Hook point 是数据包仔Netfilter中的挂载点(PRE_ROUTING , INPUT , OUTPUT , FORWARD , POST_ROUTING)
iptables 规则组成
组成部分:4张表 + 5条链(Hook point) + 规则
4张表 : filter , nat , mangle , raw
5条链 : PRE_ROUTING , INPUT , OUTPUT , FORWARD , POST_ROUTING
- Mangle表 :修改数据包,改变包头中内容(TTL,TOS,MARK)
- Raw表 :数据包状态跟踪
- filter表:访问控制、规则匹配
- nat表:地址转发
- -t filter/nat 对表
- -A 在后边追加一个规则
- -D 删除
- -L 显示规则 ,与 -n 连用,隐藏不相关的规则
- -F 清理现有规则
- -P 设置默认的规则
- -I 在原有规则基础上插入规则变成第一条规则
- -p tcp 显示协议
- -s 发起源
- -d 目标地址
- -sport 发起源端口
- -dport 目标端口
- -dports 端口段
- -m tcp 端口补充
iptables -L
iptables -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -A INPUT -j REJECT
nmap -sS -p 0-1000 10.10.163.233 //扫描0-1000的端口
iptables -nL
iptables -D INPUT -p tcp --dport 80 -j ACCEPT //删除规则
iptables -I INPUT -p tcp --dport 80 -j REJECT //不允许访问80端口
可能存在的问题
- 本机无法访问本机
- 本机无法访问外机
解决方法
iptables -I INPUT -i lo -j ACCEPT //允许本地访问
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT //允许访问外网
iptables -D INPUT tcp --dport 80 -j ACCEPT //清除规则
iptables -I INPUT tcp -s 10.10.188.233 --dport 80 -j ACCEPT //只允许特定的IP访问
ftp模式下的规则
FTP主动模式下的iptables的设置
- FTP连接的默认模式是被动模式
- vsftpd服务支持主动模式需要注意配置选项
port_enabled=yes
connect_from_port_20=yes
- iptables需要开启21端口的访问权限
iptables -F //清理
iptables -I INPUT -p tcp -dport 21 -j ACCEPT
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 //临时 $ vim /etc/sysconfig-iptables-config //开机自动加载 IPTEBLES_MODULES="nf_conntrack_ftp"
公司场景模拟
一、员工在公司内部(10.10.155.0/24,10.10.188.0/24)能访问服务器上的任何服务
二、当员工出差上海,通过VPN连接到公司,外网=== 拨号到= =》内网FTP,SAMBA,NFS,SSH
三、公司有个门户网站需要允许公网访问
常见的允许外网访问的服务
网站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
实现:
iptables -F
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 10.10.155.0/24 -j ACCEPT
iptebles -A INPUT -s 10.10.188.0/24 -j ACCEPT
iptables -A INPUT -s 10.10.140.0/24 -j ACCEPT //本机网段
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT //VPN端口1723
iptables -I INPUT -p icmp -j ACCEPT
iptables -A INPUT -j REJECT
保存方法1.
/etc/init.d/iptables save //保存规则备份
保存方法2.
$ history //拷贝历史
$ vim /opt/iptables_ssh.sh //写成shell文件
#!/bin/sh
... //拷贝历史
$ /bin/sh /opt/iptables_ssh.sh
SANT规则设置
//10.10.188.173机器
1.配置好80端口
//10.10.188.232机器
$ vim /etc/sysctl.conf
net.ipv4.ip_forward=1
$ sysctl -p
$ iptables -t -nat -A POSTRPUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 //转发设置
//10.10.177.233机器
curl http://10.10.188.173/hello/ //接通测试
cat /etc/sysconfig/network
route add 0.0.0.0 gw 10.10.177.232
DNAT场景模拟
//10.10.188.173机器
curl http://10.10.188.232/ //连通测试
curl http://10.10.188.232/test.txt
//10.10.188.232机器
iptables -F
iptables -t nat -A PREROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.233:80
iptables -t nat -L //查看策略
//10.10.177.233机器
ping 10.10.177.232 //能连通
netstat -luntp|grep 80 //80端口开放
curl http://10.10.177.233/test.txt //能够访问
利用iptables防CC攻击
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
模拟场景
//10.10.188.232机器
ping 10.10.188.233 //测试
//10.10.188.233机器
iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT //允许10个内运行,超出则每分钟一个
iptables -A INPUT -p icmp -j DROP
命令实例脚本
//FTP内核模块
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 //默认规则设置
//开发本地访问
ipbtales -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 110,80,25,-j ACCEPT //只允许访问80端口,POP3端口110,smtp端口25
iptables -A INPUT -p tcp -s 10.10.0.0/24 --dport 139 -j ACCEPT //允许内网10.10.0.0网段的samba协议端口139访问
iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT //允许通过eth1网卡访问udp DNS端口53
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT //允许vpn端口1723访问
iptables -A INPUT -p gre -j ACCEPT //允许虚拟隧道协议访问
iptables -A INPUT -s 192.186.0.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT //只允许ip 192.186.0.0访问
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP //只允许ppp0访问,限制15个链接
iptables -A INPUT -p icmp -j DROP //封闭访问
iptables -t nat -A POSTROUTING -o ppp0 -s 10.10.0.0/24 -j MASQUERADE //原地址的转发为ppp0出口--SNAT
//syn攻击限制
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-brust 6 -j RETURN
iptables -A syn-flood -j REJECT
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 10.10.0.0/24 -m mulitiport --dports 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 10.10.0.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
//规定时间段内屏蔽相关关键词
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP //上班期间禁止聊QQ
iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -s 10.10.0.0/24 -m string --string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -s 10.10.0.0/24 -m string --string "ay2000.net" -j DROP
iptables -I FORWARD -d 10.10.0.0/24 -m string --string "eroticism" -j DROP //分析数据包,屏蔽相关关键词访问
sysctl -w net.ipv4.ip_forward=1 >> /dev/null //数据包转发开关
sysctl -w net.ipv4.tcp_syncookies=1 >> /dev/null //采用cookie防止syn攻击
iptables -I INPUT -s 10.10.0.50 -j ACCEPT //允许本机访问所有机器
iptables -I FORWARD -S 10.10.0.50 -J ACCEPT