iptables 端口转发

iptables 端口转发

我想将发往端口 100 的流量转发到 127.0.0.1:101。实际目标是转发到不同的 IP:PORT,但为了让事情正常运转,我有一个套接字在 *:100 上监听。从这个网站和谷歌搜索“iptables 端口转发指南”,我被引导相信语法如下,这是我的规则集的一部分。

  #Set default policies to DROP

   iptables -P INPUT DROP

   iptables -P FORWARD DROP

   iptables -P OUTPUT DROP


   #Flush ruleset

   iptables -F

   iptables -t nat -F

   iptables -t filter -F


   #Allow local access

   iptables -A INPUT -i lo -j ACCEPT

   iptables -A OUTPUT -o lo -j ACCEPT


   #Allow ESTABLISHED,RELATED

   iptables -A INPUT -i eth0 -m sate --state ESTABLISHED,RELATED -j ACCEPT

   iptables -A OUTPUT 1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT


   #Allow outbound SYN requests

   iptables -A OUTPUT -o eth0 -m state --state NEW -j accept


   #### The routing related

   # Allow SYN requests for the port-to-be-forwarded

   iptables -A INPUT -i $INET_IFACE -p tcp --dport 100 -m state --state NEW -j ACCEPT


   # Route to 127.0.0.1:101

   iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 100 -j DNAT --to-destination 127.0.0.1:101


   # Accept the forward

   iptables -A FORWARD -t filter -i eth0 -p tcp --dport 101 -j ACCEPT


   # Accept all related in forward 

   iptables -A FORWARD -t filter -i eth0 -p tcp -m state --state ESTABLISHED,RELATED -j 
ACCEPT

我的 sysctl 设置是:

 # sysctl -p

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.all.rp_filter = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.conf.default.accept_source_route = 0

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.default.accept_redirects = 0

net.ipv4.conf.all.secure_redirects = 0

net.ipv4.conf.default.secure_redirects = 0

net.ipv4.icmp_echo_ignore_broadcasts = 1

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.all.log_martians = 1

kernel.randomize_va_space = 1


 # cat /proc/sys/net/ipv4/conf/eth0/forwarding

1

nmap 指出该端口对于 connect() 和 SYN 扫描是关闭的,但是对于 FIN 和 Xmas 扫描是打开|过滤的。

我错过了什么?

答案1

解决方案部分基于 wolfgansz。由于我最初并未在 serverfault 上注册为用户,并且后来清除了我的 cookie,因此似乎无法发表评论。

INPUT 和 OUTPUT 链的默认策略是 DROP,FORWARD 的默认策略是 ACCEPT。

function add_forward {
# $1 = title
# $2 = internal host
# $3 = external port
# $4 = internal port
if [  "$2" == "" ] || [ "$3" == "" ] || [ "$4" == "" ]; then
  echo Skipping forward $1
else
  echo "Forwarding port "$3" to "$2" port "$4" ("$1")"
  $IPT -t nat -A PREROUTING -p tcp --dst $MYIP --dport $3 -j DNAT --to-destination $2:$4
  $IPT -t nat -A POSTROUTING -p tcp --dst $2 --dport $4 -j SNAT --to-source $VMNETIP
  $IPT -t nat -A OUTPUT --dst $MYIP -p tcp --dport $3 -j DNAT --to-destination $2:$4
fi
}

最后使用它 add_forward "My forward", "192.168.0.101" 100 101

$MYIP 定义为 eth0 公共 IP $VMNETIP 是 vmware NAT 接口

总而言之,这使得 eth0:100 上的传入连接能够通过 vmnet nat 接口桥接到虚拟机。

希望这也能帮助其他人。

主机和客户系统上的主要调试工具是 tcpdump

“tcpdump -i eth0 port 100”用于监听主机。这揭示了一个问题,即我在 POSTROUTING 规则中设置了错误的 IP,导致 eth0 直接丢弃了数据包。

谢谢您的帮助。

答案2

端口转发实际上只适用于从一个以太网接口到另一个以太网接口。因此,我不得不假设 $INET_FACE 与 eth0 不同。为了便于理解,我将假设它是 eth1。

在这种情况下,您需要以下规则:

iptables -A 输入 -i eth1 -p tcp --dport 100 -m state --state NEW -j 接受
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 100 -j DNAT --to-destination 127.0.0.1:101
iptables -A FORWARD -t 过滤器 -i eth1 -p tcp --dport 101 -j ACCEPT
iptables -A OUTPUT -t 过滤器 -o eth0 -p tcp --dport 101 -j 接受

这样就打开了向内路径。但是,由于您的默认策略是丢弃没有匹配规则的数据包,因此您还需要一些返回流量的规则。
我不喜欢使用 iptables 构建过于复杂的防火墙,您很容易陷入一种很难理解发生了什么的情况。因此,我建议将 FORWARD 链的默认策略更改为 ACCEPT,并主要通过 INPUT 链和(如果需要)OUTPUT 链来控制流量。

如果以上内容不足以让您继续阅读,请发表评论,我可以提供进一步的提示。有一些关于通过 iptables 的流量的很好的图表,我特别喜欢这个这个。这些显示了使用了哪些表和链,并应允许您制定规则。永远记住,您需要为两个方向的流量制定规则。

答案3

您是否尝试重定向来自您自己的机器的流量?

如果是,您还应该在 nat 表的 OUTPUT 链中添加 DNAT 规则。PREROUTING 链将仅处理来自其他主机的数据包。

相关内容