tra-loi-cau-hoi-phat-trien-web.com

Làm thế nào tôi có thể chuyển tiếp với iptables?

Tôi muốn các kết nối đến trên ppp0 trên cổng 8001 được định tuyến đến 192.168.1.200 trên eth0 trên cổng 8080.

Tôi đã có hai quy tắc này

-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

và nó không hoạt động. Tôi đang thiếu gì?

118
Stu

Trước hết - bạn nên kiểm tra xem chuyển tiếp có được phép hay không:

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

Nếu cả hai trả về 1 Ổn mà. Nếu không làm như sau:

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

Điều thứ hai - DNAT chỉ có thể được áp dụng trên bảng nat. Vì vậy, quy tắc của bạn cũng nên được mở rộng bằng cách thêm đặc tả bảng (-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

Cả hai quy tắc chỉ được áp dụng cho TCP (nếu bạn cũng muốn thay đổi UDP, bạn cần cung cấp các quy tắc tương tự nhưng với -p udp tùy chọn được đặt).

Cuối cùng, nhưng không kém phần quan trọng là cấu hình định tuyến. Kiểu:

ip route

và kiểm tra xem 192.168.1.0/24 là một trong số các mục định tuyến được trả về.

97
oo_olo_oo

Tôi nghĩ những gì bạn muốn là:

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
15
Robert Gamble

Bạn quên địa chỉ nguồn đăng ký 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

Và đừng quên đặt tường lửa linux của bạn làm cổng mặc định trên máy tính có địa chỉ 192.168.1.200.

14
Zealotous

Tôi đã tạo tập lệnh bash sau để thực hiện việc này trên bộ định tuyến linux của mình. Nó tự động xâm nhập vào WAN IP và xác nhận các lựa chọn của bạn trước khi tiếp tục.

#!/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

Việc sử dụng tập lệnh rất đơn giản chỉ cần sao chép và dán nó vào một tập tin và sau đó.

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

Để loại bỏ quy tắc tương tự

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

Tôi nghĩ rằng điều này có thể tiết kiệm thời gian của ai đó trên bộ định tuyến tương ứng của họ.

6
Nullivex

Tôi có nhiệm vụ làm cho MachINE_A nghĩ rằng dịch vụ đang hoạt động trên MachINE_B, nhưng định tuyến lại một cách minh bạch tất cả các yêu cầu tới MachINE_C.

Bí quyết là sử dụng 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

Xin lưu ý rằng bạn có thể muốn Tweak các lệnh:

  1. Để chỉ cho phép chuyển tiếp gói trên một giao diện cụ thể. Ví dụ:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Để cho phép không chỉ MachINE_A, mà còn cho tất cả những người khác sử dụng chuyển tiếp cổng, hãy xóa:

    -s MACHINE_A
    
3
Denis Scherbakov

Thử

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

Các tệp này cho biết hạt nhân được phép chuyển tiếp các gói giữa các giao diện.

1
Adam Liss

Lệnh này không hoạt động đối với tôi:

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

Tôi có 2 giao diện LAN và FORWARD hoạt động khi tôi viết:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - Giao diện LAN (ví dụ: eth1, br0 ...)
  • FW_PORD - cổng chuyển tiếp (trên Máy chủ lưu trữ)
  • LAN_IP - Địa chỉ IP trên giao diện LAN (trên bộ định tuyến)

Dĩ nhiên, việc bảo vệ và KIẾM cũng cần thiết :)

0
Andrew