iptables学习

一、iptables 工作流程

iptables是采用数据包过滤机制工作的,所以其会对请求的数据包的包头进行分析。

二、 防火墙的四表五链

在这里插入图片描述

INPUT链:处理输入数据包

OUTPUT链:处理输出数据包

FORWARD链:处理转发数据包

PREROUTING链:用于目标地址转换(DNAT)

POSTROUTING链:用于源地址转换(SNAT)

常用的两张表主要是filter表nat表

在这里插入图片描述
在这里插入图片描述

三、防火墙工作原理

在这里插入图片描述
在这里插入图片描述

四、iptables基本参数

参数作用
-P设置默认策略:iptables -P INPUT (DROP
-F清空规则链
-L查看规则链
-A在规则链的末尾加入新规则
-I num在规则链的头部加入新规则
-D num删除某一条规则
-R替换规则列表中的某条规则
-z将表中数据包计数器和流量计数器归零
-s匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d匹配目标地址
-i网卡名称 匹配从这块网卡流入的数据
-o网卡名称 匹配从这块网卡流出的数据
-p匹配协议,如tcp,udp,icmp
–dport num匹配目标端口号
–sport num匹配来源端口号

五、基本动作

参数作用
-j动作
ACCEPT接受
DROP丢弃
REJECT拒绝访问
RETURN返回调用链

六、iptables防火墙策略查看

① 以域名方式查看:iptables -L

② 以ip的方式显示:iptables -nL

③ 显示nat表的信息:iptables -t nat -nL

④ 显示mangle表的信息:iptables -t mangle -nL

七、命令配置的基本格式

iptables -t filter -A INPUT -p ICMP -j REJECT

八、查看命令

列出表中的所有规则:iptables [–line][-t 表名(raw,mangle,nat,filter)]–[n][v][x]L [链名(INPUT,OUTPUT,PREROUTING,FORWARD,POSTROUTING)]

–line可以显示规则编号,省略 [-t 表名] 则默认为查看filter表,-v显示更详细的信息,-n不对IP地址进行名称反解,-x 表示显示计数器的精确值。
在这里插入图片描述

​ num:行号

​ pkts:规则匹配到的报文数

​ bytes:匹配的报文包大小总和

​ target:规则对应的动作

​ prot:规则对应的协议

​ opt:规则对应选项

​ in:数据包由哪个网卡流入

​ out:数据包由哪个网卡流出

​ source:规则对应的源头地址

​ destination:规则对应的目标地址

​ policy:当前链的默认策略,当为ACCEPT时,默认放行所有报文

​ packets:当前链默认策略匹配到的包的数量

​ bytes:当前链默认策略匹配到的所有包的大小

九、iptables数据包匹配流程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

基本步骤如下:

  1. 数据包到达网络接口,比如 eth0。

  2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。

  3. 如果进行了连接跟踪,在此处理。

  4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。

  5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。

  6. 决定路由,看是交给本地主机还是转发给其它主机。

​ 到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:

  1. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。

  2. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。

  3. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。

  4. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。

  5. 进入出去的网络接口。完毕。

​ 另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:

  1. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。

  2. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。

  3. 交给本地主机的应用程序进行处理。

  4. 处理完毕后进行路由决定,看该往那里发出。

  5. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。

  6. 连接跟踪对本地的数据包进行处理。

  7. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。

  8. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。

  9. 再次进行路由决定。

  10. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。

  11. 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。

  12. 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。

  13. 进入出去的网络接口。完毕。

十、其他常用命令

iptables -F

#清除规则

iptables -A INPUT -s ! 189.25.89.0/23 -m state --state NEW -p tcp -m multiport --dport 23,110 -j DROP

#除189.25.89.0之外的主机,new状态,23,110端口数据包drop

iptables -A INPUT -s 0/0 -m state --state NEW -p tcp -m multiport --dport 123,110 -j DROP

#这句意思为源地址是0/0的 NEW状态的的TCP数据包都禁止访问我的123和110端口。

iptables -R INPUT 10 -s 192.168.5.20 -p tcp --dport 25 -j ACCEPT

替换INPUT链中的第十条规则

iptables -t filter -L INPUT -vn

#以数字形式详细显示filter表INPUT链的规则

iptables -t nat -A PREROUTING -d 192.168.102.55 -p tcp --dport 90 -j DNAT --to 172.20.11.1:800

#-A PREROUTING 指定在路由前做的。完整的意思是在 NAT TABLE 的路由前处理,目的地为192.168.102.55 的 目的端口为90的我们做DNAT处理,给他转向到172.20.11.1:800那里去。

iptables -t nat -A POSTROUTING -d 172.20.11.1 -j SNAT --to 192.168.102.55

#-A POSTROUTING 路由后。意思为在 NAT TABLE 的路由后处理,凡是目的地为 172.20.11.1 的,我们都给他做SNAT转换,把源地址改写成 192.168.102.55 。

iptables -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP

iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP

iptables -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP

iptables -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP

# 上例中,eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,上述规则用来防止IP欺骗,因为出入eth1的包的ip应该是公共IP

iptables -A INPUT -s 255.255.255.255 -i eth0 -j DROP

iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP

iptables -A INPUT -d 0.0.0.0 -i eth0 -j DROP

# 防止广播包从IP代理服务器进入局域网:

iptables -A INPUT -p tcp -m tcp --sport 5000 -j DROP

iptables -A INPUT -p udp -m udp --sport 5000 -j DROP

iptables -A OUTPUT -p tcp -m tcp --dport 5000 -j DROP

iptables -A OUTPUT -p udp -m udp --dport 5000 -j DROP

# 屏蔽端口 5000

iptables -A input -s ! 192.168.1.0/24 -i eth1 -p tcp -m tcp --dport 3306 -j drop

iptables -A input -s 192.168.1.0/24 -i eth1 -p tcp -m tcp --dport 3306 -j accept

#只允许内网用户访问 MySQL 服务器(就是 3306 端口)

iptables -A INPUT -p tcp -m multiport --dports 110,80,25,139 -j ACCEPT

#允许内网访问邮件,web,samba

iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT

#允许dns连接

iptables -A INPUT -p tcp --dport 1723 -j ACCEPT

iptables -A INPUT -p gre -j ACCEPT

#允许外网vpn连接

ptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP

#为了防止DoS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃

iptables -A INPUT -p icmp -j DROP

#禁止icmp通信-ping 不通

iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE

#内网转发

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-burst 6 -j RETURN

itables -A syn-flood -j REJECT

#防止SYN攻击 轻量

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

#星期一到星期六的8:00-12:30禁止qq通信

iptables -I FORWARD -s 192.168.0.0/24 -m string --string “ay2000.NET” -j DROP

#禁止ay2000.Net连接 !

iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP

iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP

iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP

#禁止BT连接

iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP

#只允许每组ip同时15个80端口转发

sysctl -w net.ipv4.ip_forward=1 &>/dev/null

#打开转发

sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null

#打开 syncookie (轻量级预防 DOS 攻击)

sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null

#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)

sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null

#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)

十一、相关命令操作练习

① 查看iptables当前所有规则的命令

Iptables -L -n –line-numbers

② 禁止来自10.0.0.7 ip地址访问80端口

Iptables -A INPUT -s 10.0.0.7 -p tcp –dport 80 -j DROP

③ 在命令行执行iptables的规则永久生效

/etc/init.d/iptables save

Iptables -save >/etc/sysconfig/iptables

④ 实现把访问10.0.0.3:80的请求转到172.16.1.17:80

Iptables -t nat -A PREROUTING -d 10.0.0.4 –dport 80 -j DANT –to-destination 172.16.1.6:80

⑤ 实现172.16.1.0/24端所有主机通过124.32.54.26外网ip上网

–line-numbers

② 禁止来自10.0.0.7 ip地址访问80端口

Iptables -A INPUT -s 10.0.0.7 -p tcp –dport 80 -j DROP

③ 在命令行执行iptables的规则永久生效

/etc/init.d/iptables save

Iptables -save >/etc/sysconfig/iptables

④ 实现把访问10.0.0.3:80的请求转到172.16.1.17:80

Iptables -t nat -A PREROUTING -d 10.0.0.4 –dport 80 -j DANT –to-destination 172.16.1.6:80

⑤ 实现172.16.1.0/24端所有主机通过124.32.54.26外网ip上网

Iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT –to-source 124.32.54.26

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值