iptables应用小攻略(笔记)

iptables

  1. 全名netfilter/iptables,ip信息包过滤系统,有两个组件netfilter, iptables组成
  • netfilter:也称为【内核空间】,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集
  • iptables:是个工具,也成为【用户空间】,它使得操作netfilter的规则集变得容易
  1. netfilter/iptables后期简称为iptables。

    • iptables是基于内核的防火墙,
    • iptables内置了filter,nat,mangle三张表。
    • 所有规则配置后不需要重启,立即生效。
  2. 三(四)张表

    • filter表;负责过滤数据包,包括的规则链有,input, output, forward;
    • nat表:涉及到网络地址转换,包括的规则链有,prerouting, postrouting, output;
    • mangle表:主要应用在修改数据包内容上,用来做流量整形,给数据包打表示,默认的规则链有:input, output, nat, postrouting, prerouting;
    • raw表:用于处理异常,包括的规则链有,prerouting,output;一般用不到。
  3. 五个链

    • input 匹配目标IP是本机的数据包
    • output 出口数据包,一般不在此链上做配置
    • forward 匹配流经本机的数据包
    • prerouting 用来修改目的地址,用来做DNAT。如:把内网中的80端口映射到路由器外网端口上
    • postrouting 用来修改源地址,用来做SNAT。如:内网PC通过路由器NAT转换功能实现通过一个公网IP地址上网。(比如家里的路由器能让电脑上网)
  4. 总结:iptables三个表,五个链,结构如下图

    • image.png
    • 表 -> 链 -> 规则

iptables过滤封包流程

  • iptables过滤封包流程.png

    数据包分两大类:1. 发给防火墙本身的数据包;2. 需要经过防火墙的软件包。

  • 表之间的优先顺序
    • raw > mangle > nat > filter
  • 链之间的匹配顺序
    • 入站数据:prerouting, input
    • 出站数据:output, postrouting
    • 转发数据:prerouting, forward, postrouting
  • 链内的匹配顺序
    • 自上向下按顺序一次进行检查,找到相匹配的规则即停止(LOG选项表示记录相关日志)
    • 若在该链内找不到相匹配的规则,则按照该链的默认策略处理(未修改的情况下,默认策略为允许)

PS:iptables能干嘛:路由转发,内网上网,端口映射等

iptables命令操作

· iptables命令语法格式
- iptables    [-t 表名]     管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
- 注意事项:
    - 不指定表名,默认filter
    - 不指定链名,默认表内所有链
    - 除非设置规则链的缺省策略,否则需要指定匹配条件
- iptables命令
- ![iptables语法总结](https://upload-images.jianshu.io/upload_images/11732982-024310e08e886445.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
· iptables命令使用方法
- iptables [-t 表]
  <操作命令>
  [要操作的链]
  [规则号码]
  [匹配条件]
  [-j 匹配到以后的动作]
- 操作命令:-A, -I, -D, -P, -F
- 查看命令:-[vnx]L
  • -A <链名> ,APPEND, 追加一条规则(放到最后)
# 在filter表的INPUT链里追加一条规则(作为最后一条规则)
# 匹配所有访问本机IP的数据包,匹配到的丢弃
iptables -t filter -A INPUT -j DROP
  • -D <链名> <规则号码|具体规则内容> ,DELETE, 删除一条规则


    删除规则

    注意事项:

    1. 若规则列表中有多个相同的规则时,按内容匹配只删除序列号最小的一条
    2. 号码匹配删除时,确保规则号码<= 已有规则数,否则报错
    3. 内容匹配删除时,确保规则存在,否则报错
# 删除filter表INPUT链中内容为"-s 192.168.0.1 -j DROP"的规则
iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配删除)
  • -P <链名> <动作>, POLICY,设置某个链的默认规则


    修改前filter表INPUT链默认策略

    修改后filter表INPUT链默认策略

    注意:-P设置了DROP之后,使用-F一定要小心!!!
    配置crontab:
    */15 * * * * iptables -P INPUT ACCEPT
    */15 * * * * iptables -F

  • -F -t <表> <链名>,清除指定表/链上的所有规则
    注意:不会清除-P设置的默认规则
# 清除filter表INPUT链上的所有规则
iptables -F INPUT
# 清除filter表所有链上的所有规则
iptables -F
# 清除nat表PREROUTING链上的所有规则
iptables -t nat -F PREROUTING
匹配条件
  • 流入,流出接口 (-i, -o)
  • 来源,目的地址 (-s, -d)
  • 协议类型 (-p)
  • 来源,目的端口 (--sport, --dport)
按网络接口匹配
  • -i <匹配数据进入的网络接口> #此参数主要应用于nat表,如:目标地址转换
    例如:
    -i eth0 #匹配是否从网络接口eth0进来
    -i ppp0 #匹配是否从网络接口ppp0进来
  • -o <匹配数据流出的网络接口>
    例如:
    -o eth0
    iptables -t nat -o eth0 <条件> <动作>
  • -s <匹配来源地址>
    可以是ip, net, domain,也可以空(任何地址)
    例如:
    -s 192.168.0.1 匹配来自192.168.0.1的数据包
    -s 192.168.1.0/24 匹配来自192.168.1.0/24网络的数据包
    -s 192.168.1.0/16 匹配来自192.168.1.0/16网络的数据包

-d <匹配目的地址>
可以是ip, net, domain,也可以空
例如:
-d 202.106.0.20 匹配去往202.106.0.20的数据包
-d 202.16.0.0/16 匹配去往202.106.0.0/16网络的数据包
-d www.abc.com 匹配去往域名www.abc.com的数据包

按协议类型匹配
  • -p <匹配协议类型>
    可以是tcp, udp, icmp等,也可以空
    例如:
    -p tcp
    -p udp
    -p icmp --icmp-type 类型
    ping:type 8 pong:type 0
按来源目的端口匹配
  • --sport <匹配源端口>
    可以是个别端口,可以是端口范围
    例如:
    --sport 1000 #匹配源端口是 1000 的数据包
    --sport 1000:3000 #匹配源端口是 1000-3000 的数据包
    --sport :3000 #匹配源端口是 3000以内(包括3000) 的数据包
    --sport 1000: #匹配源端口是 1000以上(包括1000) 的数据包

  • --dport <匹配目的端口>
    --dport 80 #匹配目的端口是80的数据包
    --dport 6000:8000 #匹配目的端口是6000-8000的数据包(包括6000与8000)
    --dport :3000 #匹配目的端口是3000以下的数据包(包括3000)
    --dport 1000: #匹配目的端口是1000以上的数据包(包括1000)
    注意: --sport和 --dport必须配合 -p 使用

匹配应用举例

  1. 端口匹配
    -p tcp --dport 3306 #匹配网络中目的端口是3306的tcp协议数据包
  2. 地址匹配
    -s 10.1.0.0/24 -d172.17.0.0/16 #匹配来自10.1.0.0/24去往172.17.0.0/16的所有数据包
  3. 端口和地址联合匹配
    -s 192.168.0.1 -d www.abc.com -p tcp --dport 80 #匹配来自192.168.0.1,去往www.abc.com的80端口的tcp数据包

假如192.168.1.63一直攻击192.168.1.64的80端口,就可以根据源IP,目标IP,目标端口来匹配过滤数据包
数据包内容

注意:

  1. --sport, --dport必须配合 -p 同时使用,必须指明协议类型
  2. 条件越多,匹配越细致,匹配范围越小
动作(处理方式)
  • ACCEPT
  • DROP
  • REJECT
  • SNAT
  • DNAT
  • MASQUERADE (假面舞会)伪装一个公网ip地址

-j ACCEPT
通过,允许数据包通过本链,不拦截
例如:
iptables -A INPUT -j ACCEPT
允许所有访问本机ip的数据包通过

-j DROP
丢弃,阻止数据包通过本链,丢弃
例如:
iptables -A FORWARD -j DROP
阻止来源地址为192.168.1.100的数据包\color{#FF3030}{通过}本机
注意,这里是阻止通过,而不是阻止访问本机,所以要用FORWARD

-j SNAT --to IP[-IP] [:端口-端口][(只能用于nat表的POSTROUTING链)
源地址转换,SNAT支持转换为单IP,也支持转换到IP地址池(一组连续的IP地址)
将内网192.168.0.0/24的ip修改为公网IP1.1.1.1

(在nat表里的POSTROUTING链上,把源地址是192.168.0.0/24的数据包的地址修改为1.1.1.1)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10(转换到地址池)
扩展:一个IP地址做SNAT转换:可以让内网多少台PC实现上网?大约100台

-j DNAT --to IP[-IP] [:端口-端口][(只能用于nat表的PREROUTING链)
目的地址转换,DNAT支持转换为单IP,也支持转换到IP地址池
把从eth0进来的要访问TCP/80的数据包的目的地址改为192.168.0.1

(把进来的数据包,在nat表的PREROUTING 链上,筛选出进入网卡是eth0,协议是tcp,目标端口是80的数据包的目标地址修改为192.168.0.1)

写法1: iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
写法2: iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80 ( ip+port的写法也可以)
写法3: iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.186.0.10 (转换到网段,有点负载均衡的意思)

-j MASQUERADE
动态源地址转换(动态IP的情况下使用)比如:ADSL
将源地址是192.168.0.0/24的数据包进行地址伪装,转换成eth0上的IP地址,eth0为路由器外网出口IP地址
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE(自动找外网的动态IP)

附加模块
  • 按包状态匹配(state)
  • 按来源MAC匹配(mac)
  • 按包速率匹配(limit)
  • 多端口匹配(multiport)
  1. 按包状态匹配
    -m state --state 状态
    状态:NEW, RELATED, ESTABLISHED, INVALID
    NEW: 有别于tcp的syn
    ESTABLISHED: 连接态
    RELATED: 衍生态,与conntrack关联(FTP)
    INVALID: 不能被识别属于哪个连接或没有任何状态
    例:
    接收已经建立连接和衍生态的数据包
    iptables -A INPUT -m state --state RELATED, ESTABLISHED -j ACCEPT

  2. 按来源MAC分配(mac)
    -m mac --mac-source MAC
    匹配某个MAC地址
    例:
    iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
    阻断来自某个MAC地址的数据包通过本机
    注意:豹纹经过路由器后,数据包中原有的mac信息会被替换,所以在路由后POSTROUTING的iptables中使用mac模块是没有意义的

  3. 按包速率匹配(limit)
    -m limit --limit 匹配速率[--burst 缓冲数量]
    用一定速率去匹配数据包
    例:
    iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
    iptables -A FORWARD -D 192.168.0.1 -j DROP
    注意:两条命令需要同时存在,第一条设置每秒50个数据包,第二条设置超过的第51个数据包被DROP掉

  4. 多端口匹配(multiport)
    -m multiport <--sport | --dport | --ports> 端口1[端口2, ... 端口n]
    一次性匹配多个端口,可以区分源端口,目的端口或不指定端口
    例:
    iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -J ACCEPT
    允许所有数据包访问本服务器的21,22,25,80,110端口
    注意:必须与 -p 参数一起使用

web服务器防火墙

单服务器的防护

  • 浓情对外服务对象
  • 书写规则

网络接口lo的处理
协议 + 端口的处理
状态监测的处理

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22, 80 -j ACCEPT
# 也可以用下面2个规则替代multiport
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 如果不加状态规则,那么服务器出外网后再回来就会被拒绝
iptables -A INPUT -m state --state RELATED, ESTABLISHED -j ACCEPT 
iptables -P INPUT DROP

搭建路由器,通过SNAT使内网PC可以访问外网

  • 63可以访问公网,
  • 63做路由器,
  • 64通过63上网
    网络拓扑图

    配置步骤

  1. 配置63的网卡(VM Ware虚拟机上的配置,ecs应该自带了2个网卡,其中有内网网卡)
    name:eth1
    device:eth1
    static ip: 192.168.2.1(作为内网客户端PC的网关)
    net mask: 255.255.255.0
    service network restart

    配置路由转发服务器的eth1网卡

  2. 启用63的路由转发功能

    1. vim /etc/systcl.conf,找到net.ipv4.ip_forward=1,将注释放开
      开启路由转发
    2. 保存修改后使配置生效:sysctl -p
  3. 在63上配置SNAT

# 把来自192.168.2.0/24网段的数据包的源IP改成192.168.1.63(192.168.1.63是公网ip)
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.63
  1. 配置64(客户端PC)
    cat /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    NM_CONTROLLED=yes
    IPADDR=192.168.2.2
    NETMASK=255.255.255.0
    GATEWAY=192.168.2.1 (这里应该是比较重要的)
    DNS1=8.8.8.8
    ONBOOT=yes
    TYPE=Ethernet
    ...
    NAME=‘’eth0''
    HWAD=xx:xx:xx:xx:xx:xx
    service network restart

拒绝访问服务器本身,拒绝通过服务器去访问别的机器。主要是考察是否明白iptables每个链的作用

  • 过滤位置filter表FORWARD链
  • 匹配条件 -s -d -p --sport --dport
  • 动作处理 ACCEPT DROP

例:
拒绝访问服务器本身和通过服务器去访问别的机器
环境:
配置好网络和对应IP地址:
64: IP: 192.168.2.2 网卡:Vmnet4
64: GATEWAY: 192.168.2.1
63: eth1: IP: 192.168.2.1 网卡:Vmnet4
63: eth0: IP: 192.168.1.63
网络拓扑图如下:


实验环境网络拓扑图

在63上启用内核路由转发功能
永久生效

vim /etc/sysctl.conf
# net.ipv4.ip_forward=0 # 0改为1
net.ipv4.ip_forward=1
# 保存后执行
systcl -p

例1:禁止64通过63访问192.168.2.1。即不允许访问服务器自身
iptables -A INPUT -s 192.168.2.2 -j DROP
注意:添加在FORWARD链上,是不能阻止访问服务器本身的
引申:可否在OUTPUT链上添加规则,达到不让192.168.2.2访问自身服务器
不太好的方式:iptables -A OUTPUT -s 192.168.2.1 -j DROP
在OUTPUT链上属于出去流程,这时,源地址是本机地址192.168.2.1。这样做可以达到目的,但是伤害太大,所有访问服务器本机的客户端都会被DROP
较合理的方式:iptables -A OUTPUT -d 192.168.2.2 -j DROP
这样写的话,就合理很多,从本机出去时,目的地址是192.168.2.2的数据包被DROP

何时会需要在OUTPUT链上添加规则
当发现服务器被黑,当作肉鸡,不断向指定IP(x.x.x.x)发数据时,可以OUTPUT上限制x.x.x.x

例2:禁止64(192.168.2.2)这台机器通过服务器(63)上网
错误方法:iptables -A OUTPUT -s 192.168.2.2 -j DROP
这种不让数据包出去的思路是不对的,因为64通过63上网,走的是FORWARD链,不经过OUTPUT。请看参考下图

  • iptables过滤封包流程.png

    正确方法:iptables -A FORWARD -s 192.168.2.2 -j DROP
使用DNAT功能,把内网web服务器端口映射到路由器外网

实验环境:
64: ip: 192.168.2.2 网卡:Vmnet4。内网,搭建nginx
63: eth1: ip: 192.168.2.1 网卡:Vmnet4
63: eth0: ip: 192.168.1.63
目的:通过访问192.168.1.63,会实际访问到64的nginx
80端口映射:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.2.2:80
通过eth0进入63的,协议是tcp的,访问端口是80的数据包,通过DNAT转到192.168.2.2的80端口上
或者如下写法:
iptables -t nat -A PREROUTING -d 192.168.1.63 -p tcp --dport 80 -j DNAT --to 192.168.2.2:80
目的地址是192.168.1.63的,协议是tcp的,访问端口是80的数据包,通过DNAT转到192.168.2.2的80端口上

如果是ADSL上网:
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.0.2:80

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 语法 iptables (选项) (参数) 选项 -t, --table table 对指定的表 ta...
    白红薯粉阅读 7,823评论 0 0
  • iptables是Linux系统提供的一个强大的防火墙工具,可以实现包过滤、包重定向、NAT转换等功能。iptab...
    Mr萝卜阅读 2,700评论 0 6
  • netfileter:防火墙内核态ip tables:防火墙用户态(管理防火墙规则) iptables的表和链表包...
    老夫刘某阅读 533评论 0 0
  • (本文源于转载或摘抄整理) 一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的...
    JackyTsuuuy阅读 8,920评论 1 6
  • iptables 附件CC攻击器-邪恶十六进制2.0 模拟cc攻击python写的暴力破解的脚本 模拟...
    运维阿文阅读 2,132评论 0 1