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地址。
在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规则:
在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
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
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
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
转载于:https://blog.51cto.com/1216621479/1283353