iptables 学习

**本博客是学习慕课网课程 用iptables搭建一套强大的安全防护盾 整理而成 **

iptables相当于在ip层挂载一个hook point对用户进行控制

组成: 四张表+ 五条链(hook point) + 规则
四张表: filter表, nat表, mangele表, raw表
默认操作的是filter表, 其他表需要通过-t参数指定
五条链: INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING
fileter表: 访问控制,规则匹配
nat 表: 地址转发

数据包在规则表,链匹配流程

数据包访问控制: ACCEPT, DROP, REJECT
数据包改写: SNAT, DNAT
信息记录: LOG

iptables 规则组成

command:
-A 增加,最后一条增加
-D 删除
-L 列出目前的 table 的规则
-F 清空
-P 设置默认的iptables规则
-I 插入规则,在第一条位置插入
-n 一般与-L同时用,让主机名等不显示出来,例如会将anywhere显示为0.0.0.0,ssh端口直接显示为22,类似的netstat这个选项也是这个意思
-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
–line-number:查看规则列表时,同时显示规则在链中的顺序号

parameter:
-p 协议
-s 源地址
-i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合
-o :封包所传出的那个网络接口,需与 OUTPUT 链配合
-d 目标地址
--sport 源端口
--dport 目标端口
--dports 目标端口,后面加一个范围
--m tcp | state | multiport 补充协议,

场景一:

规则1: 对所有地址开发本地的tcp(80,22,10-21)端口的访问
规则2: 允许对所有的地址开放本机的基于ICMP协议的数据包访问
规则3: 其他未被允许的端口则禁止访问

设计思路: 先设置白名单,然后是拒绝所有。

iptables -L #列出iptables的规则,可以加-n表示不让主机名显示出来   
iptables -F #清除之前设置的规则     
iptables -I INPUT -p tcp --dport 80 -j ACCEPT  
iptables -I INPUT -p tcp --dport 22 -j ACCEPT  # 22是ssh端口,服务器程序最后开通该端口    
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT  
iptables -I INPUT -p icmp -j ACCEPT   
iptables -A INPUT -j REJECT     

位置顺序很重要,注意最后一条REJECT需要使用-A参数将拒绝的加在最后面,如果用-I加在前面直接拒绝所有
同时注意允许所有icmp并不会产生特殊的条目在iptables中,在拒绝的语句后面会备注允许icmp包进入,
如下:

target     prot opt source     destination     
REJECT     all  --  0.0.0.0/0  0.0.0.0/0     reject-with icmp-port-unreachable

此时就设置完毕了,可以nmap -sS -p 0-1000 10.10.163.233 来进行端口扫描,查看端口是否开放

如果此时需要更改规则,比如说拒绝80端口的访问,需要先删除再添加
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j REJECT

经过上面的设置目前网路的连接还有两个问题:
问题1: telnet 127.0.0.1 22 访问失败,虽然上面开发22端口,但是本机无法访问本机
问题2: curl http://www.imooc.com/ 本机往外发请求也是无法的,本地无法访问其他主机

本地访问本机,需要设置本地lo网卡允许访问
iptables -I INPUT -i lo -j ACCEPT
-i 参数后加一个设备,上面表示允许所有从lo来的访问
iptables -I INPUT -m state --sate ESTABLISHED,RELATED -j ACCEPT
表示状态为ESTABLISHED和RELATED的连接进行放行,允许其数据包进来
一般ESTABLISHED表示本机主动建立的连接,允许外部练级发送数据进来,否则本机无法主动与外部建立连接,这样就使得curl可以运行,RELATED 是ftp用到的协议

补充: 在场景一的基础上,修改只允许10.103.188.233访问本机的httpd服务:
首先去掉之前允许所有80端口的连接: iptables -D INPUT -p tcp --dport 80 -j ACCEPT
然后允许来自指定ip的连接: iptables -I INPUT -p tcp -s 10.10.188.233 --dport 80 -j ACCEPT

场景二

1.ftp主动模式下iptables的规则配置
2.ftp被动模式下iptables的规则配置

主动模式示意图, client 通过PORT指令上报自己listen的端口,然后ftp server与该端口主动建立连接,发送数据过来

ftp被动模式示意图, client通过PASV指令被动模式,然后ftp server会开一个随机端口进行listen, 并告知client这个端口,client就与该端口建立连接

主动模式
注意:

  • ftp连接的默认模式为被动模式
  • vsftpd服务支持主动模式需要注意配置选项: port_enable=yes和 connect_from_port_20=yes
  • 主动模式下iptables需要开启21端口的访问权限: iptables -I INPUT -p tcp -dport 21 -j ACCEPT, 主动模式下20端口不需要开放,因为主动模式下是通过20端口发送数据而不是接收数据

主动模式需要设置的规则如下:

iptablse -I INPUT -p tcp -dport 21 -j ACCEPT   
iptables -I INPUT -p tcp -dport 22 -j ACCEPT  # ssh的端口     
iptables -I INPUT -p icmp -j ACCEPT   
iptables -I INPUT -m stats --state ESTABLISHED,RELATED, -j ACCEPT   
iptables -A INPUT -j REJECT    
iptables -nL    

被动模式
为vsftp指定数据端口,并且通过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规则场景
要求一: 员工在公司内部(10.10.155.0/24, 10.10.188.0/24) 能访问服务器上的任何服务
要求二: 当员工出差例如在上海,通过VPN连接到公司
外网(员工) == 拨号到==> VPN 服务器 ===> 内网FTP, SAMBA, NFS, SSH
要求三: 公司有一个门户网站需要允许公网访问

常见允许外网访问的服务
网站www: http: 80, https: 443
邮件main: smatp: 25, smtps: 465, pop3: 110, pop3s: 995, imap: 143

iptables -I INPUT -i lo -j ACCEPT        
iptables -I INPUT -m state --sate ESTABLISHED,RELATED -j ACCEPT         
iptables -A INPUT -S 10.10.155.0/24 -j ACCEPT      
iptables -A INPUT -S 10.10.188.0/24 -j ACCEPT     
iptablse -I INPUT -p tcp -dport 80 -j ACCEPT        
iptablse -I INPUT -p tcp -dport 1723 -j ACCEPT   # vpn端口      
iptables -I INPUT -p icmp -j ACCEPT       
iptables -A INPUT -j REJECT    

在redhat下可以使用/etc/init.d/iptables save 将这些配置信息存储起来,下次机器重启自动加载
默认的保存位置是在/etc/sysconfig/iptables中存储
可以设置iptabels开机启动: chkconfg iptables on

iptables 防火墙nat表规则配置

SNAT : 源地址转换, 作用出口POSTROUTING链
DNAT : 目标地址转换, 作用于进口PREROUTING链

SNAT场景模拟

上面的场景中因为10.10.177.233与10.10.188.173不是在一个网段,所以用client无法直接访问web server
在Nat servers上有两张网卡,与两个子网都能通信,所以需要在nat server上进行设置iptables
如果使用redhat要进行转发需要将/etc/sysctl.conf下的net.ipv4.ip_forward打开,设置为1即可
然后sysctl -p 让配置生效,然后sysctl -a | grep ip_forward进行查看是否生效
iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232
对于本机ip经常变动,指定SNAT IP不太方便,可以用MASQUERADE动态获取,将上面那句改为
iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j MASQUERADE
使用iptables -t nat -nL 进行查看
这样就对来自177网段的数据包源地址进行改写,改写成从188网段出去,
同时需要在10.10.177.233上设置默认网关,进行路由,将数据包都从nat server进行转发
route add 0.0.0.0 gw 10.10.177.232
netstat -rn 可以查看路由表
也可以用 cat /etc/sysconfig/network进行查看
设置好之后就可以正常访问web server了

DNAT场景模拟

SNAT的反向场景的模拟, client 直接访问的是nat Server的ip地址,然后由nat server通过Iptables转换dnat请求http server
这样直接curl nat server的ip地址就可以了
iptables -t nat -A PREROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.233:80
对于设置一个反向代理来说这上面的还不够,只是设置了反向代理的进入的流量,还需要设置当返回数据的时候再将源地址转换为proxy的地址
iptables -t nat -I POSTROUTING -p tcp --dport 80 -j MASQUERADE

利用iptables 防CC攻击

关于SYN和DDOS攻击,请查看《linux系统扫描技术与安全防范》课程的第六章: http://www.imooc.com/learn/344
connlimit模块
参数: -connlimit-above n #限制并发个数
例:
用于限制不同ip的并发连接数:
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
对于来自10.10.163.232的目标端口为80的连接进行限制,只允许10个连接,可以有效控制并发量:
iptables -I INPUT -p tcp --dport 80 -s 10.10.163.232 -m connlimit --connlimit-above 10 -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
iptables -A INPUT -p icmp -j DROP
表示在初始时刻允许10个包过来,随后每分钟允许1个, 不满足这个规则的包直接DROP掉

iptables实例脚本

/bin/sh
modeprobe ipt_MASQUERADE
modeprobe ip_conntrack_ftp
modeprobe ip_nat_ftp
iptables -F
iptables -t nat -F
iptables -X 
iptables -t nat -X 

####################
iptables -P INPUT DROP   # 默认的规则的设置,如果没有满足下面的规则则DROP
iptables -A INPUT -m stat --stat ESTABLISHED,RELATED -j ACCEPT 
iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp -m multiport --dports 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 10.10.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 -j ACCEPT 
iptables -A INPUT -p gre -j ACCEPT

iptables -A INPUT -s 192.168.0.0/24 -p tcp -m stat --stat ESTABLISHED.RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP  # 限速,限制同一个ip发起的连接个数

iptables -A INPUT -p icmp -j DROP 

iptables -t nat -A POSTROUTING -o ppp0 -s 10.10.0.0/24 -j MASQUERADE   # MASQUERADE即表示SNAT转发,10.10.0.0/24出去的包更改源地址用ppp0转发出去

iptables -N syn-flood      # 自定义一个新链
iptables -A INPUT -p tcp --syn -j syn-flood    #将syn包都转发到该链
iptables -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.10.0.0/24 -m multiport --dport 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 gre -s 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.10.0.0/24 -j ACCEPT

iptables -A FORWARD -m stat --stat ESTABLISHED,RELATED, -j ACCEPT
iptables -I FORWARD -p udp --dport 53 -m string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
iptables -I FORWARD -p udp --dport 53 -m string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
iptables -I FORWARD -p udp --dport 53 -m string "tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
iptables -I FORWARD -p udp --dport 53 -m string "TENCENT" -m time --timestart 13:15 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 
iptables -I FORWARD -s 10.10.0.0/24 -m 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 "qq.com" -m time --timestart 13:15 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP 

iptables -I FORWARD -s 10.10.0.0/24 -m string "ay200.net" -j DROP 
iptables -I FORWARD -s 10.10.0.0/24 -m string "eratucism" -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.10.0.50 -j ACCEPT    # 本机始终可以联系
iptables -I FORWARD -s 10.10.0.50 -j ACCEPT
posted @ 2017-12-16 20:29  gaorong404  阅读(602)  评论(0编辑  收藏  举报