**本博客是学习慕课网课程 用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 学习的更多相关文章

  1. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  2. Linux防火墙iptables学习

    http://blog.chinaunix.net/uid-9950859-id-98277.html 要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过 ...

  3. iptables学习02-nat表应用

    nat表应用实验 第一步 准备工作 A机器两块网卡ens33(192.168.2.106).再添加一块自定义网卡ens37(192.168.100.1),添加到LAN内网区段(自定义名字,写什么无所谓 ...

  4. Linux下iptables学习笔记

    Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...

  5. 【转】IPtables学习笔记

    写在前面,大家测试玩iptables时要记得自己配置了那些东西,测试完成后记得删除啊,博主忘了删除一个input REJECT链的一条记录,后续测试搭建了apache服务器,始终无法访问,最后抓包发现 ...

  6. LInux iptables学习

    作者原文 : http://blog.chinaunix.net/uid-9950859-id-98277.html       要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多 ...

  7. iptables学习笔记

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3812510.html ...

  8. iptables学习笔记_____摘自朱双印个人日志 ____http://www.zsythink.net/

    iptables为我们预先定义了四张表 raw.mangle.nat.filter filter表负责过滤:允许那些ip访问.拒绝那些ip访问.允许那些端口...是最常用的表 #查看表里面所有的规则i ...

  9. iptables学习

    droidwall.sh #!/system/bin/sh IPTABLES=iptables BUSYBOX=busybox GREP=grep ECHO=echo # Try to find bu ...

随机推荐

  1. HDU 6035(树形dp)

    题意略. 思路:有n * (n - 1) / 2这么多边,要枚举是不可能的,感觉和数据结构也沾不上边.再加上树上染色,以一条边上不同颜色作为这个边的值,这看起来像是算贡献那种题,和17icpc沈阳的某 ...

  2. Python自动化--语言基础2--运算符、格式化输出、条件语句、循环语句、列表、元组

    运算符包括:算术运算符.比较运算符.赋值运算符.逻辑运算符.成员运算符.身份运算符 算术运算符 %   取模(余数) //  取相除的整数部分 /   (5/2=2.5) 比较运算符 ==  等于 ! ...

  3. Java经典编程题50道之十五

    输入三个整数x,y,z,请把这三个数由小到大输出. public class Example15 {    public static void main(String[] args) {       ...

  4. Smarty3.1.3安装使用

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Verdana } span.s1 { } Smarty简介 Smarty是一个PHP的模板引 ...

  5. 计蒜客 无脑博士 bfs

    题目链接无脑博士的试管们 思路:直接模拟倒水过程即可,但是需要记忆判断当前的情况是否已经处理过.dfs和bfs都ok AC代码 #include <cstdio> #include < ...

  6. 对于JAVA程序优化的一些想法,读书有感.治疗强迫症良药

    在深入了解Java虚拟机里读到:在try{}块里面执行代码,比if(x!=null)效率要高,前提是被catch的几率很低的情况下. 但是 在Effective Java里读到:因为异常机制的设计初衷 ...

  7. Raft论文学习笔记

    先附上论文链接  https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 最近在自学MIT的6.824分布式课程,找到两个比较好的githu ...

  8. HDP2.0测试

    1.测试Hbase (1)hive导入hbase

  9. 移动端-手机端-日历选择控件(支持Zepto和JQuery)

    一. 效果图 二. 功能说明 1. 支持切换年份,月份. 2. 支持点击选中日期,也可以点击确定选择日期. 三. 使用方法 1. 添加Input 在你的页面中添加Input输入框.可以再html里,也 ...

  10. python语言中的AOP利器:装饰器

    一.前言 面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java ...