AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[iptables](unix)

Martin Hope
Jader Dias
Asked: 2025-02-24 05:37:46 +0800 CST

当目标是我自己的 IP 地址时,如何使用 iptables 重定向端口?

  • 6

我已使用 iptables PREROUTING 表成功将传入请求从端口 53 重定向到 3053

我已经使用 iptables OUTPUT 表成功将本地请求从端口 53 重定向到 3053,只要它们使用环回接口

但使用 eth0 IPv4 地址的本地请求会忽略这两个重定向。如何解决?

我尝试过 DNAT,指定目标 IP、接口,但都不起作用

sudo iptables-save
# Generated by iptables-save v1.8.9 (nf_tables) on Sun Feb 23 21:29:58 2025
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [3765:300383]
:INPUT ACCEPT [3760:298404]
:OUTPUT ACCEPT [54136:75736197]
:POSTROUTING ACCEPT [54072:75544537]
-A PREROUTING -p udp -m udp --dport 53 -j REDIRECT --to-ports 3053
-A OUTPUT -o lo -p udp -m udp --dport 53 -j REDIRECT --to-ports 3053
COMMIT

如何使用容器重现错误

FROM alpine:latest

RUN apk add --no-cache iptables netcat-openbsd socat
podman build -t udp-redirect .

podman run --rm -it --privileged --sysctl net.ipv4.conf.all.route_localnet=1  --name udp-redirect udp-redirect sh

socat -T 1 UDP-LISTEN:3053,fork EXEC:"echo -n 'Hello world'" &

iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 127.0.0.1:3053

echo -n "Test1" | nc -u -w1 10.0.2.100 53
iptables
  • 1 个回答
  • 79 Views
Martin Hope
incubus
Asked: 2025-01-09 01:50:23 +0800 CST

iptables-save 的行为似乎不一致

  • 6

我最近一直在使用该iptables-save命令(与 结合使用iptables-restore),并注意到一些我不明白的不一致行为。我确信这不是一个错误,因为它是一个太流行的命令,不可能被忽视,这意味着我自己的理解存在缺陷。我查看了手册页和各种文档来源,但找不到任何可以解释我所观察到的内容。

问题是,当我运行命令时iptables-save,我希望看到filter表转储到 stdout(根据文档)。但实际上我看到的什么都没有,例如:

[root@rhel9 ~]# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@rhel9 ~]# 
...
[root@rhel9 ~]# iptables-save
[root@rhel9 ~]# 

stdout如您所见,命令没有任何输出。同样,如果我运行命令并尝试重定向输出或传递-f <output file>选项,输出仍然是空白的。

如果我指定了我想要查看的表,我会得到输出,例如:

[root@rhel9 ~]# iptables-save -t filter
# Generated by iptables-save v1.8.8 (nf_tables) on Wed Jan  8 16:43:11 2025
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Wed Jan  8 16:43:11 2025

如果我将此输出保存到文件,ipv4backup然后调用iptables-restore该文件,则行为iptables-save会有所不同:

[root@rhel9 ~]# iptables-restore ipv4backup
[root@rhel9 ~]# 
[root@rhel9 ~]# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@rhel9 ~]# 
[root@rhel9 ~]# iptables-save
# Generated by iptables-save v1.8.8 (nf_tables) on Wed Jan  8 16:44:03 2025
*filter
:INPUT ACCEPT [5:305]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5:914]
COMMIT
# Completed on Wed Jan  8 16:44:03 2025

iptables-save上面的示例中的表包含相同的内容,但是根据是否iptables-restore事先调用,其行为有所不同。

我在 RHEL9 和 Ubuntu 22.04 上对此进行了测试,两者都表现出相同的行为。在 SuSE 15 上,该命令运行并生成所有表的输出,无论iptables-restore之前是否运行过。等效ip6tables...命令表现出相同的行为。

所以,问题是(基于上面观察到的行为),为什么iptables-save当表为空时不产生输出,但是如果我们恢复空表并再次调用该命令,我们会得到预期的输出(即空表)?

iptables
  • 1 个回答
  • 19 Views
Martin Hope
alecov
Asked: 2024-07-25 12:24:01 +0800 CST

Docker 容器内运行的服务器回复跳过 NAT 表

  • 5

我有一个在 vanilla 设置上运行的 Docker 容器,它监听端口 9999:

docker run --rm -it -p 9999:9999 busybox nc -vvl -p 9999 0.0.0.0

我向 NAT 上的 POSTROUTING 表添加了一条 LOG 规则,以便捕获服务器数据包。但是,当我从外部机器连接到此容器时,系统日志中什么也看不到。

不过,当我登录 mangle 的 POSTROUTING 链的末尾时,我可以看到连接数据包。根据The Diagram(TM),NAT-POSTROUTING 应该是下一个要传输的链。

这是 NAT 表:

# iptables -nL -tnat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     0    --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     0    --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
LOG        0    --  172.16.0.0/12        0.0.0.0/0            LOG flags 0 level 4 prefix "Packet:"
MASQUERADE  0    --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  6    --  172.17.0.2           172.17.0.2           tcp dpt:9999

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     0    --  0.0.0.0/0            0.0.0.0/0           
DNAT       6    --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9999 to:172.17.0.2:9999

观察后journalctl -f | grep Packet:没有发现任何异常。TRACE 指示 NAT 表被全部跳过,即服务器传出的数据包的所有链都被跳过。

设置如下:

net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1

为什么会出现这种情况?或者更一般地说,为什么有些数据包会完全跳过 NAT 表?

iptables
  • 1 个回答
  • 14 Views
Martin Hope
Work
Asked: 2024-05-08 07:46:58 +0800 CST

将所有端口上的 TCP 和 UDP 数据包转发到第二个网络接口上的另一个 IP?

  • 5

我有一台 IP 为 192.168.3.1 的 ubuntu 机器,另一台机器以固定 IP 192.168.3.2 连接到它,这台机器还通过 USB0 连接到路由器,该路由器已将 IP 172.30.220.17 共享给该机器

我的设置图在这里

我想要做的是将本机通过 192.168.3.1 IP 收到的任何 TCP 或 UDP 数据包从路由器转发到 172.30.220.19,反之亦然

例如,如果位于 192.168.3.2 的计算机在端口 33000 上向主计算机发送“Hello”TCP 数据包,则它应该将该数据包发送到 172.30.220.19:33000

在阅读了 iptables 文档和之前的几个问题后,我尝试了下面的 NAT 命令,但它不起作用,我不知道为什么。如果有人能指导我我做错了什么,我会很高兴。谢谢你的时间

sudo iptables -t nat -A PREROUTING -p tcp -j DNAT --to-destination 172.30.220.19
sudo iptables -t nat -A POSTROUTING -p tcp -d 172.30.220.19  -j SNAT --to-source 192.168.3.2
iptables
  • 2 个回答
  • 29 Views
Martin Hope
Adrian Sevcenco
Asked: 2024-04-08 02:42:59 +0800 CST

iptables::drop 在 ESTABLISHED,RELATED 之前或之后无效?

  • 6

我不清楚对 INVALID 与 ESTABLISHED,RELATED 的检查对于这两种情况是否同样快(并且如果状态完全正交),我是否必须在接受 ESTABLISHED 之前删除 INVALID 或者我可以安全地接受 ESTABLISHED 然后删除 INVALID 吗?

iptables
  • 1 个回答
  • 24 Views
Martin Hope
user1636349
Asked: 2024-03-21 03:27:26 +0800 CST

尝试理解 iptables 日志消息

  • 5

我已经设置了 iptables 来记录除一组有限用户之外的所有用户的传出流量,并且我正在尝试了解由此产生的日志消息。查看 /var/log/syslog,我看到从 127.0.0.1 到 127.0.0.53 的请求(DNS 查找?)以及相当多到 224.0.0.22 的请求,如下所示:

IN= OUT=wlp2s0 SRC=10.100.102.200 DST=224.0.0.22 LEN=40 TOS=0x00 PREC=0xC0 TTL=1 ID=0 DF PROTO=2 MARK=0x94

这是一个多播地址...有什么想法会导致这种情况吗?

最后,我有几个看起来像这样的,它们似乎是发往世界各地的传出 ICMP 请求:

IN= OUT=wlp2s0 SRC=10.100.102.200 DST=151.80.9.69 LEN=138 TOS=0x08 PREC=0xC0 TTL=64 ID=26846 PROTO=ICMP TYPE=3 CODE=3 [SRC=151.80.9.69 DST=10.100.102.200 LEN=110 TOS=0x08 PREC=0x40 TTL=51 ID=48812 DF PROTO=UDP SPT=27209 DPT=8083 LEN=90 ]

但是,真正让我困惑的是括号()中的部分SRC=151.80.9.69 PROTO=UDP SPT=27209 DPT=8083。是否意味着 ICMP 数据包是对端口 8083 的 UDP 请求的响应?我是否应该担心这可能是入侵(或企图入侵)?如果是这样,我是否有任何理由不应该阻止所有传入的 UDP 流量?(我只有网络服务器监听端口 80 和 443,没有其他端口打开——我已经检查并仔细检查了这一点。)

感谢您帮助理解我在这里看到的内容......

iptables
  • 1 个回答
  • 23 Views
Martin Hope
Garrett
Asked: 2024-03-13 03:59:19 +0800 CST

根据输出接口在 iptables 中标记数据包

  • 5

我的服务器上有一个不寻常的设置。我们有三个传出以太网端口,全部连接到一个桥接接口,我们将其分为两个 VLAN:

ip link add veth type bridge
ip link set veth address 01:23:45:67:89:0A
ip link set dev eth1 master veth
ip link set dev eth2 master veth
ip link set dev eth3 master veth
[...]
ip link add veth name veth.10 type vlan id 10
ip link add veth name veth.20 type vlan id 20
ip link add veth.20-local link veth.20 type macvlan mode bridge
[...]
docker network create --driver=macvlan --subnet=192.168.XXX.0/24 --opt com.docker.network.driver.mpu=1500 --gateway 192.168.XXX.1 --opt parent=veth.20-local dockerbr20

我的服务器内有一个连接到该地址的 docker 映像veth.20,该映像只允许通过veth.20. 网络的其余部分中存在路由和转发规则,允许 docker 映像与该 VLAN 之外的一些选定目标进行通信。

我想添加一条iptables规则,涵盖将我的服务器排除在接口之外的传出数据包veth.20,无论其目的地如何。(某些数据包必须保留在veth.20接口内;某些数据包可以路由到其他 VLAN。)

已尝试以下规则,并且无论出于何种原因,似乎都没有标记veth.20从 docker 容器留下的数据包:

iptables -A POSTROUTING -t mangle -o veth.20 -j MARK --set-mark 3
iptables -A PREROUTING -t mangle -i veth.20 -j MARK --set-mark 3
iptables -A POSTROUTING -t nat -o veth.20 -j MARK --set-mark 3
iptables -A PREROUTING -t nat -i veth.20 -j MARK --set-mark 3
iptables -A OUTPUT -t mangle -o veth.20 -j MARK --set-mark 3
iptables -A INPUT -t mangle -i veth.20 -j MARK --set-mark 3
iptables -A FORWARD -i veth.20 -j MARK --set-mark 3
iptables -A FORWARD -o veth.20 -j MARK --set-mark 3

也就是说,iptables -L -n -v -t mangle不iptables -L -n -v -t nat显示任何这些规则应用于从veth.20另一个 VLAN 上的主机发出的传出数据包。

我已经通过 确认ifconfig来自 docker 镜像的所有数据包都将离开服务器veth.20;这

iptables -A OUTPUT -t mangle -o veth.20 -j MARK --set-mark 3

当我从服务器或 Docker 映像向 VLAN 20 上的外部计算机发送数据包时,适用该规则;但是当我veth.20通过 docker 的接口发送路由到外部 VLAN 10 或 VLAN 30 地址(未显示)的数据包时,不会应用任何标记。

我觉得这应该是一个简单的问题,但我尝试过的任何方法都无法根据数据包用于离开盒子的接口进行标记。我缺少什么?

iptables
  • 1 个回答
  • 17 Views
Martin Hope
chris01
Asked: 2024-02-02 15:46:37 +0800 CST

iptables:重定向和输入过滤器的顺序

  • 5

我将使用 iptables 过滤入站流量。

我有 2 个目标。

a) Allow HTTPS inbound at port 443.

b) Redirect port 443 to process listening port on 9443.

不确定这两条规则的处理。

我是否需要将输入规则设置为接受端口 443 或 9443 的入站 HTTPS?7

取决于我认为重定向是在之前还是之后完成的。

iptables
  • 1 个回答
  • 26 Views
Martin Hope
Genku
Asked: 2024-01-26 05:46:29 +0800 CST

由于 iptables,在 WSL-2 上的 Ubuntu 22.04 LTS 中启动 docker 守护程序失败

  • 5

我正在尝试在 Windows 10 计算机上的 WSL-2 中运行的 Ubuntu 22.04.3 LTS 中运行 docker。

我已按照此处的说明进行操作。但它仍然不起作用,当我运行时出现以下错误sudo dockerd:

failed to register "bridge" driver: failed to create NAT chain DOCKER:
       iptables failed: iptables -t nat -N DOCKER:
       iptables v1.8.7 (legacy): can't initialize iptables table `nat':
          Table does not exist (do you need to insmod?)
          Perhaps iptables or your kernel needs to be upgraded.
  (exit status 3)

当我这样做时,modprobe ip_tables我得到:

modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.4.0-22621-Microsoft
iptables
  • 2 个回答
  • 183 Views
Martin Hope
MrSnrub
Asked: 2023-10-30 12:19:56 +0800 CST

具有 2 个外部 WAN IP A+B 和多个内部 LAN 的 NAT 路由器:让 1 个 LAN 使用外部 IP 地址 B,所有其他 A

  • 7

我有一个简单的 Linux 路由器,具有多个 NIC 并启用了 IPv4 转发。

路由器有两个静态 WAN IP 地址,分配给一个接口 ( eth0, eth0:0)。(在下面的文本中,我将混淆实际的公共 IP 地址(257 作为一个八位字节)。)

可以从外部 Internet 对两个外部 WAN IP 地址执行 ping 操作。

接口:

  • eth0:互联网连接,134.257.10。10月24日,网关134.257.10.1
  • eth0:0:该接口上的第二个 IP 地址:134.257.10。20 /24
  • eth1:局域网1、192.168.1.1/24
  • eth2:局域网2、192.168.2.1/24
  • eth3:局域网3、192.168.3.1/24

我的设置有效,所有 LAN 客户端 (LAN 1-3) 都可以访问 Internet,并且在外部显示为 134.257.10。10 . 此外,我有两个传入端口转发。

我的 iptables NAT 表如下所示:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Port forwarding:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
-A PREROUTING -i eth0:0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.3.33:25
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

如何让 LAN3 客户端 ( eth3) 显示为 134.257.10。20在 Internet ( eth0:0) 上用于传出连接,而不是 134.257.10。10 ( eth0)?

iptables
  • 1 个回答
  • 129 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve