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


118

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ì?



Tôi sẽ sử dụng thẻ npr (mặc dù điều này thể liên quan đến lập trình, mặc dù dĩ nhiên là không đúng cách.)
Mihai Limbăşan

Làm thế nào về điều này: Tôi là một lập trình viên đang cố gắng thiết lập một môi trường để tôi có thể gỡ lỗi ứng dụng máy chủ của mình trong nhật thực được gọi từ innernet. Đủ gần?

Chắc chắn, đó là những gì tôi có nghĩa là "kém ngữ pháp" ... Bạn có thể chỉnh sửa câu hỏi cho phù hợp?
Mihai Limbăşan

Câu trả lời:


97

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ề 1thì không sao. 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 - chỉ DNATcó thể được áp dụng trên natbàn. Vì vậy, quy tắc của bạn 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 lưu lượng 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 udptù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. Thể loại:

ip route

và kiểm tra nếu 192.168.1.0/24là trong số các mục định tuyến trả lại.


16
Cá nhân tôi thích sysctlcú pháp nhưsysctl net.ipv4.conf.eth0.forwarding=1
Doud

1
Làm cách nào để xóa quy tắc nhập sai?
Nickolai Leschov

2
dòng thứ hai: "iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state MỚI, ESTABOUNDED, RelATED -j ACCEPT" KHÔNG bắt buộc nếu bạn không bị hạn chế / bảo mật tường lửa, điều này không bắt buộc là trường hợp của hầu hết các mạng LAN gia đình, nếu không, hãy cẩn thận với -A, vì nó sẽ thêm vào nó SAU các hạn chế / bảo mật và có thể không hoạt động (vì vậy, hãy kiểm tra -I thay vào đó, đó là thêm IN FRONT của các quy tắc iptables)
THESorcerer

2
@ ÁronLőrincz, Không. Quy tắc Iptables không ổn định trừ khi được tải rõ ràng khi khởi động.
sherrellbc

1
@Nickolai Leschov, nhập cùng thay thế -Abằng-D
Alexei Martianov

14

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

2
Ừm ... đó là những gì tôi đã có. Tôi sử dụng iptables-restore để tải nó để mỗi cái nằm trong phần riêng của nó, nhưng đó là những gì tôi đã viết ở trên.

Được rồi, cú pháp nhìn xấu trong bản gốc. Bạn đã thử -i ppp0 trong các quy tắc? Vấn đề chính xác là gì?
Robert Gamble

13

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.


Bạn đã nhận nó ngược trên POSTROUNTINGbước. Tại thời điểm này, cuộc trò chuyện vẫn còn --destinationhơn là --source.
sherrellbc

6

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 IP 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ọ.


2

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 điều chỉnh 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
    

1

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.


0

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ủ giam giữ)
  • 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 :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.