1.iptables
firewalld和iptables有什么不同?
Firewalld和Iptables都是Linux系统中的防火墙软件,主要的不同点如下:
1. Iptables是一个底层的、基于内核的防火墙工具,它使用一种称为Netfilter的内核模块来拦截数据包。而Firewalld是基于Iptables的高级防火墙配置工具,它提供了一个更加简单、易用的接口,可以动态地管理规则,而不需要手动配置iptables规则。
2. Iptables使用一组规则链来过滤数据包。规则链可以包含多个规则,通过对包进行匹配和跟踪,确定是放行还是拦截。而Firewalld采用了一个叫做“zones”的概念,将针对不同网络环境的安全策略组织在一起。
3. Iptables使用一个被称为iptables的用户态工具来管理规则。而Firewalld使用一个名为firewall-cmd的用户态工具,这个工具提供了简单的命令行接口,还支持通过DBus进行远程管理。
包的流向详解
https://blog.csdn.net/qq_38892883/article/details/81252915
理论基础:当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。
iptables实现防火墙功能的原理是:
1.在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数.
2.iptables这款用户空间的软件可以在这5处写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。
iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw–>mangle–>nat–>filter
使用方式区别:放行****80端口
iptables的设置方法
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# 默认位置 /etc/sysconfig/iptables
# 永久保存 iptables-save
firewalld的设置方法
firewall-cmd --permanent --zone=public --add-service=http # 永久添加http服务至public区域
firewall-cmd --reload
或
firewall-cmd --permanent --zone=public --add-port=80/tcp # 永久添加80端口至public区域
firewall-cmd --reload
firewall-cmd --permanent \
--add-rich-rule="rule family="ipv4" source address="192.168.13.0/24" port port="9187" protocol="tcp" accept"
firewalld区域
阻塞区域(block):任何传入的网络数据包都将被阻止。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
注:FirewallD的默认区域是public。
firewalld将9个区域的配置文件(*.xml)保存在/usr/lib/firewalld/zones目录下
iptabels语法
iptables [-t 表名] 选项 [链名] [条件] [-j 动作]
默认为filter表,可以不指定
默认为对应表的所有链,可以不指定
优先级
raw > mangle > nat > filter
** 选项**
添加规则
-A 在链的末尾添加规则
-I 在链的开头添加规则
删除规则
-D 删除指定序号的规则
-F 删除所有规则
查看规则
--line-numbers 显示规则序号
-L 查看所有表和链的规则
-n 以数字形式显示地址、端口等信息
条件
-p 协议名
-s 源地址
-d 目标地址
-i 本机接收数据包使用的网口
-o 本机发送数据包使用的网口
--to-source 本机的
--to-destination
--sport 源端口
--dport 目标端口
--icmp-type icmp类型
动作
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录 syslog 曰志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向
四表(区分大小写)
raw 状态跟踪
mangle 包标记 修改数据包的标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由
nat 地址转换
filter 数据过滤
这四张表是iptables服务功能的分类
五链(区分大小写)
链是IP包传输的方向
INPUT链(入站规则)
匹配进入防火墙本机的ip包,通过路由表后目的地为本机
OUTPUT链(出站规则)
修改本地产生的数据包的目的IP地址
FORWARD链(转发规则)
匹配经过防火墙主机的ip包,过路由表后,目的地不为本机
PREROUTING链(路由前规则)
修改到达防火墙的数据包的目的IP地址
外网访问内网,修改数据包中的目的IP为内网IP
配置DNAT在此添加规则
POSTROUTING链(路由后规则)
修改离开防火墙的的数据包的源IP地址
内网访问外网,修改数据包中的源IP地址为外网地址
配置SNAT在此添加规则
表对应的链
raw表 PREROUTING链、OUTPUT链
mangle表 PREROUTING链、POSTROUTING链、INPUT链、OUTPUT链、FORWARD链
nat表 PREROUTING链、POSTROUTING链、OUTPUT链
filter表 INPUT链、OUTPUT链、FORWARD链
例子
追加规则至filter表中的INPUT链的末尾,允许任何人使用TCP协议访问本机
iptables -t filter -A INPUT -p tcp -j ACCEPT
插入规则至filter表中的INPUT链的开头,允许任何人使用UDP协议访问本机
iptables -I INPUT -p udp -j ACCEPT
插入规则至filter表中的INPUT链的第2行,允许任何人使用ICMP协议访问本机
iptables -I INPUT 2 -p icmp -j ACCEPT
查看INPUT链的规则,显示行号
iptables -nL INPUT --line-numbers
num target prot opt source destination
删除规则,清空所有规则
iptables -F
删除filter表中INPUT链的第3条规则
iptables -D INPUT 3
清空nat表中所有链的防火墙规则
iptables -t nat -F
用叹号!取反
iptables -A OUTPUT -o eth0 -p tcp ! -d xxx.xxx.xxx.xxx -j DROP
扩展规则
语法:
iptables 选项 链名称 -m 扩展模块 --扩展条件 -j 动作
注意:当使用-p选项指定协议后,如果没有指定模块名,默认模块与协议同名
所以,如果扩展匹配条件(带--的这种)依赖的模块正好和-p指定的协议同名,则可以省略-m选项
扩展条件类型
类别 | 选项 | 用法 |
---|---|---|
扩展匹配
|MAC地址匹配 |-m mac --mac-source MAC地址|
|多端口匹配 |-m multiport --dports 目标端口列表
多个端口用逗号间隔,连续端口用冒号间隔
-m multiport --sports 源端口列表| |
|
IP范围匹配|-m iprange --dst-range IP1-IP2
-m iprange --src-range IP1-IP2 | |
例子
根据MAC地址设置过滤规则
# 拒绝52:54:00:00:00:0b通过ssh访问本机
iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 52:54:00:00:00:0b -j DROP
基于多端口设置过滤规则
# 一次性开启20,21,22,25,80,110,143,16501到16800所有的目标端口
iptables -A INPUT -p tcp -m multiport --dports 20:22,25,80,110,143,16501:16800 -j ACCEPT
提示,多端口还可以限制多个源端口,但因为源端口不固定,一般不会使用,限制多个源端口的参数是--sports
根据IP地址范围设置过滤规则
# 允许从192.168.4.10~20登录
iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEP
# 多个扩展匹配条件应当写在其对应模块之后
# --dport这个扩展匹配条件依赖于tcp模块,因为指定的协议与其模块同名,所以没有指定,但是也应当写在对应的模块后边
# 禁止192.168.4.0/24 网段以外的其他主机登录
iptables -A INPUT -p tcp --dport 22 ! -s 192.168.4.0/24 -j DROP
例子
丢弃192.168.4.100发给本机的所有数据包
iptables -A INPUT -s 192.168.4.100 -j DROP
丢弃192.168.2.0/24网络中所有主机发送给本机的所有数据包
iptables -A INPUT -s 192.168.2.0/24 -j DROP
拒绝访问本机22端口
iptables -A INPUT -s 114.212.33.12 -p tcp --dport 22 -j REJECT
echo 0 > /proc/sys/net/ipv4/ip_forward # 关闭路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward # 开启路由转发
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf # 永久生效
禁止其他主机ping本机,允许本机ping其他主机
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
去 echo-request(ping)
回 echo-reply(ping)
SNAT和DNAT基本配置
内网访问外网做SNAT,外网访问内网做DNAT
MASQUERADE是SNAT的特殊情况,当出口IP变化较大时使用该方式
配置SNAT命令基本语法
iptables -t nat -A POSTROUTING -p tcp -s 本机内网地址 -o 网口 -j SNAT --to-source 外网地址
把10.0网段通过192.168.5.3转发出去
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth1 -j SNAT --to-source 192.168.5.3
把10.0网段通过192.168.5.3或192.168.5.4或192.168.5.5转发出去
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth1 -j SNAT --to-source 192.168.5.3-192.168.5.5
把10.0网段通过eth0的IP转发出去,MASQUERADE自动获取eth0的ip
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth1 -j SNAT MASQUERADE
配置DNAT命令基本语法
iptables -t nat -A PREROUTING -p 协议 -i 网口 --dport 端口 -j DNAT --to-destination IP:端口
把202.202.202.1的访问转发到内网192.168.0.101上
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1
iptables-save > /etc/init.d/iptables
iptables-save > iptables.bak
iptables-save -t filter > iptables-filter.bak
/etc/init.d/iptables save
配置SNAT实现共享上网
设置防火墙规则,允许位于局域网中的主机访问外网
步骤一:搭建内外网案例环境
主机名要求 | 网卡、IP地址以及网关设置要求 |
---|---|
client | 网关:192.168.4.5 |
eth0:192.168.4.100 内网 | |
proxy | eth1:192.168.2.5 |
eth0:192.168.4.5 | |
web1 | 网关:192.168.2.5 |
eth1:192.168.2.100 外网 |
Client(4.100) proxy(4.5、2.5) web1(2.100)
现在,在外部网络中有一台web服务器192.168.2.100,因为设置了网关,client已经可以访问此web服务器了。但,如果查看web1的日志就会发现,日志里记录的是192.168.4.100在访问网页。我们需要实现的效果是,client可以访问web服务器,但要伪装为192.168.2.5后再访问web服务器(模拟所有位于公司内部的电脑都使用的是私有IP,希望访问外网,就需要伪装为公司的外网IP后才可以)。
设置client的网关
systemctl stop NetworkManager
route add default gw 192.168.4.5 #
route -n
设置web1的网关
systemctl stop NetworkManager
route add default gw 192.168.2.52
route -n
设置防火墙规则,实现IP地址的伪装(SNAT源地址转换)
proxy主机开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
设置防火墙规则,实现SNAT地址转换
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.2.5
登陆web主机查看日志
tail /var/log/httpd/access_log
192.168.2.5 - - [12/Aug/2018:17:57:10 +0800] "GET / HTTP/1.1" 200 27 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
通过日志会发现,客户端是先伪装为了192.168.2.5之后再访问的web服务器
对于proxy外网IP不固定的情况可以执行下面的地址伪装,动态伪装IP
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j MASQUERADE
最后,所有iptables规则都是临时规则,如果需要永久保留规则需要执行如下命令:
service iptables save
iptables-save > /etc/sysconfig/iptables
标签:iptables,--,192.168,规则,INPUT,数据包 From: https://www.cnblogs.com/lixunblogs/p/18167286