重定向端口 A -> B 并阻止外部 B

重定向端口 A -> B 并阻止外部 B

我想将端口 A 重定向到端口 B 并从外部阻止端口 B。

答案 = 9922

B = 22

(是的,它是 ssh,而且我无法在配置中更改它。)

我有三个接口:

  • lo(回送)
  • p36p1 (以太网) [这就是‘外部’]
  • tun0 (vpn)

我有以下规则:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
  240 17755 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  tun0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9922
    0     0 ACCEPT     tcp  --  *      *       127.0.0.0/8          0.0.0.0/0            tcp dpt:22
    4   240 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 32 packets, 3854 bytes)
 pkts bytes target     prot opt in     out     source               destination         

这些用于路由:

Chain PREROUTING (policy ACCEPT 1 packets, 60 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   240 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9922 redir ports 22

Chain INPUT (policy ACCEPT 1 packets, 60 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1 packets, 68 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REDIRECT   tcp  --  *      lo      0.0.0.0/0            0.0.0.0/0            tcp dpt:9922 redir ports 22

Chain POSTROUTING (policy ACCEPT 1 packets, 68 bytes)
 pkts bytes target     prot opt in     out     source               destination         

这不起作用。

路由端口是否转发到本地主机?我和我的管理员同事(我是新手)一起检查了这个问题,他也找不到。它看起来像是在路由之后的某个地方被阻止了。但在哪里以及为什么呢?不知道。

是的,我已经用 Google 搜索过并尝试了找到的所有规则。

也许,只是也许,值得一提的是,我正在使用 iptables,但最初的系统附带了防火墙 (fedora 19)。我已停用它们并启用了 iptables。

答案1

当流量到达过滤(默认)表时,它已经被 nat 表修改,因此您没有关于原始目的地(端口 9922)的信息。

您可以做的是标记传入 9922 的流量,然后使用它来允许(禁止)它。(此示例中的 br0 是外部接口)

iptables -t nat -A PREROUTING -i br0 -p tcp --dport 9922 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 9922 -j REDIRECT --to-port 22
iptables -A INPUT -i br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW -m mark --mark 1 -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW -j DROP

编辑

似乎还有其他方法可以实现相同的目的。毕竟,Conntrack 可以访问原始端口。这使得标记变得没有必要。

iptables -t nat -A PREROUTING -i br0 -p tcp --dport 9922 -j REDIRECT --to-port 22
iptables -A INPUT -i br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW --ctorigdstport 9922 -j ACCEPT
iptables -A INPUT -i br0 -p tcp --dport 22 -m conntrack --ctstate NEW -j DROP

相关内容