Solusi 1:
Pertama-tama - Anda harus memeriksa apakah penerusan diperbolehkan sama sekali:
cat /proc/sys/net/ipv4/conf/ppp0/forwarding
cat /proc/sys/net/ipv4/conf/eth0/forwarding
Jika keduanya mengembalikan 1
tidak apa-apa. Jika tidak, lakukan hal berikut:
echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding
Hal kedua - DNAT
dapat diterapkan pada nat
meja saja. Jadi, aturan Anda harus diperluas dengan menambahkan spesifikasi tabel juga (-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
Kedua aturan hanya diterapkan pada lalu lintas TCP (jika Anda juga ingin mengubah UDP, Anda perlu memberikan aturan serupa tetapi dengan -p udp
rangkaian pilihan).
Terakhir, namun tidak kalah pentingnya adalah konfigurasi perutean. Ketik:
ip route
dan periksa apakah 192.168.1.0/24
adalah di antara entri perutean yang dikembalikan.
Solusi 2:
Saya pikir yang Anda inginkan adalah:
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
Solusi 3:
Anda lupa alamat sumber postrouting SNAT 'ing:
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
Dan jangan lupa untuk mengatur firewall linux Anda sebagai gateway default di komputer dengan alamat 192.168.1.200.
Solusi 4:
Saya telah membuat skrip bash berikut untuk melakukan ini di router linux saya. Secara otomatis menyimpulkan IP WAN dan mengonfirmasi pilihan Anda sebelum melanjutkan.
#!/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
Penggunaan skripnya sederhana, cukup salin dan tempel ke file lalu.
# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added
Untuk menghapus aturan yang sama
# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed
Saya pikir ini mungkin menghemat waktu seseorang di router masing-masing.
Solusi 5:
Saya memiliki tugas untuk membuat MACHINE_A berpikir bahwa layanan berjalan secara fisik di MACHINE_B, tetapi secara transparan merutekan ulang semua permintaan ke MACHINE_C.
Triknya adalah menggunakan 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
Harap dicatat bahwa Anda mungkin ingin men-tweak perintah:
-
Untuk mengizinkan penerusan paket hanya pada antarmuka tertentu. Misalnya:
sysctl net.ipv4.conf.eth0.forwarding=1
-
Untuk mengizinkan tidak hanya MACHINE_A, tetapi juga yang lainnya untuk menggunakan penerusan porta, hapus:
-s MACHINE_A