我是 iptables 新手,但今天在我的 raspian 上配置了一个简单的 natting:
# Always accept loopback traffic
/sbin/iptables -A INPUT -i lo -j ACCEPT
# Allow established connections, and those not coming from the outside
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -i tun0 -j ACCEPT
/sbin/iptables -A FORWARD -i tun0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow outgoing connections from the LAN side.
/sbin/iptables -A FORWARD -i eth2 -o tun0 -j ACCEPT
# Masquerade.
/sbin/iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
# Don't forward from the outside to the inside.
/sbin/iptables -A FORWARD -i tun0 -o tun0 -j REJECT
# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward
如您所见,我还使用 openvpn 并将流量重定向到隧道接口。我想创建一个例外,例如将端口范围 900 到 999 和源 192.168.1.5 排除并直接发送到接口 eth1 并避免 VPN 加密。
我怎样才能创建这样的规则?
非常感谢您的意见。
编辑:我尝试过类似的东西
iptables -t nat -A POSTROUTING -p tcp --dport 900:999 --out-interface eth1 -j MASQUERADE
但好像并没有达到预期的效果...
答案1
您需要策略路由来为每个特定流量设置路由表。我找到了一个简洁且很好的例子Linux 高级路由迷你指南。
将以下行放入/etc/iproute2/rt_tables
:
1 DIRECT
然后你可以这样做:
iptables -t mangle -A PREROUTING -p tcp --dport 900:999 -j MARK --set-mark 1
ip route add default via <gateway address> dev eth1 table DIRECT
ip rule add from all fwmark 1 table DIRECT
ip rule add from 192.168.1.5/32 table DIRECT
答案2
在你的帮助下我设法解决了这个问题。必须为 eth1 上的传入和传出添加额外的规则,并更改 PREROUTING 条件以仅匹配 ip 192.168.1.5,而不是添加规则。使用 ip Rule add from 192.168.1.5/32 表 DIRECT 的路由方法导致来自 192.168.1.5 的所有流量都通过 eth1 而不是仅通过端口 900-999。最终配置如下所示:
# Always accept loopback traffic
/sbin/iptables -A INPUT -i lo -j ACCEPT
# Allow established connections, and those not coming from the outside
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -i tun0 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -i eth1 -j ACCEPT
/sbin/iptables -A FORWARD -i tun0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A FORWARD -i eth1 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow outgoing connections from the LAN side.
/sbin/iptables -A FORWARD -i eth2 -o tun0 -j ACCEPT
/sbin/iptables -A FORWARD -i eth2 -o eth1 -j ACCEPT
# Masquerade.
/sbin/iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# Don't forward from the outside to the inside.
/sbin/iptables -A FORWARD -i tun0 -o tun0 -j REJECT
# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward
# Port exceptions
# Added -s for source address 192.168.1.5 here
iptables -t mangle -A PREROUTING -s 192.168.1.5 -p tcp --dport 900:999 -j MARK --set-mark 1
ip route add default via 192.168.2.1 dev eth1 table DIRECT
ip rule add from all fwmark 1 table DIRECT
再次感谢你的帮助。