DHCP 设置。我的路由器报告的上行链路与
ip = requests.get('https://api.ipify.org').text
做。
以下是一个例子:
$ curl https://api.ipify.org
46.10.148.15
但路由器仍然将传出的 IP 报告为 10.something。
问题:路由器报告的 IP 与我从外部服务看到的 IP 有何关系?
DHCP 设置。我的路由器报告的上行链路与
ip = requests.get('https://api.ipify.org').text
做。
以下是一个例子:
$ curl https://api.ipify.org
46.10.148.15
但路由器仍然将传出的 IP 报告为 10.something。
问题:路由器报告的 IP 与我从外部服务看到的 IP 有何关系?
我在服务器上运行了以下代码,这样即使服务器连接到 VPN,我也可以通过 SSH 进入服务器。以下代码在启动后作为服务运行。
ip addr add 192.168.1.113 dev enp1s0 label enp1s0:0
ip rule add from 192.168.1.113 table 402
ip route add default via 192.168.1.1 dev enp1s0:0 table 402
这适用于 openvpn,但不适用于 wireguard,因为我的 wireguard 客户端在上述规则前面添加了一些规则。
0: from all lookup local
32761: from all lookup main suppress_prefixlength 0
32762: not from all fwmark 0xca6c lookup 51820
32763: from 192.168.1.113 lookup 402
32766: from all lookup main
32767: from all lookup default
如果我在 wireguard 连接后添加规则from 192.168.1.113 lookup 402
,那么我就可以通过 SSH 进入服务器。所以我认为这是一个优先级问题。
32763
即使在 wireguard 连接并添加了那几条规则( 32761
, )之后,如何确保我的规则( )仍然保持优先权?32762
失败的解决方案:
我了解到左边的数字是优先级。然后我尝试将规则的优先级调低。
ip rule add from 192.168.1.113 table 402 prio 300
.. 但是在我连接到 wireguard vpn 之后,wireguard 客户端只是将他们的规则优先级放在我的规则之下299
,然后298
。
298: from all lookup main suppress_prefixlength 0
299: not from all fwmark 0xca6c lookup 51820
300: from 192.168.1.113 lookup 402
有什么办法可以防止这种情况发生吗?我想我可以PostUp
在 wireguard conf 文件中放置一个命令来改变优先级,但我觉得必须有一个更干净的解决方案。
为了在路由表中查找匹配的条目,将对路由表中的目标 IP 和网络掩码进行按位与运算。我想知道是否也会对路由表中当前条目的“网络目标”和网络掩码进行按位与运算,然后比较两个与运算结果;或者,只有一个与运算(目标 IP 和网络掩码),并将结果直接与路由表中的“网络目标”进行比较?
我通过 VPN 连接,希望一些用户帐户绕过它。VPN 接口是tap0
(IP 是 172.16.xx),主接口是wlan0
(IP 是 192.168.10.3)。所有常规流量都通过 进入互联网tap0
。
我创建了第二张路由表并添加了一条uid
规则:
# ip route add default via 192.168.10.1 dev wlan0 proto static table 2
# ip rule add uidrange 1001-1001 table 2
# ip route show table 2
default via 192.168.10.1 dev wlan0
我预计用户的流量会通过源 IP 192.168.10.3 流出wlan0
。然而,受影响用户的流量具有接口的 IP wlan0
,但却通过错误的接口流出tap0
(然后无处可去)。如果没有规则,流量将正常通过tap0
。
奇怪的是,ip route get
结果和我预期的一样。规则如下:
$ ip route get 8.8.4.4
8.8.4.4 via 192.168.10.1 dev wlan0 table 2 src 192.168.10.3 uid 1001
cache
没有规则:
$ ip route get 8.8.4.4
8.8.4.4 via 172.16.0.1 dev tap0 src 172.16.0.102 uid 1001
cache
我还尝试将dev wlan0
和添加proto static
到路由表,但什么都没改变。我完全没有iptables
,所有策略都设置为ACCEPT
。我也试过了,iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
但没有帮助(显然是因为流量从 流出tap0
)。我还把rp_filter
所有地方都设置为零。
无论如何,用户都可以成功 ping wlan0
192.168.10.1 的网关。谢谢帮助。
你好,我想获得一些关于如何使用 VyOS 进行特定类型 NAT 的建议。
我遇到过一种情况,我想对目标地址和目标端口匹配的连接进行 NAT。但我不仅想转换目标端口,还想转换源地址。所以我需要 DNAT 和相应的 SNAT。
将会有多个连接,其理念是,它们将根据原始目的地获得不同的源地址,并重新路由到一个共同的目的地。
问题是 DNAT 先进行,由于它转换目的地,我不知道在 SNAT 中要匹配什么。如果我能够先进行 SNAT,那么问题就解决了。或者,如果我能够以某种方式用 DNAT “标记”连接,然后在 SNAT 中匹配它,那么也可以。
下面是两个连接的示例,其中我发明了一些不存在的连接标记功能来说明我想要做的事情:
set nat destination rule 89 destination address 192.168.222.222
set nat destination rule 89 destination port 10089
set nat destination rule 89 translation port 10000
set nat destination rule 89 modify mark '89'
set nat source rule 89 connection mark '89'
set nat source rule 89 translation address 10.1.1.89
set nat destination rule 96 destination address 192.168.222.222
set nat destination rule 96 destination port 10096
set nat destination rule 96 translation port 10000
set nat destination rule 96 modify mark '96'
set nat source rule 96 connection mark '96'
set nat source rule 96 translation address 10.1.1.96
请注意,两个连接都转换到同一个目的地,所以我无法在 SNAT 规则中使用它。
有没有办法在 DNAT 之前进行 SNAT,或者在 VyOS 中以其他方式实现我想要的效果?
其他注意事项:
编辑:我认为如果我使用 iptables 而不是 VyOS 的话,这是可能的,如下所示:
iptables -t mangle -A PREROUTING -d 192.168.222.222 -p tcp --dport 10106 -j CONNMARK --set-mark 89
iptables -t nat -A PREROUTING -d 192.168.222.222 -p tcp --dport 10089 -j DNAT --to-destination 192.168.222.222:10000
iptables -t nat -A POSTROUTING -m connmark --mark 89 -j SNAT --to-source 10.1.1.89
iptables -t mangle -A PREROUTING -d 192.168.222.222 -p tcp --dport 10096 -j CONNMARK --set-mark 96
iptables -t nat -A PREROUTING -d 192.168.222.222 -p tcp --dport 10096 -j DNAT --to-destination 192.168.222.222:10000
iptables -t nat -A POSTROUTING -m connmark --mark 96 -j SNAT --to-source 10.1.1.96
如果 iptables 可以做到这一点,我猜 VyOS 也可以……但也许不行?
在 AlmaLinux 9 中,应该使用 NetworkManager 来定义连接。在我们使用的数据中心中,必须定义路由才能使用虚拟机中的自定义 IP。我已经在主机中定义 IP 方面取得了进展,但无法让 NetworkManager 在重新启动时创建路由,但使用此命令网络可以正常工作:
ip route add default via 192.168.0.1 dev ens18 onlink src 94.23.81.XXX
我不熟悉 nmconnection 文件格式,因此无法使用 NetworkManager 来实现。我应该把这个命令放在哪里,或者在哪个文件中可以定义这个默认且唯一的路由?
谢谢。
描述
10.223.0.7
我的目标是从机器 A ( 10.101.0.40
) ping 机器 C ( )
我有 2 个网络和 3 台机器
网络A:10.223.0.0/24
网络B:10.101.0.0/16
机器 A(“pinger”):(10.101.0.40
在 eth5 上)
机器 B(“路由器”):(10.101.2.97
在 ens7 上)和10.223.0.1
(在 wg0 上)
机器 C(“被 ping 的”):(10.223.0.7
在 wg0 上)
我已在机器 B 上全局启用 IP 转发,并在 ens7 和 wg0 接口上启用
我的防火墙正在接受机器 B 上的转发规则。
我在机器 B 上添加了这条规则:iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
以启用伪装
我在机器 A 上添加了此规则ip route add 10.223.0.0/24 via 10.101.2.97 dev eth5
来路由数据包
测试
当我启动 ping 时,我可以看到以下内容tcpdump -nni any icmp
:
机器 A:
18:16:12.976724 eth5 Out IP 10.101.1.40 > 10.223.0.7: ICMP echo request, id 7373, seq 1065, length 64
机器B:
18:16:12.977241 ens7 In IP 10.101.1.40 > 10.223.0.7: ICMP echo request, id 7373, seq 1065, length 64
18:16:12.977287 wg0 Out IP 10.223.0.1 > 10.223.0.7: ICMP echo request, id 7373, seq 1065, length 64
18:16:12.978201 wg0 In IP 10.223.0.7 > 10.223.0.1: ICMP echo reply, id 7373, seq 1065, length 64
18:16:12.978217 ens7 Out IP 10.223.0.7 > 10.101.1.40: ICMP echo reply, id 7373, seq 1065, length 64
机器 C
18:16:12.977754 wg0 In IP 10.223.0.1 > 10.223.0.7: ICMP echo request, id 7373, seq 1065, length 64
18:16:12.977767 wg0 Out IP 10.223.0.7 > 10.223.0.1: ICMP echo reply, id 7373, seq 1065, length 64
并且机器 A 没有收到任何响应。
我认为问题出在机器 B 日志的第 4 行。SRC IP 是,10.223.0.7
但在我看来应该是10.101.2.97
,ens7 网络上机器 B 的 IP。我完全不知道为什么会这样。
我尝试添加这个伪装规则iptables -t nat -A POSTROUTING -o ens7 -j MASQUERADE
但正如预期的那样:它不起作用。
问题
为什么伪装对请求起作用(参见机器 B 的第二行),而对响应不起作用(参见机器 B 的第 4 行)?
我需要配置我的路由器(Ubuntu Server 24/NNFTables),以便连接到 lan1 和 lan2 接口的计算机可以使用 wan1 或 wan2 接口浏览互联网,具体取决于子网 IP。
我通过两个不同的提供商接入互联网。
ISP 1:Bloco ip:111.11.111.0/28
ISP 2:Bloco ip:222.22.222.8/29
配置 netplan yaml:
网络: 以太网: wan1: 地址: - 111.11.111.2/28 - 111.11.111.3/28 - 111.11.111.4/28 - 111.11.111.5/28 - 111.11.111.6/28 - 111.11.111.7/28 - 111.11.111.8/28 - 111.11.111.9/28 - 111.11.111.10/28 - 111.11.111.11/28 - 111.11.111.12/28 - 111.11.111.13/28 - 111.11.111.14/28 名称服务器: 地址: - 8.8.8.8 - 8.8.4.4 搜索: [] 路线: - 至:默认 通过:111.11.111.1 wan2: 地址: - 222.22.222.10/29 - 222.22.222.11/29 - 222.22.222.12/29 - 222.22.222.13/29 - 222.22.222.14/29 名称服务器: 地址: - 8.8.8.8 - 8.8.4.4 搜索: [] 路线: - 至:默认 通过:222.22.222.9 局域网1: 地址: - 192.168.10.1/24 名称服务器: 地址:[] 搜索: [] 局域网2: 地址: - 192.168.20.1/24 名称服务器: 地址:[] 搜索: [] 版本: 2`
用户测试@路由器1:~$ ip 路由 默认通过 111.11.111.1 dev wan1 proto static 192.168.10.0/24 dev enp4s0 proto 内核范围链接 src 192.168.10.1 192.168.20.0/24 dev enp5s0 proto 内核范围链接 src 192.168.20.1 111.11.111.0/28 dev enp1s5 proto 内核范围链接 src 111.11.111.2 222.22.222.8/29 dev enp8s0 proto 内核范围链接 src 222.22.222.9
我们想要浏览的子网站及其各自的公共IP:
192.168.10.101 ---> 111.11.111.11 192.168.10.102 ---> 111.11.111.12 192.168.10.201 ---> 222.22.222.11 192.168.10.202 ---> 222.22.222.12 192.168.20.10 ---> 222.22.222.10
我发现我需要使用 IP ROUTE 处理多个路由表,但我尝试的所有配置都失败了......
有人知道我该如何解决这个问题吗?
我已经尝试了一些 nftables/ip 路由配置......但我无法使其工作......我搞砸了很多,甚至不知道我尝试过的一切......现在配置如下所示:
$ ip 路由 默认通过 111.11.111.9 dev wan1 192.168.10.0/24 dev lan1 proto 内核范围链接 src 192.168.10.1 192.168.20.0/24 dev lan2 proto 内核范围链接 src 192.168.20.1 111.11.111.0/28 dev wan1 proto 内核范围链接 src 111.11.111.2 222.22.222.8/29 dev wan2 proto 内核范围链接 src 111.11.111.10 $ ip 路由显示表 100 默认通过 111.11.111.1 dev wan1 proto static $ ip 路由显示表 200 默认通过 222.22.222.9 dev wan2 proto static $ ip 规则显示 0:从所有查找本地 32764:从 222.22.222.8/29 查找 200 原始静态 32765:从 111.11.111.0/28 查找 100 个原始静态 32766:来自所有查找主 32767:来自所有查找默认
我有一台 RHEL 服务器,计划用于设施监控。它在不同的子网上有 2 个网络接口。为了简洁起见,这些将是“ifconfig”的结果,我将它们称为:
现在我的问题如下:在服务器本身上,我可以 ping 通互联网(8.8.8.8),也可以 ping 通基础设施子网(22.22.22.201)上的设备,并且两者都使用了正确的接口(8.8.8.8 的 eno2 和 22.22.22.201 的 eno3)。例如
$ip route get 8.8.8.8
> 8.8.8.8 via 11.11.11.0 dev eno2 src 11.11.11.11 uid 0
$ip route get 22.22.22.201
> 22.22.22.201 dev eno3 src 22.22.22.22 uid 0
从我的办公室计算机(即远程)我也可以访问这两个子网上的设备,但我无法通过它自己的 IP 地址(既不是 11.11.11.11 也不是 22.22.22.22)访问服务器,除非我关闭其中一个接口。
因此从我的远程(办公室电脑)来看,我对服务器的 ping 如下所示:
# Both eno2 and eno3 active on server
ping 11.11.11.11 -t ping 22.22.22.22 -t
Request timed out Request timed out
Request timed out Request timed out
Request timed out Request timed out
...
# Turn off eno3
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
...
# Turn on eno3 (both on again)
Request timed out Request timed out
Request timed out Request timed out
Request timed out Request timed out
Request timed out Request timed out
...
# Turn off eno2
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
这不是防火墙问题,因为禁用防火墙后也会发生同样的情况:
$firewall-cmd --state
>not running
RHEL 论坛上也报告了同样的症状。当 RHEL 配置了多个 IP 时,只有一个 IP 可以从远程网络访问,因此我通过将 rp_filter 设置为 2 并将各个接口设置为 0(无安全性)来实现解决方案。每个接口的 rp_filter 结果如下:
#sysctl -a 2>/dev/null | grep "\.rp_filter"
>
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eno2.rp_filter = 0
net.ipv4.conf.eno3.rp_filter = 0
我的接口规则和表格的输出如下:
# ip -4 -br a ls
>
lo UNKNOWN 127.0.0.1/8
eno3 UP 22.22.22.22/24
eno2 UP 11.11.11.11/24
知识产权规则
# ip ru ls
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
IP 表
# ip -4 r ls table all
default via 11.11.11.1 dev eno2 proto dhcp src 11.11.11.11 metric 100
default via 22.22.22.1 dev eno3 proto static metric 101
22.22.22.0/24 dev eno3 proto kernel scope link src 22.22.22.22 metric 101
11.11.11.0/24 dev eno2 proto kernel scope link src 11.11.11.11 metric 100
169.254.0.0/16 dev eno3 scope link metric 1000
local 22.22.22.22 dev eno3 table local proto kernel scope host src 22.22.22.22
broadcast 22.22.22.255 dev eno3 table local proto kernel scope link src 22.22.22.22
local 11.11.11.11 dev eno2 table local proto kernel scope host src 11.11.11.11
broadcast 11.11.11.255 dev eno2 table local proto kernel scope link src 11.11.11.11
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
并使用 route -n 对上述输出进行总结:
root@APPSVR:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 11.11.11.1 0.0.0.0 UG 100 0 0 eno2
0.0.0.0 22.22.22.1 0.0.0.0 UG 101 0 0 eno3
22.22.22.0 0.0.0.0 255.255.255.0 U 101 0 0 eno3
11.11.11.0 0.0.0.0 255.255.255.0 U 100 0 0 eno2
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eno3
然而,同样的问题仍然存在,如果两个界面都处于活动状态,我就无法访问任何一个界面。
我还通过将这些更改写入相关配置文件(不记得具体在哪里)使这些更改持久化,是的,我已经重新启动了服务器。
任何帮助或其他建议都将不胜感激。我已经花了大约 3 天时间解决这个问题。提前致谢!
我有两台机器 A 和 B。A 是具有全局可路由的 IPv4 和 IPv6 地址的 VPS,B 是位于运营商级 NAT 后面的物理服务器:
A
:
B
在 RFC 6598 100.64.0.0/10 地址块中仅有一个 IPv4 地址 B1。
A 和 B 位于不同的网络、不同的 ISP 上,除了 A1 和 A2 可以从 B 访问之外,没有任何共同之处。
我需要在 A 和 B 之间配置一个隧道,使得 B 表现得好像A2 是它的地址一样。
具体来说,我需要能够:
我怎么做?