应用态:iptables
内核态:netfilter
使用iptables 命令来操作netfilter,netfilter才是真正的防火墙匹配规则
简述:其中INPUT,OUTPUT链主要用在“主机防火墙”中。即主要针对服务器本机保护的防火墙;而FORWARD,PREROUTING,POSTROUTING链多用在“网络型防火墙”中,例如使用Linux防火墙作为网关服务器在公司与Inetnet之间进行安全控制。
链内部匹配规则:链内部的过滤遵循“匹配即停止”的原则,如果对比完整个链也没有找到和数据包匹配的规则,则会按照链的默认策略进行处理。
入站数据流向:数据包到达防火墙后首先被PREROUTING链处理(是否修改数据包地址等),然后进行路由选择(判断数据包发往何处),如果数据包的目标地址是防火墙本机(如:Internet用户访问网关的Web服务端口),那么内核将其传递给INPUT链进行处理(决定是否允许通过等)。
转发数据流向:来自外界的数据包到达防火墙后首先被PREROUTTING链处理,然后再进行路由选择;如果数据包的目标地址是其他的外部地址(如局域网用户通过网关访问QQ服务器),则内核将其传递给FORWARD链进行处理(允许转发,拦截,丢弃),最后交给POSTROUTING链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT链处理,然后进行路由选择,再交给POSTROUTING链(是否修改数据包的地址等)进行处理。
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
注意
1.不指定表名时,默认指filter表
2.不指定链名时,默认指表内的所有链
3.除非设置链的默认策略,否则必须指定匹配条件
4.选项、链名、控制类型使用大写字母,其余均为小写
查看规则列表
-L:列出所有的规则条目
-n:已数字的形式显示地址,端口信息
-v:已更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则序号
# 查看所有的规则
iptables -L -n
# 查看指定表名的规则
iptables -t nat -L -n -v
—A: 在链的末尾添加新的规则
-I: 在链的开头添加新的规则
默认的时filter表
iptables -t filter -A INPUT -p tcp -j ACCEPT
iptables -I INPUT -p udp -j ACCEPT
iptables -I INPUT 2 -p icmp -j ACCEPT # 在编号为2的头部添加一个规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
iptables -t nat -D INPUT 3
iptables -t filter -F
-P:为指定的链设置默认规则
iptables -t filter -P FORWARD DROP
iptables -P OUTPUT ACCEPT
持久化保存:
service iptables save
导出文件:
iptables-save > 1.iptables
还原文件:
iptables-resore < 1.iptables
可以直接使用,不依赖于其他条件或者扩展
包括网络协议,IP地址,网络接口等条件
协议地址:-p 协议名
地址匹配:-s 源地址 -d 目标地址
接口匹配:-i 入站网卡 -o 出站网卡
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD -p ! icmp -j ACCEPT
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
要求已特定的协议匹配作为前提
包含端口,TCP标记,ICMP类型等条件
常用的隐含匹配条件
端口匹配:--sport 源端口、--dport 目的端口
ICMP类型匹配:--icmp-type ICMP 类型
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
要求已“-m 扩展模块” 的形式明确指出类型
包括多端口,mac地址,IP范围,数据包状态等条件
常用的显示匹配条件
多端口匹配:-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
IP范围匹配: -m iprange --src-range IP范围
MAC地址匹配:-m mac –mac1-source MAC地址
状态匹配:-m state --state 连接状态
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 j ACCEPT
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
iptables -P INPUT DROP
iptables -I INPUT -p tcp -m multiport --dport 80-82,85 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
应用环境:局域网主机共享单个公网IP地址接入Internet
原理:修改数据包的源地址
原理
环境准备
第一台电脑
IP | 网卡 | 网卡模式 |
---|---|---|
192.168.64.129 | eth0 | NAT |
192.168.182.130 | eth1 | 主机模式 |
第二台电脑
IP | 网卡 | 网卡模式 |
---|---|---|
192.168.182.131 | eth0 | 主机模式 |
配置静态地址
DEVICE=eth0
HWADDR=00:0C:29:12:8F:7B
TYPE=Ethernet
UUID=8f842041-d5d1-4b0f-a021-67de410e00a7
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.64.129
NETMASK=255.255.255.0
GATEWAY=192.168.64.2
DNS1=8.8.8.8
DNS2=8.8.8.4
DEVICE=eth1
TYPE=Ethernet
UUID=8f842041-d5d1-4b0f-a021-67de410e00a7
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.182.130
NETMASK=255.255.255.0
DEVICE=eth0
HWADDR=00:0C:29:D7:E9:57
TYPE=Ethernet
UUID=688e7269-d719-4776-82ee-9055383c9c2f
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.182.131
NETMASK=255.255.255.0
GATEWAY=192.168.182.130
USERCTL=no
PEERDNS=yes
IPV6INIT=no
DNS1=8.8.8.8
DNS2=114.114.114.114
条件准备
vim /etc/sysctl.conf
修改为1
然后:执行sysctl -p
最后执行如下语句
iptables -t nat -A POSTROUTING -s 192.168.182.0/24 -o eth0 -j SNAT --to-source 192.168.64.129
或者:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
DNAT策略的典型应用环境 :在Internet中发布位于企业局域网内的服务器
DNAT策略的原理:
目标地址转换,Destination Network Address Translation 修改数据包的目标地址
iptables -t nat -A PREROUTING -i eth0 -d 192.168.64.129 -p tcp --dport 80 -j DNAT --to-destination 192.168.182.130
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.6:22
iptables -t nat -A OUTPUT -p tcp --dport 10350 -j DNAT --to 127.0.0.1:10003