#!/bin/sh
echo "start clear iptables table v1.3"
iptables -t nat -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
echo "start config ip forward"
echo 1 > /proc/sys/net/ipv4/ip_forward
#set -x
echo "start const iptables"
function configRouteForward()
{
DNAT_ETH=$1
DNAT_ADDR=$2
DNAT_PORT=$5
DNAT_FORWARD_ADDR=$4
DNAT_FORWARD_PORT=$3
SNAT_ETH=$6
SNAT_ADDR=$7
SNAT_NETMASK=$8
echo "Config route forward:
DNAT_ETH=${DNAT_ETH}
DNAT_ADDR=${DNAT_ADDR}
DNAT_PORT=${DNAT_PORT}
DNAT_FORWARD_ADDR=${DNAT_FORWARD_ADDR}
DNAT_FORWARD_PORT=${DNAT_FORWARD_PORT}
SNAT_ETH=${SNAT_ETH}
SNAT_ADDR=${SNAT_ADDR}
SNAT_NETMASK=${SNAT_NETMASK}"
set -x
iptables -t nat -A PREROUTING -i $DNAT_ETH -d $DNAT_ADDR -p tcp --dport $DNAT_FORWARD_PORT -j DNAT --to $SNAT_ADDR:$DNAT_PORT
iptables -t nat -A POSTROUTING -o $SNAT_ETH -d $SNAT_NETMASK -j SNAT --to $DNAT_FORWARD_ADDR
set +x
}
function onExitCallback()
{
echo "networkmapstart exit!"
echo "start clear iptables table"
iptables -t nat -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
echo 0 > /proc/sys/net/ipv4/ip_forward
exit
}
trap 'onExitCallback' SIGTERM
trap 'onExitCallback' SIGINT
#配置路由转发
configRouteForward eth0 192.168.1.101 22101 192.168.2.103 22 eth1 192.168.2.101 192.168.2.0/24
#iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.101 -p tcp --dport 22101 -j DNAT --to 192.168.2.101:22
#iptables -t nat -A POSTROUTING -o eth1 -d 192.168.2.0/24 -j SNAT --to 192.168.2.103
iptables -L -t nat
while true
do
sleep 10
done
PREROUTING和POSTROUTING是Linux内核中网络地址转换(NAT)的两个阶段。
PREROUTING阶段发生在数据包进入路由表之前,主要用于修改目标IP地址和端口号。这个阶段通常用于目标地址转换(DNAT),即将数据包转发到另一个IP地址和端口上。POSTROUTING阶段则发生在数据包从路由表中选择出接口之后,主要用于修改源IP地址和端口号。这个阶段通常用于源地址转换(SNAT),即将数据包的源IP地址和端口号修改为路由器的IP地址和端口号,以便目标服务器返回数据时能够正确地路由到路由器。1
简而言之,PREROUTING链用于将数据包的公网IP地址转换为内部网络的IP地址,以便数据包能够被内部网络上的设备访问。POSTROUTING链则用于将内部网络上的设备返回的数据包的公网IP地址转换为内部网络的IP地址,以便数据包能够正确地离开内部网络并返回给发送者