1-iptables

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

f64dc67b87afe2e63138dbb22aef26fe.png

使用方式区别:放行****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,1650116800所有的目标端口
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.310.0网段通过192.168.5.3192.168.5.4192.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.510.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

posted @   立勋  阅读(66)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示