iptables防火墙配置

iptables是Linux防火墙的管理工具,位于/sbin/iptables。实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构,由四张规则表和五个链完成数据包的检查和转发。

规则表:

1. filter表三个链:INPUT、FORWARD、OUTPUT

作用:过滤数据包内核模块:iptables_filter.

2. Nat表三个链:PREROUTING、POSTROUTING、OUTPUT

作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

3. Mangle表五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS 内核模块:iptable_mangle

4. Raw表两个链:OUTPUT、PREROUTING

作用:决定数据包是否被状态跟踪机制处理内核模块:iptable_raw

规则表之间的优先顺序:Raw——mangle——nat——filter

规则链:

1. INPUT——进入防火墙的数据包应用此规则链中的策略

2. OUTPUT——防火墙自身发出的数据包应用此规则链中的策略

3. FORWARD——防火墙转发数据包时应用此规则链中的策略

4. PREROUTING——数据包作路由选择前应用此链的策略,所有进防火墙数据包先应用此链

5. POSTROUTING——对数据包作路由选择后应用此链中的规则

规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向PREROUTING(DNAT地址转换)à路由选择 à INPUT

从外界到达防火墙的数据包,先被PREROUTING规则链处理(DNAT,是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的WEB应用程序

第二种情况:出站数据流向OUTPUT à路由选择 à POSTROUTING(SNAT地址转换)

防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(SNAT,是否修改数据包的地址等)进行处理。

第三种情况:转发数据流向

PREROUTING(DNAT地址转换)à路由选择 à FORWARD à POSTROUTING(SNAT地址转换)

来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址不是本机,则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。


Iptables的基本语法格式

Iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作]

表名、链名用于指定iptables命令所操作的表和链

命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看)

条件匹配用于指定对符合什么样条件的数据包进行处理(源、目的、接口等)

目标动作用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump、LOG)

Iptables命令选项:

-A 在指定链的末尾添加(append)一条新的规则

-D删除(delete)指定链中的某一条规则,可以按规则序号和内容删除

-I在指定链中插入(insert)一条新的规则,默认在第一行添加

-R修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换

-L列出(list)指定链中所有的规则进行查看

-F清空(flush)

-N新建(new-chain)一条用户自己定义的规则链

-X删除指定表中用户自定义的规则链(delete-chain)

-P设置指定链的默认策略(policy)

-n使用数字形式(numeric)显示输出结果

-v查看规则表详细信息(verbose)的信息

-V查看版本(version)

-h获取帮助(help)

Iptables目标动作:

ACCEPT 允许数据包通过

DROP 直接丢弃数据包,不给任何回应信息

REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。

LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

条件匹配:

-p <协议类型>:指定上一层协议,可以是icmp、tcp、udp和all。
-s <IP地址/掩码>:指定源IP地址或子网。
-d <IP地址/掩码>:指定目的IP地址或子网。
-i <网络接口>:指定数据包进入的网络接口名称。
-o <网络接口>:指定数据包出去的网络接口名称。
-p tcp --sport <port>:指定TCP数据包的源端口。
-p tcp --dport <port>:指定TCP数据包的目的端口。
-p tcp --syn:具有SYN标志的TCP数据包,该数据包要发起一个新的TCP连接。
-p udp --sport <port>:指定UDP数据包的源端口。
-p udp --dport <port>:指定UDP数据包的目的端口。
-p icmp --icmp-type <type>:指定icmp数据包的类型,可以是echo-reply、echo-request


iptables
服务启动脚本/etc/rc.d/init.d/iptables
配置文件位置 /etc/sysconfig/iptables-config
策略文件位置 /etc/sysconfig/iptables (默认文件不存在)
iptables命令即时生效,但是不保存,iptables-save保存到/etc/sysconfig/iptables
将iptables策略文件/etc/sysconfig/iptables恢复到当前系统中iptables-restore

Iptables 主机防火墙
基于单个服务器防火墙的配置主要包括回环口的处理、状态检测以及协议和端口的处理。
例如一个普通的web服务器的典型防护配置:
iptables -A INPUT -i lo -j ACCEPT \\允许访问服务器的lo回环口
iptables -A INPUT -p tcp -m multiport --port 22,80 -j ACCEPT \\开放服务器的22和80端口
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT \\状态检测,允许建立连接和相关连接
iptables -P INPUT DROP \\不匹配以上条件的数据包全部丢弃
这里涉及到iptables防火墙的一些 [扩展规则],iptables软件包提供了一套扩展的规则选项。使用时需要通过-m选项指定模块的名称,再使用该模块提供的选项。下面列出几个模块名称和其中的选项,大部分的选项也可以通过"!"取反。
-m multiport--sports <port, port, …>
功能:指定数据包的多个源端口,也可以以port1:port2的形式指定一个端口范围。
-m multiport --dports <port, port, …>
功能:指定数据包的多个目的端口,也可以以port1:port2的形式指定一个端口范围。
-m multiport --ports <port, port, …>
功能:指定数据包的多个端口,包括源端口和目的端口,也可以以port1:port2的形式指定一个端口范围。
-m state --state <state>
功能:指定满足某一种状态的数据包,state可以是INVALID、ESTABLISHED、NEW和RELATED等,也可以是它们的组合,用","分隔。

-m connlimit --connlimit-above <n>
功能:用于限制客户端到一台主机的TCP并发连接总数,n是一个数值。

-m mac --mac-source <address>
功能:指定数据包的源MAC地址。

160215697.jpg

在RHEL-B上输入刚才的4条命令
iptables -A INPUT -ilo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --port 22,80 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP

查看INPUT规则:

160226634.jpg

RHEL-B上开启vsftpd和httpd服务(分别为21端口和80端口)
service httpd start
service vsftpd start

RHEL-A上使用命令测试,发现都是成功的
telnet 192.168.20.180
telnet 192.168.20.1 22

使用ftp命令去连接
ftp 192.168.20.1
发现许久连接不上,说明ftp的21端口没有开启。当然如果去ping的话,也是失败的。这意味着iptables防火墙的命令生效,只开放了ssh和http服务。
保存刚才的iptables策略,即会生成/etc/sysconfig/iptables文件
service iptablessave
160248120.jpg

iptables网关防火墙

1、SNAT内部私网地址上网 在POSTROUTING链中定义。规则的处理是在路由完成后进行

内网10.10.1.0/24出去的数据包其源IP地址转换成外网接口eth0的IP地址218.75.26.35

iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o eth0 -jSNAT --to-source 218.75.26.35
内网10.10.1.0/24出去的数据包其源IP地址转换成外网接口eth0的IP地址(动态)

iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o ppp0 -jMASQUERADE
2
、DNAT内部服务器发布在PREROUTING链中定义。规则的处理是在路由之前处理的

内网服务器 10.10.2.3公网地址 218.75.26.34 映射

iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32-j DNAT --to 10.10.2.3

内网服务器 10.10.2.3公网地址 218.75.26.34映射某一个端口

iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32-p tcp --dport 80 -j DNAT --to 10.10.2.3:80
案例:RHEL-A RHEL-C是X公司;RHEL-B是Y公司的FTP服务器;Router是ISP

160311159.jpg

RHEL-C# echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s192.168.10.0/24 -o eth1 -j SNAT --to-source 198.2.3.2

# SNAT,解决内部上网

iptables -t nat -A PREROUTING -i eth1 -d 198.2.3.2/32 -ptcp --dport 80 -j DNAT --to 192.168.10.1:80

# DNAT,映射某一端口,对外发布应用

route add -net 0.0.0.0 netmask 0.0.0.0 gw 198.2.3.1

160324368.jpg

RHEL-A#

vim /etc/sysconfig/network-script/ifcfg-eth0

GATEWAY=192.168.10.20

或 route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.10.20

# 如果没有其他问题的话,RHEL-A是可以Ping通外网以及RHEL-B的ftp

RHEL-B#

route add –net 0.0.0.0 netmask 0.0.0.0 gw 203.2.3.1

# B应该可以访问A的WEB