赞
踩
netfilter
位于Linux内核中的包过滤功能体系
称为Linux防火墙的“内核态’
iptables
位于/sbin/iptables,用来管理防火墙规则的工具
称为Linux防火墙的“用户态’
包过滤的工作层次
主要是网络层,针对IP数据包
体现在对包内的IP地址,端口等信息的处理上
规则链
规则的作用: 对数据包进行过滤或处理
链的作用: 容纳各种防火墙规则
链的分类依据: 处理数据包的不同时机
链就是位置:共有五个
默认包括5种规则链
INPUT: 处理入站数据包
OUTPUT: 处理出站数据包
FORWARD: 处理转发数据包
POSTROUTING链: 在进行路由选择后处理数据包,用于NAT地址转换; (所有的数据包出来的时候都先由这个链处理)
PREROUTING链: 在进行路由选择前处理数据包,用于NAT地址转换;(所有的数据包进来的时候都先由这个链处理)
表就是存储的规则
数据包到了该链处,会去对应表中查询设置的规则,然后决定是否放行,丢弃,转发还是修改等操作
表包含链
链包含规则
CentOS 7默认使用firewalld防火墙,若想使用iptables防火墙,必须先关闭firewalld防火墙
关闭firewalld 防火墙
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
安装iptables防火墙
[root@localhost ~]# yum -y install iptables iptables-services
设置iptables开机启动
[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service
安装iptables防火墙服务
[root@localhost ~]# yum -y installjiptables iptables-services
iptables语法格式
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
//如果不指定表名,则会默认指定filter表
//不指定链名时,默认指表内的所有链
//除非设置链的默认策略,否则必须指定匹配条件
//选项,链名,控制类型使用大写字母,其余均为小写
[root@client ~]# iptables -t filter -I INPUT -p icmp -j REJECT
//指定filter表 指定INPUT链 指定icmp协议 指定控制类型拒绝
iptables常用参数
-P 设置默认策略:iptables
-P INPUT(DROP|ACCEPT)
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加感叹号“!”表示除了这个IP外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号
iptables命令使用总结
所有链名必须大写
INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
所有表名必须小写
filter/nat/mangle
所有动作必须大写
ACCEPT/DROP/SNAT/DNAT/MASQUERADE
所有匹配必须小写
-s/-d/-m <module_name>/-p
数据包的常见控制类型
ACCEPT: 允许通过
DROP: 直接丢弃,不给出任何回应
REJECT: 拒绝通过,必要时给出提示
LOG: 记录日志信息,然后传给下一条规则继续匹配
iptables 的管理选项
添加新的规则
-A: 在链的末尾追加一条规则
-I: 在链的开头(或指定序号) 插入一条规则
[root@client ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[root@client ~]# iptables -I INPUT -p udp -j ACCEPT
[root@client ~]# iptables -I INPUT 2 -p icmp -j ACCEPT //在第二条前插入规则
-L: 列出所有的规则条目
-n: 以数字形式显示地址,端口等信息
-v: 以更详细的方式显示地址,端口等信息
–line-numbers: 查看规则时,显示规则的序号
注意-n L INPUT 不能写成 -Ln INPUT L 要紧跟着链
[root@client ~]# iptables -L -t filter //查看filter列表 Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere ACCEPT icmp -- anywhere anywhere REJECT icmp -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere 192.168.122.0/24 ACCEPT all -- 192.168.122.0/24 anywhere ACCEPT all -- anywhere anywhere REJECT all -- anywhere anywhere REJECT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere ........
[root@client ~]# iptables -nL INPUT //以数字形式查看INPUT链的规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
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:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
[root@client ~]# iptables -nL INPUT --line-number //显示规则的时候显示进程号
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0
.............
删除,清空规则
-D: 删除链内指定序号(或内容)的一条规则; 后面加上序列号
-F: 清空所有的规则
[root@client ~]# iptables -D INPUT 3 '删除INPUT链的序列号为3的规则'
[root@client ~]# iptables -F '默认清空filter表的所有链'
[root@client ~]# iptables -t nat -F '清空NAT表的所有链'
[root@client ~]# iptables -t mangle -F '清空mangle表的所有链'
[root@client ~]# iptables -t raw -F '清空raw表的所有链'
设置默认策略
-P: 为指定的链设置默认规则
[root@client ~]# iptables -t filter -P FORWARD DROP
'filter表的FORWARD的链设置默认规则'
[root@client ~]# iptables -P OUTPUT ACCEPT
'OUTPUT链默认设置接收'
类别 | 选项 | 用途 |
---|---|---|
添加新的规则 | -A | 在链的末尾追加一条规则 |
-l | 在链的开头(或指定序号)插入-条规则 | |
查看规则列表 | -L | 列出所有的规则条目 |
-n | 以数字形式显示地址、端口等信息 | |
-v | 以更详细的方式显示规则信息 | |
–line-numbers | 查看规则时,显示规则的序号 | |
删除,清空规则 | -D | 删除链内指定序号(或内容)的一条规则 |
设置默认策略 | -F | 清空所有的规则 |
-P | 为指定的链设置默认规则 |
通用匹配
可直接使用,不依赖于其他条件或扩展
包括网络协议,IP地址,网络接口
隐含匹配
要求以特定的协议匹配作为前提
包括端口,TCP标记,ICMP类型等条件
显式匹配
要求以" -m 扩展模块" 的形式明确指出类型
包括多端口,MAC地址,IP范围,数据包状态等条件
协议匹配: -p 协议名
地址匹配: -s 源地址,-d 目的地址
接口匹配: -i 入站网卡, -o 出站网卡
[root@client ~]# iptables -I INPUT -p icmp -j DROP '在INPUT链首部插入禁用icmp协议规则' [root@client ~]# iptables -A FORWARD ! -p icmp -j ACCEPT '在FORWARD链尾部天机除了icmp协议的其他协议都允许的规则' [root@client ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT '在FORWARD尾部添加来自192.168.1.1拒绝通过必要时给提示的规则' [root@client ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP '在INPUT链首部插入10.20.30.0/24网段拒绝通过,不给提示信息的规则' [root@client ~]# iptables -A INPUT -i ens33 -s 20.0.0.0/16 -j DROP '在INPUT链首部插入 [root@client ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP '在INPUT链首部插入 指定入站网卡ens33对10.0.0.0/8网段拒绝通过的规则' [root@client ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/12 -j DROP 在INPUT链首部插入 指定入站网卡ens33对172.16.0.0/12的网段拒绝通过' [root@client ~]# iptables -nL INPUT Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 20.0.0.0/16 0.0.0.0/0 DROP all -- 10.0.0.0/8 0.0.0.0/0 DROP all -- 172.16.0.0/12 0.0.0.0/0 '拒绝以上网段通过'
端口匹配: --sport 源端口, -dport 目的端口
ICMP类型匹配: --icmp-type ICMP类型
8:请求 ; 0:回显 ; 3:不可达
[root@client ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
'在中间处理链尾部添加来自192.168.4.0/24 udp协议 目标端口号为53 允许通过防火墙的规则(DNS)'
[root@client ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
'在入口添加端口为tcp,目标端口号为20,21允许通过的规则(FTP)'
[root@client ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@client ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@client ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@client ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@client ~]# iptables -A INPUT -p icmp -j DROP
常用的显示匹配条件
多端口匹配: -m multiport --sports 源端口列表 ; -m multiport --dports 目的端口列表
IP范围匹配: -m iprange --src-range IP范围
MAC地址匹配: -m mac --mac-source MAC地址
状态匹配: -m state --state 连接状态
[root@client ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
[root@client ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
[root@client ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j ACCEPT
[root@client ~]# iptables -P INPUT DROP
[root@client ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
[root@client ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
类别 | 条件类型 | 用法 |
---|---|---|
通用匹配 | 协议匹配 | -p协议名 |
地址匹配 | -s源地址、-d 目的地址 | |
接口匹配 | -i入站网卡、-o出站网卡 | |
隐含匹配 | 端口匹配 | –sport源端口、–dport 目的端口 |
ICMP类型匹配 | –icmp-type ICMP类型 | |
显式匹配 | 多端口匹配 | -m multiport --sports |
IP范围匹配 | -m iprange --src-range IP范围 | |
MAC地址匹配 | -m mac --mac-source MAC地址 | |
状态匹配 | -m state --state 连接状态 |
NAT: network address translation
PREROUTING,INPUT,OUTPUT,POSTROUTING
请求报文:修改源/目标IP,由定义如何修改
响应报文:修改源/目标IP,根据跟踪机制自动实现
·PREROUTING:修改到达防火墙数据包的目的IP地址
·POSTROUTING:修改要离开防火墙数据包的源IP地址
·OUTPUT:修改本地产生的数据包的目的IP地址
应用环境: 局域网主机共享单个公网IP地址介入Internet
snat策略的原理: 源地址转换, Source Network Address Translation
修改数据包源地址
SNAT:source NAT POSTROUTING, INPUT
让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
请求报文:修改源IP
改变数据包的源地址。当内网数据包到达防火墙后,防火墙会使用外部地址替换掉数据包的源IP地址(目的IP地址不变),使网络内部主机能够与网络外部主机通信。
前提条件:
SNAT工作过程:
本机IP 192.168.1.10
网关上的外网IP是111.111.111.111
本机数据包发送到网关,此时源IP是192.168.1.10,网关记录后在POSTROUTING链上把源IP改为111.111.111.111再发送
语法:
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
-t: 指定规则表
-A: 添加一条规则到某一条规则链中
-s: 指定数据包的源IP地址或网段
-o: 指定数据包从哪一块网卡发出去
-j: 指定一个默认策略(动作)来处理数据包
–to-source: 指定执行SNAT策略后数据包的源IP
示例:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 111.111.111.111
如果是动态IP则需要MASQUERADE
如果是动态IP则需要MASQUERADE
MASQUERADE:动态IP,如拨号网络
–to-ports port[-port]
–random
示例:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
DNAT:destination NAT PREROUTING , OUTPUT
把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
请求报文:修改目标IP
改变数据包的目的地址。当防火墙收到来自外网的数据包后,会将该数据包的目的IP地址进行替换(源IP地址不变),重新转发到内网的主机。
DNAT工作过程:
跟SNAT相反,DNAT是网关收到指定端口的数据包后发送到指定内网IP上
语法:
–to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
示例:
iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.10
REDIRECT也可以叫转发,属于NAT表
可用于:PREROUTING OUTPUT 自定义链
通过改变目标IP和端口,将接受的包转发至不同端口
–to-ports port[-port]
示例:
把本机8888收到的数据包转到80端口
iptables -t nat -A PREROUTING -d 192.168.1.10 -p tcp --dport 8888 -j REDIRECT --to-ports 80
环境规划192.168.100.0网段是内网,12.0.0.0网段是外网
选择双网卡,绑定VM1
[root@firewalld network-scripts]# vim ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO="static" DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=8fe99cb4-16c9-430d-90cb-13ed27b80c3e DEVICE=ens33 ONBOOT=yes IPADDR=192.168.100.1 PREFIX=24 [root@firewalld network-scripts]# vim ifcfg-ens36 OXY_METHOD=none BROWSER_ONLY=no BOOTPROTO="static" DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens36 DEVICE=ens36 ONBOOT=yes IPADDR=12.0.0.1 PREFIX=24 [root@firewalld network-scripts]# systemctl restart network
[root@firewalld ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 //开启路由转发功能
[root@firewalld ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@firewalld ~]# iptables -F //清空防火墙规则
[root@firewalld ~]# iptables -t nat -F //清空NAT表防火墙规则,等会自己定义规则
[root@internal ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=e927c915-1f32-4f8e-b4d4-77c7a3ed4823 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.100.10 PREFIX=24 GATEWAY=192.168.100.1 [root@internal ~]# systemctl restart network [root@internal ~]# ping 192.168.100.1 PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data. 64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.861 ms 64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=1.12 ms 64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=1.49 ms ^C --- 192.168.100.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.861/1.160/1.493/0.259 ms [root@internal ~]# ping 12.0.0.1 PING 12.0.0.1 (12.0.0.1) 56(84) bytes of data. 64 bytes from 12.0.0.1: icmp_seq=1 ttl=64 time=0.658 ms 64 bytes from 12.0.0.1: icmp_seq=2 ttl=64 time=1.21 ms 64 bytes from 12.0.0.1: icmp_seq=3 ttl=64 time=0.634 ms ^C --- 12.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2007ms rtt min/avg/max/mdev = 0.634/0.834/1.210/0.266 ms [root@internal ~]#
[root@extenal ~]# yum install -y httpd
[root@extenal ~]# systemctl start httpd
[root@extenal ~]# iptables -F
[root@extenal ~]# iptables -t nat -F
[root@extenal ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="8fe99cb4-16c9-430d-90cb-13ed27b80c3e" DEVICE="ens33" ONBOOT="yes" IPADDR="12.0.0.12" PREFIX="24" GATEWAY="12.0.0.1" [root@extenal ~]# systemctl restart network
此时内网客户机可以访问外部客户机web界面
//在外部客户机httpd的日志可以看到内网192.168.100.10访问了页面
[root@extenal ~]# cd /var/log/httpd
[root@extenal httpd]# ls
access_log error_log
[root@extenal httpd]# cat access_log
.....
192.168.100.10 - - [30/Jul/2020:19:52:12 +0800] "GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1" 404 238 "http://12.0.0.12/noindex/css/open-sans.css" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
192.168.100.10 - - [30/Jul/2020:19:52:12 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
下面在防火墙上配置NAT转换换成12.0.0.1来去访问外部客户机web
[root@firewalld network-scripts]# iptables -t nat -I POSTROUTING -s 192.168.100.10 -o ens36 -j SNAT --to-source 12.0.0.1
刷新内部访问页面也能够访问
但是再查看外部客户机访问日志,
[root@extenal httpd]# cat access_log
12.0.0.1 - - [30/Jul/2020:19:57:31 +0800] "GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1" 404 240 "http://12.0.0.12/noindex/css/open-sans.css" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
12.0.0.1 - - [30/Jul/2020:19:57:31 +0800] "GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1" 404 238 "http://12.0.0.12/noindex/css/open-sans.css" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
::1 - - [30/Jul/2020:19:57:36 +0800] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) (internal dummy connection)"
[root@internal yum.repos.d]# mkdir bak2
[root@internal yum.repos.d]# mv *.repo bak2
[root@internal yum.repos.d]# vim abc.repo
[abc]
name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0
[root@internal yum.repos.d]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@internal yum.repos.d]# yum install -y httpd
[root@internal yum.repos.d]# vim /var/www/html/index.html
<h1>this is cloud</h1>
[root@internal yum.repos.d]# systemctl start httpd
先自己检查appche页面能否被访问
内部网外部无法访问做地址转换
[root@firewalld network-scripts]# iptables -t nat -I PREROUTING -d 12.0.0.1 -i ens36 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10
[root@internal yum.repos.d]# iptables -F
[root@internal yum.repos.d]# iptables -t nat -F
[root@firewalld network-scripts]# iptables-save > /opt/abc.txt
[root@firewalld network-scripts]# cd /opt
[root@firewalld opt]# ls
abc.txt rh
[root@firewalld opt]# vim abc.txt
[root@firewalld opt]# iptables -t nat -F
[root@firewalld opt]# iptables -F
已经无法访问
[root@firewalld opt]# iptables-restore < /opt/abc.txt
[root@firewalld opt]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere firewalld tcp dpt:http to:192.168.100.10
已经可以访问,实验完毕!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。