我想将发往端口 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 链将仅处理来自其他主机的数据包。