如何移植iptables?


118

我希望将端口8001上ppp0上的连接路由到端口8080上eth0上的192.168.1.200。

我有这两个规则

-A PREROUTING  -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

而且不起作用。我想念什么?



我将使用npr标签(尽管这可能与编程相关,尽管措辞当然很差。)
MihaiLimbăşan

怎么样:我是一位试图建立环境的程序员,所以我可以在从内部网调用的eclipse中调试服务器应用程序。足够近?

当然,这就是我所说的“措辞不佳”的意思。您可以相应地编辑问题吗?
MihaiLimbăşan08年

Answers:


97

首先-您应该检查是否完全允许转发:

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

如果两个都返回1就可以。如果没有,请执行以下操作:

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

第二件事- DNAT只能在nat桌子上使用。因此,还应通过添加表规范(-t nat)来扩展您的规则:

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

这两个规则仅适用于TCP流量(如果您还想更改UDP,则需要提供类似的规则,但要-p udp设置选项)。

最后但并非最不重要的是路由配置。类型:

ip route

并检查是否192.168.1.0/24在返回的路由条目中。


16
我个人更喜欢这样的sysctl语法sysctl net.ipv4.conf.eth0.forwarding=1
Doud 2012年

1
如何删除输入错误的规则?
Nickolai Leschov 2014年

2
如果您没有防火墙限制/安全,则不需要第二行:“ iptables -A FORWARD -p tcp -d 192.168.1.200 –dport 8080 -m state -state NEW,ESTABLISHED,RElated -j ACCEPT”大多数家庭LAN都是这种情况,否则请谨慎使用-A,因为它将在限制/安全性之后添加它,并且可能无法正常工作(因此,请检查-I,这是在iptables规则的
前面

2
@ÁronLőrincz,不。除非在启动时明确加载,否则Iptables规则是易变的。
sherrellbc

1
@Nickolai Leschov,输入相同内容替换-A-D
Alexei Martianov '18

14

我认为您想要的是:

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080

2
嗯...那是我已经拥有的。我使用iptables-restore加载它,因此每个都在自己的部分中,但这就是我上面写的。

好的,原始语法看起来很糟糕。您是否在规则中尝试了-i ppp0?到底是什么问题?
罗伯特·格兰伯

13

您忘了路由后的源地址SNAT了:

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

并且不要忘记将linux防火墙设置为具有192.168.1.200地址的计算机上的默认网关。


您在POSTROUNTING步骤上倒退了。在这一点上,谈话仍在进行,--destination而不是--source
sherrellbc

6

我已经在Linux路由器上创建了以下bash脚本来执行此操作。它会自动推断WAN IP并在继续之前确认您的选择。

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr=`curl -4 -s icanhazip.com`

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

脚本的使用很简单,只需将其复制并粘贴到文件中即可。

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

删除相同规则

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

我认为这可以节省某人在各自路由器上的时间。


2

我的任务是让MACHINE_A认为服务实际上是在MACHINE_B上运行的,但是透明地将所有请求重新路由到MACHINE_C。

诀窍是使用MASQUERADE。

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

请注意,您可能需要调整以下命令:

  1. 仅允许在特定接口上转发数据包。例如:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. 为了不仅允许MACHINE_A,而且还允许所有其他机器使用端口转发,请删除:

    -s MACHINE_A
    

1

尝试

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

这些文件告诉内核允许在接口之间转发数据包。


0

此命令对我不起作用:

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

我有2个LAN接口,在撰写本文时,FORWARD可以工作:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF-LAN接口(例如eth1,br0 ...)
  • FW_PORD-转发的端口(在目标主机上)
  • LAN_IP-LAN接口上的IP地址(在路由器上)

当然也需要PREROUTING和FORWARD :)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.