我想将端口 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