iptables基本知识

1)Linux下的防火墙概念

a、一般谈到Linux下的防火墙,我们都会首先想到iptables,其实更确切的叫法应该是Netfilter/iptables,iptables和Netfilter其实是存在差别的。

b、尽管它们经常被用来相互替换使用,Netfilter是用来实现Linux内核中防火墙的Linux内核空间程序代码段,它要么被直接编译进内核,要么被包含在模块中。

c、而iptables是用来管理Netfilter防火墙的用户程序,而我这里提到的iptables是包含Netfiler和iptables。

d、Netfilter/iptables是基于包过滤的防火墙,主要是针对2-4层,另外,iptables也支持7层控制。

2)iptables的组成部分:

iptables有四个表和五个链以及一些规则组成:

四个表:filter、nat、mangle、raw

filter表(过滤规则表),nat表(地址转换规则表),mangle(修改数据标记位规则表),raw(跟踪数据表规则表)

其中最常用的是filter表以及nat表

五个链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING

iptables的命令语法:

iptables [-t 表名]<-A|-I|-D|-R>链名[规则编号][-i|-o 网卡名称][-p 协议类型][-s 源IP地址|源子网][–sport 源端口号][-d 目标IP地址|目标子网][–dport 目标端口号]<-j 动作>

3)参数及动作信息

-A 追加防火墙规则

-D 删除防火墙规则

-I 插入防火墙规则

-F 清空防火墙规则

-L 列出防火墙规则

-R 替换防火墙规则

-Z 清空防火墙数据表统计信息

-P 设置链默认规则

匹配参数:

-p                  匹配协议

-s                 匹配源地址

-d                 匹配目标地址

-i                  匹配入站网卡接口

-o                 匹配出站网卡接口

–sport               匹配源端口

–dport               匹配目标端口

–src-range             匹配源地址范围

–dst-range            匹配目标地址范围

–limit              匹配数据表速率

–mac-source            匹配源MAC地址

–state              匹配状态(INVALID、ESTABLISHED、NEW、RELATED)

–string              匹配应用层字串

触发动作:

ACCEPT 允许数据包通过

DROP 丢弃数据包

REJECT 拒绝数据包通过,并发回封包通知对方

LOG 将数据包信息记录syslog日志

DNAT 目标地址转换

SNAT 源地址转换(适用于静态IP)

MASQUERADE 地址欺骗(只能用于ADSL拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的)

REDIRECT 重定向,将数据包重定向到本机或另外主机的某一个端口,通常能实现透明代理或者对外开放内网的某些服务

4)常用的命令

a、查看filter表的所有规则:

[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

b、清空filter表的所有规则:

[root@localhost ~]# iptables -F

c、查看nat表的所有规则:

[root@localhost ~]# iptables -t nat -n -L

# 记录10.10.10.1访问主机80端口的日志信息(/var/log/messages)

[root@localhost ~]# iptables -I INPUT -s 10.10.10.1 -p tcp --dport 80 -j LOG
[root@localhost ~]# tail -10 /var/log/messages
Jul 13 14:44:53 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10253 DF PROTO=TCP SPT=62700 DPT=80 WINDOW=253 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:55 localhost chronyd[829]: Selected source 202.118.1.130
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10256 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10257 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10258 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10259 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10260 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10261 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10262 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10263 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0

# 将来自10.10.10.0/24网段的主机并访问80端口的请求给予拒绝

[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

  

# 禁止10.10.10.0/24网段内的主机ping。ICMP类型为8

[root@localhost ~]# iptables -A INPUT -s 10.10.10.0/24 -p icmp --icmp-type 8 -j DROP
说明:禁止10.10.10.0/24网段内的主机ping

# 查看filter表中防火墙规则并显示规则编号:

[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
3    DROP       icmp --  10.10.10.0/24        0.0.0.0/0            icmptype 8
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# -D参数,删除INPUT链的第三条规则:  

[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# -R参数,替换第二条规则       

[root@localhost ~]# iptables -R INPUT 2 ! -s 10.10.10.1 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    ACCEPT     tcp  -- !10.10.10.1           0.0.0.0/0            tcp dpt:80
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# 查看iptables的版本号:

[root@localhost ~]# iptables -V
iptables v1.4.21
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# CentOS7下iptables的安装:

CentOS 7 默认使用firewalld来管理iptables规则,由于防火墙规则变动的情况很少,动不动态变得无所谓了。但是总是感觉不太习惯。
使用下面的办法来恢复原来的习惯,同时解决iptables开机启动的问题。
# yum install iptables-services -y
# systemctl enable iptables
这样的话,iptables服务会开机启动,自动从/etc/sysconfig/iptables 文件导入规则。
为了让/etc/init.d/iptables save 这条命令生效,需要这么做
# cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables
# /etc/init.d/iptables save
而chkconfig iptables 命令会自动重定向到sytemctl enable iptables

# 定义iptables默认策略

默认策略的定义格式为:

iptables [-t 表名] <-P> <链名> <动作>

查看iptables的状态

[root@ip-172-31-22-8 ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

  

5)iptables的状态state

下面解释iptables的几种状态:

NEW:如果你的主机向远程主机发出一个请求连接,这个数据包的状态就是NEW

ESTABLISHED:已建立的连接(完成TCP的三次握手后),远程主机和你的主机通信数据状态为ESTABLISHED

RELATED:正在启动新连接,比如FTP服务传输,21端口负责传送命令,20端口负责传输数据,在已有的21端口建立好连接后发生命令,这时候20端口或其他端口传送FTP-DATA,状态就是RELEATED

INVALID:非法或无法识别的数据包,不能被识别属于哪个连接或者没有任何状态,通常这种状态包会被丢弃

iptables脚本的基本模板:

#!/bin/bash
#created by molewan 2016/07/16
#email:molewan@163.com
iptables -F
iptables -F -t nat
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

6)生产环境中我们如何维护我们的iptables

系统运维人员在维护iptables的时候,经常会发现误操作了iptables导致无法进入了系统,这个时候只有去机房重启iptables,其实这个也是有办法解决的,可以通过配置

计划任务的方式来处理:

[root@ip-172-31-22-8 ~]# crontab -l
*/5 * * * * /etc/init.d/iptables stop

7)iptables防火墙应用案例:

案例1:允许任意客户端访问主机的日常服务(HTTP、HTTPS、DNS、NTP、SMTP、POPS3、SSH)

[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp --dport 25 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -P tcp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 143 -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
[root@localhost ~]# iptables -P FORWARD DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:143
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@localhost ~]# cat /etc/services #可以在此文件中查看服务的名称

案例2:公司拥有一个公有IP,使用防火墙实现局域网中所有主机通过SNAT共享上网。

原理:使用CentOS7作为公司软路由,将内网192.168.0.0/24的数据包源地址修改为路由器上的公有IP 124.126.199.84

,使用SNAT规则,以及NAT表的POSTROUTING链

先开启系统上的路由转发:

# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84

案例3:公司对外有一个公网IP,公司内部有HTTP、MAIL两台核心服务器,通过防火墙实现客户可以从互联网的任意位置访问公司内部的两台服务器资源

拓扑;
Internet <--124.126.199.84(防火墙)-->192.168.0.0/24
http:192.168.0.100
postfix:192.168.0.101
处理过程:
开启路由转发:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
针对80端口的
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
针对25端口和110端口
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101

案例4:目前网络的攻击手法层出不穷,很多攻击会采用发生大量无效的数据包给服务器,造成服务器无法响应正常的请求包,iptables

提供了一个limit扩展功能,可以限制单位时间内数据包的个数。下面的规则是当每秒钟数据包个数为500接受入站连接,负责拒绝连接。

[root@localhost ~]# iptables -I INPUT -m limit --limit 500/sec -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            limit: avg 500/sec burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:143
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source

案例5:根据数据连接状态设置防火墙规则,放行所有出站数据包,拒绝入站的新连接请求和无效连接,放行入站的回应请求

[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -Z
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -I INPUT -m state --state NEW -j DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

案例6:公司采用基于Linux的软路由设备,要求在路由设备上设置防火墙规格,记录10.0.0.1至10.0.0.128地址段内所有的主机发送给路由要求转发的数据包,并允许转发这些数据包

[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j LOG
[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j ACCEPT[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

一次性允许多端口通过:

[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp -m multiport --dport 21,22,23,80 -j ACCEPT
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            multiport dports 21,22,23,80
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

原创文章,作者:Net21-冰冻vs西瓜,如若转载,请注明出处:http://www.178linux.com/24293

(0)
上一篇 2016-07-16 22:29
下一篇 2016-07-16 22:29

相关推荐

  • tcpdump诊断nginx问题

    自从上级公司离职后,快一年的时间没有写php程序和搭建LNMP环境,一直在做db运维和运维工具开发方面的事情。 最近决定开发开发一些自动话方面工具,重新拾起php,于是在测试机上搭建一个LNMP环境。 1、 nginx 404错误 一般的出现404错误,找不到页面资源。首先用strace排除了存在文件访问权限的问题,其次nginx的root参数设置也没有任何…

    Linux干货 2016-05-03
  • Centos6搭建vsftpd手册

    1、开启防火墙ftp端口vi /etc/sysconfig/iptables     #编辑防火墙配置文件 1 -A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT(允许21端口通过防火墙) 2 -A INPUT -m st…

    Linux干货 2017-04-26
  • 选择判断专题脚本编程_第九周练习

    Q1:写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash # declare -i y=0 declare -i n=0 for i in $(cut…

    Linux干货 2016-12-25
  • 第二周博客作业

    1.linux上的文件管理类命令都用哪些,其常用的使用方法及其相关示例演示。 常用命令有:cp, mv, rm 复制命令:cp cp [OPTION]… [-T] SOURCE DEST                 cp [OPTION]… SOURC…

    Linux干货 2016-06-23
  • Bash 的配置文件

    有时候,在定义了别名 alilas cls=clear  , 或者定义了 umask=033 等等,在logout 用户后再登录,会失效,因为这些本地变量,仅对当前shell生效。而要保留配置,使其永久生效,就需要将这些定义的写入配置文件中保存。下面介绍下bash的配置文件:  Bash的配置文件可以分为: profile类: /etc/…

    Linux干货 2015-04-04
  • Haproxy+Keepalived+Varnish+LAMP+Memcacked+NFS 实现WordPress站点的动静分离

    详细说明,请点击CSDN博客的连接地址:http://blog.csdn.net/yhy1271927580/article/details/70195158

    2017-04-16