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
iptables 学习的更多相关文章
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]
Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...
- Linux防火墙iptables学习
http://blog.chinaunix.net/uid-9950859-id-98277.html 要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过 ...
- iptables学习02-nat表应用
nat表应用实验 第一步 准备工作 A机器两块网卡ens33(192.168.2.106).再添加一块自定义网卡ens37(192.168.100.1),添加到LAN内网区段(自定义名字,写什么无所谓 ...
- Linux下iptables学习笔记
Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...
- 【转】IPtables学习笔记
写在前面,大家测试玩iptables时要记得自己配置了那些东西,测试完成后记得删除啊,博主忘了删除一个input REJECT链的一条记录,后续测试搭建了apache服务器,始终无法访问,最后抓包发现 ...
- LInux iptables学习
作者原文 : http://blog.chinaunix.net/uid-9950859-id-98277.html 要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多 ...
- iptables学习笔记
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3812510.html ...
- iptables学习笔记_____摘自朱双印个人日志 ____http://www.zsythink.net/
iptables为我们预先定义了四张表 raw.mangle.nat.filter filter表负责过滤:允许那些ip访问.拒绝那些ip访问.允许那些端口...是最常用的表 #查看表里面所有的规则i ...
- iptables学习
droidwall.sh #!/system/bin/sh IPTABLES=iptables BUSYBOX=busybox GREP=grep ECHO=echo # Try to find bu ...
随机推荐
- tomcat使用cookies缓存的时候中文报错解决办法 java.lang.IllegalArgumentException: Control character in cookie value or attribute.
报错出现 java.lang.IllegalArgumentException: Control character in cookie value or attribute. at org.apac ...
- yii2 查询构建器
Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...
- Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)
今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...
- 如何通过SpringBoot官方手册集成RabbitMQ
众所周知,SpringBoot是对Spring的一层封装,用来简化操作. 随着SpringBoot的越发成熟,很多的流行技术都提供了SpringBoot的版本. 可以点击下方的连接查看spring-b ...
- Python后端(一)——客户端/服务端
网址组成(四部分) 协议 http, https(https 是加密的http) 主机 g.cn zhihu.com之类的网址 ,因此一般不用填写 路径 下面的「/」和「 ...
- spring cloud熔断监控Hystrix Dashboard和Turbine
参考: http://blog.csdn.net/ityouknow/article/details/72625646 完整pom <?xml version="1.0" e ...
- Spark源码编译(未完待续)
在这里我们不需要搭建独立的Spark集群,利用Yarn Client调用Hadoop集群的计算资源. Spark源码编译生成配置包: 解压源码,在根去根目录下执行以下命令(sbt编译我没尝试) ./m ...
- 网络基础tcp/ip协议二
物理层解析: 物理层是TCP/IP模型的最低层,物理层为数据提供数据传输可靠通路. 物理层关心的介质: 信号 接口 传输介质 信号的分类:(信号是信息传递的媒介.) 模拟信号:连续变化的物理量 数字信 ...
- 1_类的定义(Defining Class)
C++ 提供了一种类class机制,让程序员可以定义真正意义上的数据类型.即不但可以定义数据的复合,还可以定义该复合数据的操作,以便让本应由使用该数据类型的程序员做得工作分出来,让定义类型的程序员去做 ...
- VTK显示mhd,mha格式文件
下一篇文章将详细介绍mhd,mha文件的构成以及如何制作void renderMhd () { // read input image vtkSmartPointer<vtkMetaImageR ...