- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
iptables 是一个常看常忘的命令,本文试图从应用的角度理解它 。
iptables 是运行在用户空间的应用软件,通过控制 Linux 内核 netfilter 模块,来管理网络数据包的处理和转发 。
在 192.168.64.6 上增加规则:
# -A INPUT: 将规则添加到 INPUT 链,表示处理进入的流量
# -s 192.168.64.7: 指定源 IP 地址,即要阻止的 IP
# -d 192.168.64.6: 指定目标 IP 地址,即后端 IP
# -j DROP: 表示丢弃匹配的流量
iptables -A INPUT -s 192.168.64.7 -d 192.168.64.6 -j DROP
# -j REJECT: 丢弃流量的同时向源 IP 返回一个拒绝消息。请求方直接提示:Connection refused
iptables -A INPUT -s 192.168.64.7 -d 192.168.64.6 -j REJECT
# -p 指定协议类型为 TCP
# --dport 指定目标端口
iptables -A INPUT -s 192.168.64.7 -d 192.168.64.6 -p tcp --dport 80 -j REJECT
# 看当前的 iptables 规则
# -L "list",列出当前的规则
# -n "numeric",即使用数字 IP 地址和端口号而不是主机名和服务名
# -v "verbose",显示详细信息
iptables -L -n -v
# 列出带编号的规则
iptables -L --line-numbers
# 删除 INPUT 链中的第 1 条规则
# 注意!删除成功后序号会改变,需要重新查询序号
iptables -D INPUT 1
# 清除 INPUT 链所有规则
iptables -F INPUT
# 清除当前活跃的表(未指定默认是 filter 表)的所有 iptables 规则
# 等同于 iptables -F -t filter
iptables -F
默认情况下,Linux 系统不会转发目的 IP 地址不是本地网络的 IPv4 数据包。这是出于安全考虑,防止系统意外成为恶意流量的转发表。要启用 IPv4 数据包转发功能,需要修改内核参数 net.ipv4.ip_forward 。
需要注意,上面的命令仅临时启用 IPv4 数据包。需要永久启用转发,需要修改 /etc/sysctl.conf 文件。 在该文件中添加或修改 net.ipv4.ip_forward=1 一行。 然后运行 sudo sysctl -p 应用更改 。
cat /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
# curl 127.0.0.1:8080
# curl 192.168.64.6:8080
# curl: (7) Failed to connect to 127.0.0.1 port 8080 after 1 ms: Couldn't connect to server
# 非本机访问 ok
# curl 192.168.64.6:8080
PREROUTING 链修改的是从外部连接过来时的转发,所以上面的方式本机 curl 127.0.0.1:8080 会提示:Couldn't connect to server 。
如果本机连接到本机的转发,需要修改为 OUTPUT 链:
# 清除已有 nat 规则
# iptables -F -t nat
iptables -t nat -A OUTPUT -p tcp --dport 8080 -j REDIRECT --to-port 80
# 非本机访问失败:
# curl 192.168.64.6:8080
# curl: (7) Failed to connect to 192.168.64.6 port 8080 after 1 ms: Connection refused
# 本机访问 ok
# curl 192.168.64.6:8080
# curl 127.0.0.1:8080
在 192.168.64.6 上增加规则:
# 清除已有 nat 规则
# iptables -F -t nat
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.64.7:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.64.7 --dport 80 -j SNAT --to-source 192.168.64.6
# 清除已有 nat 规则
# iptables -F -t nat
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 106.55.113.110:80
# --to-source 使用公网地址会无法访问
iptables -t nat -A POSTROUTING -p tcp -d 106.55.113.110 --dport 80 -j SNAT --to-source 192.168.64.6
需要注意的是 SNAT 的 --to-source 需要设置为连接公网的网卡对应的内网 IP(通过 ip ad 查询),如果设置为公网 IP,数据包可能被丢弃 。
NAT 目的是为了解决 IPv4 公网 IP 不足的问题:
包含的操作:
举个 NAT 的例子:村民张三需要写信给河南的李四,写完后他在信封上写上,寄件人地址:勤劳村 8 号,收件人地址:河南省孟津县陈倪路 20 号。然后就把这封信投递到村里的邮局。邮递员拿到信件一看,这信要是寄出去,收件人通过 勤劳村 8 号 这个回信肯定没办法寄回村里,于是就将信封上寄件人地址修改为:四川省兴文县勤劳村邮局,再将信件发出,同时在本子上记录发往河南的这封信对应的是 勤劳村 8 号。 李四收到信件就按照信件上的信息编写信封,寄件人地址:河南省孟津县陈倪路 20 号,收件人地址:四川省兴文县勤劳村邮局,这样这封回信就寄到了村里的邮局,邮递员一看到这封信是来自河南,对着笔记本就知道这封信是送往 勤劳村 8 号,于是将收件人地址修改为了 勤劳村 8 号,这样邮递员派件的时候就可以把回信送到张三家 。
详细 NAT 原理可以参考这篇文章:[译] NAT 穿透是如何工作的:技术原理及企业级实践 。
我是按着 使用iptables将ubuntu配置为路由器 进行操作,最后的效果:客户端可以通过连接一台配置了 SNAT 或者 MASQUERADE 的机器访问公网 。
注意:给网关和客户端指定 vmnet15 后还需要手动配置一下 虚拟网络:
网关 IP 配置:
network:
version: 2
ethernets:
ens33: # WAN 接口
dhcp4: true
ens34: # LAN 接口
dhcp4: no
addresses: [10.1.2.1/24]
客户端配置:
network:
version: 2
ethernets:
ens33:
dhcp4: no
addresses: [10.1.2.2/24]
gateway4: 10.1.2.1 # 网关
nameservers:
addresses: [114.114.114.114]
在网关机器上进行 iptables 的配置:
sudo sysctl -w net.ipv4.ip_forward=1
# 将 10.1.2.0/24 网络中的所有主机伪装成 192.168.184.131 这个公网IP地址,以便它们可以访问外部网络
# -o ens33: 匹配通过 ens33 接口出站的数据包
iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -o ens33 -j SNAT --to-source 192.168.184.131
这条命令允许内部网络的设备通过网关访问互联网。内部设备的 IP 地址在数据包离开网关时被替换为网关的公共 IP 地址,从而使外部网络只看到网关的 IP 地址,除了 SNAT 还可以使用 MASQUERADE,二者效果类似 。
iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -j MASQUERADE
表
链:
数据包的不同场景:
图片来自:从零开始认识 iptables 。
表包含若干个链:
看到这些排列组合,可能已经凌乱了,可以看下面的这张图,conntrack 理解为 raw 表,来自:Netfilter Kernel (Packet) Traversal 。
Netfilter 内核数据包遍历就像保卫萝卜(塔防游戏)一样,数据包就像游戏中的怪物,会按照特定的路径移动,链就像在特定位置安置的炮塔,当数据包经过某个链时,链就会对数据包进行一些操作,链中包含若干条规则 。
既然已经有了链,可以在数据包的不同阶段执行特定操作,为什么还需要表呢?原因是不同规则的执行顺序可能会影响结果。比如,有两条规则:
如果先执行 SNAT,过滤操作会基于 SNAT 修改后的 IP 和端口进行匹配。但如果先执行过滤,数据包可能在 SNAT 应用之前就被过滤掉了。每个表的操作结果都会影响后续表的处理,所以 表的作用是将规则按照功能进行分类,避免执行顺序导致规则失效。表的处理顺序:raw -> mangle -> nat -> filter 。
注意:相同表中相同链中如果多个规则匹配同一个数据包,则只有第一个匹配的规则会被执行 。
需要注意的是,在使用 iptables 命令时,如果没有指定表,默认表是 filter(最后处理的那个表) 。
# 手动指定 -t 为 nat 表
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
iptables 规则存储在内存中,系统重启后规则会丢失,可以安装 iptables-persistent 来持久化规则,规则保存在 /etc/iptables/rules.v4 。
sudo apt update
sudo apt install iptables-persistent
配置好 iptables 规则后,需要手动运行以下命令持久化规则:
sudo netfilter-persistent save
iptables - wiki iptables的四表五链与NAT工作原理 iptables做TCP/UDP端口转发【转】 通过iptables实现端口转发和内网共享上网 iptables error: unknown option --dport How iptables tables and chains are traversed [译] NAT - 网络地址转换(2016) [译] 深入理解 iptables 和 netfilter 架构 VMware实现iptables NAT及端口映射 。
最后此篇关于重拾iptables的文章就讲到这里了,如果你想了解更多关于重拾iptables的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我已经为启用了完整 netfilter 功能的 android 模拟器编译了 Linux。从源代码构建 android 后得到一个 iptables 二进制文件。 当我将这个二进制文件推送到模拟器时
由于大量机器人每秒访问我的 Web 服务器太多次,我进入我的服务器并发出以下命令,试图在 5 秒内将连接限制为最多 25 个。我可能需要更严格,但我不是因为我有一个很少访问的页面,它请求 50 个图像
我正在尝试阻止在短时间内打开大量连接的网络机器人。我正在使用这个语法: -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
我正在尝试在 iptables 中记录一些来自恶意 IP 地址的丢弃数据包,这些 IP 地址不断攻击我的服务器。 来自这个恶意 IP 的所有内容都被丢弃,我不再在 Web 服务器日志中看到它,这是一件
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我已经设置了 keepalived,只有当我停止 iptables 服务时它才能正常工作。我的iptables配置是这样的,请告诉我应该为keepalived添加什么规则 # Firewall con
我使用 DevStack 在 RHEL6 上安装了 OpenStack,并且运行良好。有一天,我们的一位“系统管理员”注意到 iptables 正在系统上运行,并决定将其关闭(chkconfig ip
测试环境为: 2 操作系统 ubuntu server 10.04 安装在 VirtualBox 上 iptables v1.4.4 已加载 ip_conntrack 模块 这些是我的测试规则:
当我清除 IPtables 然后添加以下规则时,传入连接可以毫无问题地连接到端口 1234 上的我的 KVM VM。 -A PREROUTING -i br0 -p tcp -m tcp --dpor
我正在为我的工作使用 iptables 最近的匹配项,因为它保存了 ip 地址和我需要的最后一次看到的值。 但是现在我需要从 iptables 最近的列表中删除一些条目,这些条目位于 ipset 中。
所以我加了 sudo iptables -t raw -A PREROUTING -p tcp --dport 25 -j TRACE 也 sudo iptables -t raw -A OUTPUT
我在专用的 ubuntu 服务器上有一个防火墙(基于 iptables)。我有几个 LAN 客户端。 在我的一个 LAN 客户端上,我正在运行可以根据 IP 限制访问的软件。对我来说,重要的是我可以通
我不知道如何解决我的问题。 是否可以使用 ipq_set_verdict() 重定向捕获的数据包? 我想将未经授权的用户重定向到登录页面。 请看我的代码: 数据包被接受,我的浏览器打开请求的页面(未更
我正在尝试使用字符串匹配模块获取“from”和“to”偏移量以在我的 iptables 规则中使用。这是我从 tcpdump 工具输出的数据包: listening on eth0, link-typ
我正在尝试使用 python-iptables 编写脚本来设置某些规则。我弄清楚了如何设置规则以允许所有连接和拒绝所有连接,但我需要弄清楚如何编写规则以允许已建立的连接。 例如,我需要使用 pytho
这是规则集: #!/bin/sh iptables-restore -v<
我正在尝试将数据从 xml 加载到 iptables。我正在使用以下命令: xsltproc /usr/share/iptables/iptables.xslt myiptable.xml | ipt
我正在尝试设置 iptable 规则,但在使用 iptable 时收到以下错误消息: iptables v1.4.14: can't initialize iptables table `nat':
我正在从 Windows Bash 运行 Ubuntu 18.04: uname -a Linux DESKTOP-M87DGAS 4.4.0-17134-Microsoft #112-Microso
有一个 IP(来自中国)试图下载我的整个网站。它下载我所有的页面并显着加载服务器(我有超过 500 000 个页面)。查看访问日志,我可以看出它绝对不是 Google 机器人或任何其他搜索引擎机器人。
我是一名优秀的程序员,十分优秀!