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
    • 最新
    • 标签
主页 / server / 问题

问题[masquerade](server)

Martin Hope
Adrian Cornish
Asked: 2021-10-21 18:23:20 +0800 CST

如何通过 MAC 地址使用防火墙阻止内部主机访问 Internet

  • 1

我试图阻止网络上的一些主机外出/打电话回家。

所以我有2个区域。

[root@eagle ~]# firewall-cmd --get-active-zones 
external
  interfaces: enp2s0
internal
  interfaces: eno1

伪装成external

[root@eagle ~]# firewall-cmd --zone=internal --query-masquerade
no
[root@eagle ~]# firewall-cmd --zone=external --query-masquerade
yes

而且我有一个丰富的规则来删除我想要的 MAC 地址的数据

[root@eagle ~]# firewall-cmd --zone=external --list-rich-rules 
rule source mac="40:16:3B:63:72:E0" drop

但这似乎不起作用。我检查的明显事情是将它们添加为永久并确保我重新加载了规则。

任何帮助表示赞赏

fedora masquerade firewalld
  • 1 个回答
  • 156 Views
Martin Hope
sebastien dontneedtoknowthat
Asked: 2021-07-16 07:31:41 +0800 CST

为什么 MASQUERADE SNAT 可以阻止 localhost 连接?

  • 0

我在 linux 上观察到一个奇怪的行为:

首先,我清理所有路由和 iptables 规则:

ip route flush table main
ip route flush table default
ip route flush table local
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -t nat -F
ip6tables -t mangle -F
ip6tables -F
ip6tables -X

然后我添加一个本地路由:

ip route add local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 table local

然后,在一个终端上我打开一个端口,nc -lp 12345在另一个终端上我连接到它,nc 127.0.0.1 12345我可以在 netcat 服务器和客户端之间发送和接收数据。所以现在,一切都很好。

现在,从它并在杀死以前的 netcat 服务器和客户端之后,如果我运行:

iptables -t nat -A POSTROUTING -j MASQUERADE

然后我重新启动 netcat 服务器,然后客户端无法连接。你知道为什么吗?

我注意到添加ip route add local 192.168.0.10 dev wlan0 proto kernel scope host src 192.168.0.10 table local使 netcat 连接再次起作用。但是,我不明白为什么 wlan0 接口(IP 为 192.168.0.10)会影响环回接口?

有关信息,我正在使用 ArchLinux

linux nat iptables route masquerade
  • 3 个回答
  • 317 Views
Martin Hope
Samveen
Asked: 2020-12-03 08:06:17 +0800 CST

调试我的 NAT 设置

  • -2

我正在尝试让树莓派 Pi3 通过 将进入wlan0更上游的流量转发到上游eth0,但由于某种我看不到的原因它失败了。希望其他人可以发现问题。

Pi3 状态:

# Interfaces
samveen@pi3:~$ ip -o -4 a
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 10.0.0.1/24 brd 10.0.0.255 scope global eth0\       valid_lft forever preferred_lft forever
3: wlan0    inet 192.168.0.124/24 brd 192.168.0.255 scope global dynamic wlan0\       valid_lft 166572sec preferred_lft 166572sec

# Routes
samveen@pi3:~$ ip r
default via 10.0.0.5 dev eth0 proto static 
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1 
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.124 
192.168.0.1 dev wlan0 proto dhcp scope link src 192.168.0.124 metric 600 

# iptables rules
samveen@pi3:~$ cat routing.sh 
#!/bin/bash -x
# Setup forwarding (with NAT) from wlan0 towards eth0
# https://raspberrypi.stackexchange.com/a/50073/124471
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT  

# Internet test
samveen@pi3:~$ curl --silent -I network-test.debian.org |egrep  '^H|X-Cl'
HTTP/1.1 200 OK
X-Clacks-Overhead: GNU Terry Pratchett

# add iptables tracing
samveen@pi3:~$ sudo iptables -t raw -A PREROUTING -p tcp --source 192.168.0.0/24 --dport 80 -j TRACE
samveen@pi3:~$ sudo iptables -t raw -A OUTPUT -p tcp --source 192.168.0.0/24 --dport 80 -j TRACE

为了检查出了什么问题,我wget -4 -O - http://google.com在下游主机 ( 192.168.0.1) 上运行以尝试跟踪数据包。

  • tcpdump问题主机上的传入数据包(未转发):
# tcpdump of incoming packets
samveen@pi3:~$ sudo tcpdump -nvvvi wlan0 tcp and src host 192.168.0.1 and dst port 80
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:44:12.492367 IP (tos 0x0, ttl 64, id 49906, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.1.53814 > 216.58.200.206.80: Flags [S], cksum 0x86c5 (correct), seq 925105116, win 29200, options [mss 1460,sackOK,TS val 1182572917 ecr 0,nop,wscale 6], length 0
15:44:13.536363 IP (tos 0x0, ttl 64, id 49907, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.1.53814 > 216.58.200.206.80: Flags [S], cksum 0x82b7 (correct), seq 925105116, win 29200, options [mss 1460,sackOK,TS val 1182573955 ecr 0,nop,wscale 6], length 0
15:44:15.615949 IP (tos 0x0, ttl 64, id 49908, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.1.53814 > 216.58.200.206.80: Flags [S], cksum 0x7a97 (correct), seq 925105116, win 29200, options [mss 1460,sackOK,TS val 1182576035 ecr 0,nop,wscale 6], length 0
15:44:19.697021 IP (tos 0x0, ttl 64, id 49909, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.1.53814 > 216.58.200.206.80: Flags [S], cksum 0x6aa7 (correct), seq 925105116, win 29200, options [mss 1460,sackOK,TS val 1182580115 ecr 0,nop,wscale 6], length 0
15:44:27.935601 IP (tos 0x0, ttl 64, id 49910, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.1.53814 > 216.58.200.206.80: Flags [S], cksum 0x4a77 (correct), seq 925105116, win 29200, options [mss 1460,sackOK,TS val 1182588355 ecr 0,nop,wscale 6], length 0
^C
5 packets captured
5 packets received by filter
0 packets dropped by kernel
  • 同时tcpdump在问题主机的输出接口上没有给我任何数据包(我希望在这里看到传出的数据包)
samveen@pi3:~$ sudo tcpdump -nvvvi eth0 tcp and  dst port 80
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
  • 来自 dmesg 的跟踪日志:
[468794.617195] device eth0 entered promiscuous mode
[468798.441177] device wlan0 entered promiscuous mode
[468890.193285] TRACE: raw:PREROUTING:policy:2 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49906 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CA1750000000001030306) 
[468890.193395] TRACE: nat:PREROUTING:policy:1 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49906 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CA1750000000001030306) 
[468891.237300] TRACE: raw:PREROUTING:policy:2 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49907 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CA5830000000001030306) 
[468891.237413] TRACE: nat:PREROUTING:policy:1 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49907 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CA5830000000001030306) 
[468893.316857] TRACE: raw:PREROUTING:policy:2 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49908 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CADA30000000001030306) 
[468893.316958] TRACE: nat:PREROUTING:policy:1 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49908 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CADA30000000001030306) 
[468897.397941] TRACE: raw:PREROUTING:policy:2 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49909 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CBD930000000001030306) 
[468897.398056] TRACE: nat:PREROUTING:policy:1 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49909 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CBD930000000001030306) 
[468905.636557] TRACE: raw:PREROUTING:policy:2 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49910 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CDDC30000000001030306) 
[468905.636659] TRACE: nat:PREROUTING:policy:1 IN=wlan0 OUT= MAC=b8:27:eb:2b:84:0c:b8:27:eb:5d:a5:46:08:00 SRC=192.168.0.1 DST=216.58.200.206 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49910 DF PROTO=TCP SPT=53814 DPT=80 SEQ=925105116 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A467CDDC30000000001030306) 
[468939.580532] device eth0 left promiscuous mode
[468941.338008] device wlan0 left promiscuous mode

在跟踪中,我希望看到一些日志行,FORWARD但OUT=eth0我什么也没看到。我在这里做错了什么?

linux iptables masquerade
  • 1 个回答
  • 55 Views
Martin Hope
Reza_Rg
Asked: 2020-11-26 01:54:02 +0800 CST

端口转发 eth0 到 ppp0

  • 0

我有一个 RaspberryPi,它连接到具有静态 IP 的 eth0 上的互联网,我安装了 Squid,并且我还在我的 Mikrotik 路由器上启用了 1694 端口转发到我的树莓上的 3128 端口,所以我可以使用我的树莓作为代理服务器。例如,当我从另一个互联网上的另一个设备上测试它时,它可以工作:

$ curl -x MY.STAT.IC.IP:1694 https://wtfismyip.com/text

MY.STAT.IC.IP

现在我已经为我的树莓添加了一个 3g 屏蔽,我能够连接到 3g 网络,现在我在 ppp0 接口上有了互联网,它有一个动态 IP。现在我想将所有传入的请求转发到 eth0 以通过 ppp0 路由,所以当我在 curl 上执行时,我得到了我的 3g 网络 IP。

我不想tcp_outgoing_address在 squid 上使用,因为它有很多问题,我想做端口转发,我已经完成了以下操作,但它仍然返回我的静态 IP。

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i ppp0 -o eth0 -j ACCEPT

我已经尝试了很多其他的 iptables 转发,但都没有奏效。我已经尝试过这个 bash 脚本(当然编辑过),但它也没有工作,我也尝试了 ipt.sh 从这个链接,我确信它会工作,但仍然没有成功,那么,我错过了什么?

routing port-forwarding iptables masquerade
  • 1 个回答
  • 452 Views
Martin Hope
Kound
Asked: 2020-09-28 14:29:42 +0800 CST

使用 nftables 将 HTTP(s) 流量转发到 VM 来宾而不伪装

  • 0

我目前正在将安全设置为尽可能基于 KVM 的服务器。VM 主机应该或多或少对 Internet 不可见,并且只有运行单个服务的 VM 来宾应该被公开。VM 来宾应该没有互联网访问权限(--> 没有 NAT 伪装)。

现在我想将 VM 来宾的 HTTP(s) 端口公开192.168.122.183到 Internet。iptables几乎不推荐使用的所有现有文档使用。所以我更喜欢使用nftables.

根据文档,这应该相当简单,所以我的nft list ruleset外观相应地:

table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
                iif "enp35s0" tcp dport { http, https } dnat to 192.168.122.183
        }
}
table inet filter {
        chain input {
                type filter hook input priority 0; policy accept;
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
        }

        chain output {
                type filter hook output priority 0; policy accept;
        }
}

ip转发也被激活sysctl -a | grep forward:

net.ipv4.conf.all.bc_forwarding = 0
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.default.bc_forwarding = 0
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.enp35s0.bc_forwarding = 0
net.ipv4.conf.enp35s0.forwarding = 1
net.ipv4.conf.enp35s0.mc_forwarding = 0
net.ipv4.conf.virbr10.bc_forwarding = 0
net.ipv4.conf.virbr10.forwarding = 1
net.ipv4.conf.virbr10.mc_forwarding = 0
net.ipv4.conf.virbr10-dummy.bc_forwarding = 0
net.ipv4.conf.virbr10-dummy.forwarding = 1
net.ipv4.conf.virbr10-dummy.mc_forwarding = 0
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

从 VM 主机访问 Web 服务器可以正常工作,但从 Internet 上我没有得到响应。我错过了什么?

可能与这个问题有关。

这是来自主机的 tcpdump 的摘录。正如所见,来自 VM 主机的请求得到了正确回答,并且外部请求正在弹出,但从未得到回答。任何想法为什么?

23:43:28.048714 IP 192.168.122.1.35584 > 192.168.122.183.http: Flags [S], seq 502099991, win 64240, options [mss 1460,sackOK,TS val 3361102460 ecr 0,nop,wscale 7], length 0
23:43:28.048746 IP 192.168.122.183.http > 192.168.122.1.35584: Flags [S.], seq 3142491522, ack 502099992, win 65160, options [mss 1460,sackOK,TS val 519662698 ecr 3361102460,nop,wscale 7], length 0
23:43:28.048801 IP 192.168.122.1.35584 > 192.168.122.183.http: Flags [.], ack 1, win 502, options [nop,nop,TS val 3361102460 ecr 519662698], length 0
23:43:28.048846 IP 192.168.122.1.35584 > 192.168.122.183.http: Flags [P.], seq 1:143, ack 1, win 502, options [nop,nop,TS val 3361102460 ecr 519662698], length 142: HTTP: GET / HTTP/1.1
23:43:28.048851 IP 192.168.122.183.http > 192.168.122.1.35584: Flags [.], ack 143, win 508, options [nop,nop,TS val 519662698 ecr 3361102460], length 0
23:43:28.048960 IP 192.168.122.183.http > 192.168.122.1.35584: Flags [P.], seq 1:325, ack 143, win 508, options [nop,nop,TS val 519662698 ecr 3361102460], length 324: HTTP: HTTP/1.1 200 OK
23:43:28.049015 IP 192.168.122.1.35584 > 192.168.122.183.http: Flags [.], ack 325, win 501, options [nop,nop,TS val 3361102460 ecr 519662698], length 0

23:43:45.263545 STP 802.1d, Config, Flags [none], bridge-id 8000.52:54:00:de:a7:a9.8002, length 35
23:43:45.537492 IP external.dip0.t-ipconnect.de.46866 > 192.168.122.183.http: Flags [S], seq 1122615229, win 64240, options [mss 1452,sackOK,TS val 2536247181 ecr 0,nop,wscale 7], length 0
23:43:47.247528 STP 802.1d, Config, Flags [none], bridge-id 8000.52:54:00:de:a7:a9.8002, length 35
23:43:47.553490 IP external.dip0.t-ipconnect.de.46866 > 192.168.122.183.http: Flags [S], seq 1122615229, win 64240, options [mss 1452,sackOK,TS val 2536249197 ecr 0,nop,wscale 7], length 0

供参考我的ip addr输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp35s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether a8:a1:59:0e:**:** brd ff:ff:ff:ff:ff:ff
    inet 95.217.***.***/26 brd 95.217.120.127 scope global enp35s0
       valid_lft forever preferred_lft forever
    inet6 2a01:4f9:**:****::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::aaa1:59ff:****:*****/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr10-dummy: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr10 state UNKNOWN group default qlen 1000
    link/ether 52:54:00:de:a7:a9 brd ff:ff:ff:ff:ff:ff
4: virbr10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:de:a7:a9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr10
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fede:a7a9/64 scope link 
       valid_lft forever preferred_lft forever
5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr10 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:94:b9:ce brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe94:b9ce/64 scope link 
       valid_lft forever preferred_lft forever

回答的另一个问题virt-manager与它不兼容,nftables因为它仍然使用iptables. 但是 iptable 规则是空的并且iptable_nat没有加载 iptables 模块(尤其是)

# lsmod | grep ip
nft_chain_route_ipv4    16384  0
nft_chain_nat_ipv4     16384  1
ipt_MASQUERADE         16384  0
nf_nat_ipv4            16384  2 ipt_MASQUERADE,nft_chain_nat_ipv4
nf_nat                 36864  2 nft_nat,nf_nat_ipv4
ipt_REJECT             16384  0
nf_reject_ipv4         16384  1 ipt_REJECT
nf_conntrack          172032  5 xt_conntrack,nf_nat,nft_nat,ipt_MASQUERADE,nf_nat_ipv4
nf_defrag_ipv6         20480  1 nf_conntrack
nf_defrag_ipv4         16384  1 nf_conntrack
nf_tables             143360  13 nft_chain_route_ipv4,nft_compat,nft_nat,nft_chain_nat_ipv4,nft_counter,nf_tables_set
ip_tables              28672  0
x_tables               45056  7 xt_conntrack,nft_compat,xt_tcpudp,ipt_MASQUERADE,xt_CHECKSUM,ipt_REJECT,ip_tables
kvm-virtualization nat port-forwarding nftables masquerade
  • 2 个回答
  • 890 Views
Martin Hope
Polizi8
Asked: 2020-09-20 15:59:54 +0800 CST

NFTables:是否可以在不伪装的情况下转发流量?

  • 0

我有一个远程服务器(B),它将某些传入流量转发到不同服务器的另一个端口(A,dest)。
使用“伪装”,我只能看到来自转发服务器 (B) 的流量,是否可以看到来自原始来源 (C) 的流量?如果我将“伪装”替换为“接受”,我将无法再到达目的地 (A) 的 8080 端口。

草图:

C -> B:25 -> A:8080
# A receives C requests as if B made them
# Unfortunately this breaks some implementations like SPF

NFTables 配置:

# define destination address
define dest = 10.0.0.2

# table for smtp forwarding
table ip smtp {
 chain pre {
  type nat hook prerouting priority -100
  tcp dport 25 dnat to $dest:8080
 }
 chain post {
  type nat hook postrouting priority 100
  ip daddr $dest masquerade
 }
}
smtp port-forwarding nftables masquerade ip-forwarding
  • 1 个回答
  • 1294 Views
Martin Hope
Chul-Woong Yang
Asked: 2020-04-17 04:21:14 +0800 CST

为什么在网络命名空间分离的透明代理设置中不会发生 iptables NAT?

  • 2

我正在尝试在我的主机上设置透明代理网络。

真正的客户端和代理目标是容器,但在这个实验中,我使用 netns(网络命名空间)分隔的环境。

为了透明地将客户端流量重定向到代理,我使用策略路由。

 Client (C)         Proxy (P)
 10.10.1.1/24      10.10.2.1/24
     veth0             veth0
      |                 |
   veth pair         veth pair
      |                 |
  -----------(HOST)--------------
 client-veth0       proxy-veth0
 10.10.1.2/24      10.10.2.2/24
      |                 |            172.16.202.30
      +-----------------+-------------- enp4s0 ---- INTERNET

# Policy Routing on Host
# [Client->Proxy]
# ip rule:  from 10.10.1.0/24 iif client-veth0 lookup 100
# ip route: (100) default via 10.10.2.1 dev proxy-veth0
# [Proxy->Internet]
# ip route: (master) default via 172.16.202.1 dev enp4s0 proto static metric 100
# iptables: -t nat -A POSTROUTING -s 10.10.1.1/32 -o enp4s0 -j MASQUERADE
# [Internet->Proxy]
# ip rule:  from all to 10.10.1.0/24 iif enp4s0 lookup 100
# ip route: (100) default via 10.10.2.1 dev proxy-veth0
# [Proxy->Client]
# ip rule:  from all to 10.10.1.0/24 iif proxy-veth0 lookup 101
# ip route: (101) default via 10.10.1.1 dev client-veth0

问题是,当我从客户端 ping 8.8.8.8 时,在客户端 netns 中,源 IP 伪装不会发生。 iptables 伪装规则不匹配,默认为 ACCEPT 。我希望 enp4s0 上的 tcpdump 显示172.16.202.30 --> 8.8.8.8,但它显示10.10.1.1 --> 8.8.8.8,没有源 IP 伪装。

我在互联网线路上记录了 pcap 以澄清 SNAT 不会发生。client_to_goolge从 enp4s0 之外的单独机器记录:

$ tcpdump -r client_to_google -n
reading from file client_to_google, link-type EN10MB (Ethernet)
23:35:40.852257 IP 10.10.1.1 > 8.8.8.8: ICMP echo request, id 14867, seq 1, length 64
23:35:41.865269 IP 10.10.1.1 > 8.8.8.8: ICMP echo request, id 14867, seq 2, length 64

当我检查 iptables mangle 表时,数据包按给定策略流动:

  PREROUTING: client-veth0, 10.10.1.1 --> 8.8.8.8
  POSTROUTING: proxy-veth0, 10.10.1.1 --> 8.8.8.8
  PREROUTING: proxy-veth0, 10.10.1.1 --> 8.8.8.8
  POSTROUTING: enp4s0, 10.10.1.1 --> 8.8.8.8

proxy-veth0但是,当我在输出界面上更改伪装规则时,像这样iptables: -t nat -A POSTROUTING -s 10.10.10.1/32 -o proxy-veth0 -j MASQUERADE,伪装发生了。即 10.10.2.2 --> 8.8.8.8数据包被捕获。

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
...
11       0     0 MASQUERADE  all  --  *      enp4s0  10.10.1.1            0.0.0.0/0
12       1    84 MASQUERADE  all  --  *      proxy-veth0  10.10.1.1            0.0.0.0/0

上表显示规则#11enp4s0输出条件未触发。在使用规则#11 进行多次测试后插入规则#12。规则 #12 表明proxy-veth0输出条件确实触发了。enp4s0主网卡和proxy-veth0使用 iptables 的虚拟接口之间有什么区别吗?

任何意见将不胜感激,谢谢。

iptables transparent-proxy masquerade policy-routing
  • 2 个回答
  • 2208 Views
Martin Hope
schmichri
Asked: 2020-01-28 12:44:33 +0800 CST

有没有办法限制 IPtables 伪装中的 Src 端口

  • 0

我在所有节点上的 iptables 中通过 kube-proxy 设置了以下链。

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ 

我所有的节点都位于提供商的无状态/静态防火墙后面。使用以下规则设置。

tcp_established: &tcp_established
  name: tcp established
  ip_version: ipv4
  dst_port: '32768-65535'
  action: accept
  protocol: tcp
  tcp_flags: ack

这意味着在端口 32768-65535 TCP / ACK 上只允许来自任何地方的流量,以确保来自出站流量的反向连接。

在我的所有节点(Ubuntu 16.04)上,设置了以下系统设置。

cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999

当我尝试通过 curl 和 http 访问远程服务器时,我已经断开连接(TCP 虚假重传),来自低于 32768 的源端口。

3   1.051525000 80→20092 [SYN, ACK] Seq=0 Ack=1 Win=64876 Len=0 MSS=1336 SACK_PERM=1 TSval=1259153497 TSecr=1768475026 WS=128   THETARGETIP THESOURCEIP TCP 74

4   2.079464000 [TCP Spurious Retransmission] 20092→80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=1768476055 TSecr=0 WS=128 THESOURCEIP THETARGETIP TCP 74

有没有办法“告诉” iptables、kube-proxy 和/或内核使用 iptables masquarde 来限制源端口的范围?

iptables tcp kubernetes masquerade
  • 1 个回答
  • 475 Views
Martin Hope
Necto
Asked: 2016-07-08 11:31:30 +0800 CST

为什么Linux内核中的IP伪装(源NAT)无法在高数据包速率上设置源IP

  • 2

我正在尝试测试标准 linux NAT 的吞吐量。我已经设置了以下虚拟网络:

[192.168.42.5] <--> [192.168.42.2:192.168.35.2] <--> [192.168.35.10]

中间主机有2个接口,运行ubuntu 14.04,配置为NAT:

sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2 -o eht1 -j ACCEPT

[192.168.42.5]主机也有第二个网络的路由规则:

sudo ip route add 192.168.35.0/24 via 192.168.42.2 dev eth1

然后我hping3在[192.168.42.5]主机上运行:

sudo hping3 192.168.35.10  -k -s 3453 -S -n -p 80 -i u1000

我还观看了关于[192.168.35.10]with的交流tcpdump:

sudo tcpdump -i eth1

系统在 ~1k Pkt/秒的速率下工作正常。tcpdump显示到达的数据包:

IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1520954148, win 512, length 0

但是当我增加数据包速率(使用-i u700密钥)时,由于某种原因,NAT 无法重写源地址,目标会收到这样的数据包:

IP 192.168.42.5.3453 > 192.168.35.10.http: Flags [S], seq 1554999038, win 512, length 0

并忽略它们没有到192.168.42.0/24子网的可用路由,因此hping3不会得到任何响应。如果发生这种情况,我需要放松并等待大约 1-2 分钟,直到即使在数据包速率较慢的情况下,我也可以让 NAT 正常运行。

为什么 NAT 会如此奇怪地失败?如果它缺乏容量,为什么它仍然转发未修改的数据包?

PS 当我设置通常的路由器而不是 NAT(在[192.168.35.10]主机中有相应的规则)时,它通常处理甚至 10k Pkt/s 速率。

linux nat masquerade
  • 1 个回答
  • 733 Views
Martin Hope
amic
Asked: 2016-04-20 01:44:33 +0800 CST

ICMP ECHO REPLY 未正确进行 SNAT

  • 1

我正在尝试使用具有以下设置的 OpenVPN 在两个远程 LAN 网络(10.0.0.0/24、10.0.1.0/24)之间提供 L3 连接:

+----------------+  +---------------------+  +---------------------+
|VM A            |  |VM B (OpenVPN Server)|  |VM C (OpenVPN Client)|
|eth0:10.0.0.5/24|--|eth0:10.0.0.4/24     |  |eth0:10.0.1.4/24     |
+----------------+  |tun0:10.8.0.1/32     |==|tun0:10.8.0.2/32     |
                    +---------------------+  +---------------------+

提供以下 IP 表规则:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.0.4

ping VMC->VMA(10.0.0.5) ICMP 回显请求的 IP 在 VM B 上已正确 SNAT:

VM-B# tcpdump -i eth0 icmp
09:27:36.170555 IP 10.0.0.4 > 10.0.0.5: ICMP echo request, id 4049, seq 2, length 64
09:27:36.171201 IP 10.0.0.5 > 10.0.0.4: ICMP echo reply, id 4049, seq 2, length 64

但是 ping VMA->VMC(10.0.1.4) echo reply 的 IP 不是在 VM B 上 SNATed:

VM-B# tcpdump -i eth0 icmp
09:33:31.791095 IP 10.0.0.5 > 10.0.1.4: ICMP echo request, id 6590, seq 2, length 64
09:33:31.795299 IP 10.0.1.4 > 10.0.0.5: ICMP echo reply, id 6590, seq 2, length 64

在我的情况下,这会导致其他底层(VM 的主机)反欺骗 iptables 规则丢弃数据包以防止 IP 欺骗。

我不明白为什么 ICMP 回显回复数据包没有被正确 SNAT 以及如何实现。谢谢你。

networking openvpn iptables masquerade ubuntu-14.04
  • 1 个回答
  • 1234 Views

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve