V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mingtdlb
V2EX  ›  问与答

Linux 中本机和本机通信数据包会经过防火墙吗?

  •  
  •   mingtdlb · 2023-07-12 11:21:22 +08:00 · 1145 次点击
    这是一个创建于 535 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟请教一个问题,Linux 中本机和本机通信数据包是不是不经过防火墙?

    第 1 条附言  ·  2023-07-12 22:35:34 +08:00

    感谢各位大佬!!

    13 条回复    2023-07-14 15:46:26 +08:00
    chuckzhou
        1
    chuckzhou  
       2023-07-12 11:53:14 +08:00
    要过。本机通讯使用的是虚拟网卡 `lo`
    Worldispow
        2
    Worldispow  
       2023-07-12 12:27:42 +08:00 via Android
    走 socket 的应该不用,不知道这个算不算通信。。
    chesha1
        3
    chesha1  
       2023-07-12 12:42:28 +08:00   ❤️ 1
    不一定对的答案:

    如果你用的是 Berkeley socket ,本机通信和跨机通信是一样的,都要完整的走网络协议,需要经过防火墙,只是走本机会去虚拟的 Loopback ,在内核态的操作也比跨级通信简单一点
    如果是 Unix domain socket ,不需要走任何网络协议,不走防火墙
    zzboat0422
        4
    zzboat0422  
       2023-07-12 12:43:21 +08:00   ❤️ 1
    如果是 TCP/IP 的包,还是要经过 kernel 的三表五链的,所以会被防火墙影响到。
    Danswerme
        5
    Danswerme  
       2023-07-12 12:58:35 +08:00
    @chesha1 请教一下 mysql 的 socket 例如 /var/run/mysqld/mysqld.sock 是属于 Unix domain socket 吗? Berkeley socket 的应用场景有哪些呢?
    chesha1
        6
    chesha1  
       2023-07-12 13:17:00 +08:00
    @Danswerme mysql 这个我不太清楚,不好意思
    Berkeley socket 就是我们最常用的那个网络 socket 啊,最常见应用场景就是做 tcp 通信
    Danswerme
        7
    Danswerme  
       2023-07-12 13:44:24 +08:00
    @chesha1 谢谢,找了一下资料 Unix socket 主要用于本机不同进程之间的通信,MySQL 的 socket 应该也是这种类型;是我混淆了,我一直以为通常使用的网络通讯 Socket 是 Unix Socket 。
    mingtdlb
        8
    mingtdlb  
    OP
       2023-07-12 15:42:08 +08:00
    @chuckzhou @zzboat0422 过的话,受防火墙规则限制么?
    我试了一下,好像不受限制
    ```
    [root@t-38-191 ~]# ss -lnt | grep 8989
    LISTEN 0 128 *:8989 *:*
    [root@t-38-191 ~]#
    [root@t-38-191 ~]# iptables -nvL | grep 8989
    0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8989
    [root@t-38-191 ~]#
    [root@t-38-191 ~]# curl 10.17.38.191:8989
    10.17.38.191
    [root@t-38-191 ~]# curl 127.0.0.1:8989
    10.17.38.191
    [root@t-38-191 ~]#
    ```
    chuckzhou
        9
    chuckzhou  
       2023-07-12 16:30:24 +08:00   ❤️ 1
    @mingtdlb 你看一下完整的 iptables INPUT ,是不是前面已经被允许了。
    julyclyde
        10
    julyclyde  
       2023-07-12 18:15:06 +08:00
    这种问法体现了一种不正确的思维方式,就是“特例”
    不过在这个问题上其实特例是由防火墙上的一条规则来实现的,而不是防火墙本身无视了本地通信
    mingtdlb
        11
    mingtdlb  
    OP
       2023-07-12 22:06:37 +08:00
    @chuckzhou
    ```sh
    [root@t-38-191 ~]# iptables -L INPUT -v -n
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    72245 62M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
    8 480 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
    35724 62M INPUT_direct all -- * * 0.0.0.0/0 0.0.0.0/0
    35724 62M INPUT_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0
    35724 62M INPUT_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0
    0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
    35701 62M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
    0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8989
    [root@t-38-191 ~]#
    [root@t-38-191 ~]# ss -lnt | grep 8989
    LISTEN 0 128 *:8989 *:*
    [root@t-38-191 ~]#
    [root@t-38-191 ~]# curl localhost:8989
    10.17.38.191
    [root@t-38-191 ~]#
    [root@t-38-191 ~]# curl 127.0.0.1:8989
    10.17.38.191
    [root@t-38-191 ~]#
    [root@t-38-191 ~]# curl 10.17.38.191:8989
    10.17.38.191
    [root@t-38-191 ~]#
    ```
    chuckzhou
        12
    chuckzhou  
       2023-07-13 09:35:47 +08:00
    @mingtdlb
    8 480 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0

    这个 lo 就是我前面说的用于本机通讯的虚拟网卡。

    你把你的规则放到最前面,而不是最后面。
    mingtdlb
        13
    mingtdlb  
    OP
       2023-07-14 15:46:26 +08:00
    @chuckzhou 嗯 是的,感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2873 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:29 · PVG 16:29 · LAX 00:29 · JFK 03:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.