我的家庭服务器有两个主要接口,eth1(一个标准的互联网连接)和tun0(一个 OpenVPN 隧道)。我想iptables用来强制 UID 1002 拥有的本地进程生成的所有数据包通过 退出tun0,所有其他数据包通过 退出eth1。
我可以轻松标记匹配的数据包:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Run Code Online (Sandbox Code Playgroud)
现在,我想在 POSTROUTING 链(可能是 mangle 表的)中放置一些规则来匹配标有 11 的数据包并将它们发送到tun0,然后是匹配所有数据包并将它们发送到 的规则eth1。
我找到了 ROUTE 目标,但这似乎只是重写了源接口(除非我读错了)。
iptables 有这个能力吗?我是否必须弄乱路由表(通过ip route或仅使用旧route命令)?
编辑:我想也许我应该提供更多信息。我目前没有其他iptables规则(虽然我可能会创建一些规则来执行不相关的任务)。此外,输出ip route为:
default via 192.168.1.254 dev eth1 metric 203
10.32.0.49 dev tun0 proto kernel scope link src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.73 metric 203
Run Code Online (Sandbox Code Playgroud)
我还没有碰过路由表——这就是目前的情况(虽然它看起来很脏)。对不起,我没有route在这台机器上安装旧命令。
并且ip addr(当然,可以忽略 eth0 和 eth2 - 它们是目前未使用的 NIC)的输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/none
inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0
Run Code Online (Sandbox Code Playgroud)
编辑:我已经得到了一些工作,但它没有将标记的数据包转发到 tun0。基本上,我添加了一个表 (11),并使用了:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Run Code Online (Sandbox Code Playgroud)
当我刚刚时sudo -u user1000 wget -qO- whatismyip.org,我得到了我家的外部 IP 地址,但如果我这样做了sudo -u user1002 wget -qO- whatismyip.org,我也会得到我家的 IP 地址(但我应该在 OpenVPN 隧道的另一端获取 IP)。
运行iptables -vL确认数据包与标记规则匹配,但它们似乎不遵循路由规则。
编辑:我在这上面花了很长时间,虽然它仍然不起作用,但我想我更接近了。
iptables 规则必须在mangle表的 OUTPUT 链中。我想我还需要nat表的 POSTROUTING 链中的 MASQUERADE 规则来设置源地址。但是,在 OUTPUT 的 mangle 之后发生的重新路由无法正常工作。
我现在已经在这上面花了 5 个小时,所以我要休息一下,可能会在今晚晚些时候或明天某个时候回来。
Lek*_*eyn 33
我最近遇到了类似的问题,尽管略有不同。我想航线仅在一个OpenVPN tap0中接口的TCP端口25(SMTP),而路由所有其他流量(即使是相同的主机)在默认界面。
为此,我必须标记数据包并设置处理它的规则。首先,添加一条规则,使内核路由数据包标记为2through 表3(稍后解释):
ip rule add fwmark 2 table 3
Run Code Online (Sandbox Code Playgroud)
您可以向 中添加一个符号名称/etc/iproute2/rt_tables,但我没有费心这样做。数量2和3是随机选择的。事实上,这些可以是相同的,但为了清楚起见,我没有在这个例子中这样做(尽管我是在我自己的设置中这样做的)。
添加用于通过不同接口重定向流量的路由,假设网关为10.0.0.1:
ip route add default via 10.0.0.1 table 3
Run Code Online (Sandbox Code Playgroud)
很重要!刷新你的路由缓存,否则你将不会得到回复,双手放在头发上几个小时:
ip route flush cache
Run Code Online (Sandbox Code Playgroud)
现在,设置用于标记指定数据包的防火墙规则:
iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2
Run Code Online (Sandbox Code Playgroud)
上述规则仅适用于来自本地机器的数据包。请参阅http://inai.de/images/nf-packet-flow.png。根据您的要求进行调整。例如,如果您只想通过tap0接口路由传出 HTTP 流量,请将465 更改为 80。
为了防止通过tap0获取您的 LAN 地址作为源 IP发送的数据包,请使用以下规则将其更改为您的接口地址(假设10.0.0.2为 interface 的 IP 地址tap0):
iptables -t nat -A POSTROUTING -o tap0 -j SNAT --to-source 10.0.0.2
Run Code Online (Sandbox Code Playgroud)
最后,放宽反向路径源验证。有人建议您将其设置为0,但2根据https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt似乎是更好的选择。如果您跳过此步骤,您将收到数据包(可以使用 确认tcpdump -i tap0 -n),但数据包不会被接受。更改设置以便接受数据包的命令:
sysctl -w net.ipv4.conf.tap0.rp_filter=2
Run Code Online (Sandbox Code Playgroud)
我解决了这个问题。问题是,在表11的路由规则被击中,但路由规则,使其无法工作。这个脚本是我现在使用的,它似乎运行良好(尽管它显然特定于我的设置)。此外,我创建了一个新表 21,专门用于主上行链路 (eth1)。
# Add relevant iptables entries.
iptables -t mangle -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
# Flush ALL THE THINGS.
ip route flush table main
ip route flush table 11
ip route flush table 21
ip rule flush
# Restore the basic rules and add our own.
ip rule add lookup default priority 32767
ip rule add lookup main priority 32766
ip rule add fwmark 11 priority 1000 table 11
# This next rule basically sends all other traffic down eth1.
ip rule add priority 2000 table 21
# Restore the main table. I flushed it because OpenVPN does weird things to it.
ip route add 127.0.0.0/8 via 127.0.0.1 dev lo
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.73
ip route add default via 192.168.1.254
# Set up table 21. This sends all traffic to eth1.
ip route add 192.168.1.0/24 dev eth1 table 21
ip route add default via 192.168.1.254 dev eth1 table 21
# Set up table 11. I honestly don't know why 'default' won't work, or
# why the second line here is needed. But it works this way.
ip route add 10.32.0.49/32 dev tun0 table 11
ip route add 10.32.0.1 via 10.32.0.50 dev tun0 table 11
ip route add 0.0.0.0/1 via 10.32.0.50 dev tun0 table 11
ip route flush cache
Run Code Online (Sandbox Code Playgroud)
## MeanderingCode 编辑(因为我还不能评论)
感谢您的回答!似乎这可能会变得混乱,因为您必须在此处维护路线信息(可能会重复或破坏其他可能想要设置路线的东西。
您可能会在 OpenVPN 的路由表中遇到“奇怪的事情”,因为服务器被配置为“推送”路由,使所有流量都可以通过 VPN 网络接口路由,而不是“裸”互联网。或者您的 OpenVPN 配置或任何设置它的脚本/应用程序正在设置路由。
在前一种情况下,你可以编辑你的OpenVPN的配置,把含有“路由nopull”一行
在为OpenVPN的或任何包装后,检查配置(网络管理器,OpenVPN的,例如在许多目前的Linux桌面发行版)
在无论哪种情况,消除设置的路由配置都比刷新表更干净、更安全,具体取决于您何时运行此脚本以及您的系统正在做什么。干杯!
| 归档时间: |
|
| 查看次数: |
102108 次 |
| 最近记录: |