我正在使用 iptables 为 vpn 用户标记数据包并进行拆分隧道。vpn 用户通过 tun0 接口进行隧道传输,其他用户可以直接访问互联网。一切按预期工作,但我对一条 REJECT 规则有疑问,即我不明白该规则到底在做什么以及语法。现在我想通过 vpn 连接打开一个端口。当我删除最后一个 OUTPUT REJECT 规则时,我可以做到这一点,然后它就可以正常工作了。我应该在 REJECT 规则之前添加什么规则以允许端口工作并仍然保留 REJECT 规则?
export INTERFACE="tun0"
export VPNUSER="vpn"
export LOCALIP="192.168.1.28"
export NETIF="eth0"
# flushes all the iptables rules, if you have other rules to use then add them into the script
iptables -F -t nat
iptables -F -t mangle
iptables -F -t filter
# mark packets from $VPNUSER
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p udp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p tcp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! --src $LOCALIP -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -j CONNMARK --save-mark
# allow responses
iptables -A INPUT -i $INTERFACE -m conntrack --ctstate ESTABLISHED -j ACCEPT
# allow open TCP port 47657
iptables -A INPUT i $INTERFACE -p tcp --dport 47657 -j ACCEPT
# block everything incoming on $INTERFACE to prevent accidental exposing of ports
iptables -A INPUT -i $INTERFACE -j REJECT
# let $VPNUSER access lo and $INTERFACE
iptables -A OUTPUT -o lo -m owner --uid-owner $VPNUSER -j ACCEPT
iptables -A OUTPUT -o $INTERFACE -m owner --uid-owner $VPNUSER -j ACCEPT
# all packets on $INTERFACE needs to be masqueraded
iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE
# reject connections from predator IP going over $NETIF
iptables -A OUTPUT ! --src $LOCALIP -o $NETIF -j REJECT
问题出在最后一行:
iptables -A OUTPUT ! --src $LOCALIP -o $NETIF -j REJECT
1)我不明白这一行到底起什么作用,以及其语法。
2) 如果我删除最后一行,端口 47657 将打开并处于活动状态。如果包含上面的行,则端口已关闭。我应该在 OUTPUT REJECT 规则之前插入什么规则才能仅打开端口 47657?
非常感谢!
答案1
类似这样的:
iptables -I 输入 -p tcp --dport 47657 -j 接受
如果 TCP 是您将在此端口上使用的协议。请记住:-A 是在 IPTABLES 中附加规则,它将始终放在最后。如果您使用 -I 是为了赋予它优先级,因此它会将规则放在规则的开头。如果您有更多可能与此规则混淆的规则,您可能需要将其放在准确的位置。