즉,
eth0(LAN), eth1(ADSL), eth2(4G)의 3개 인터페이스입니다. eth0
-> eth1: 작동 중
(포트 80, 443, 4070) eth0 -> eth2: 발생하지 않음
이 아이디어를 그래픽으로 표현하면 다음과 같습니다.
포트 80과 443은 eth2를 통과
하고 나머지는 eth1을 통과합니다.
네트워크 계획:
eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf)
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1
이 새로운 스크립트는 22와 4070을 올바른 테이블로 다시 라우팅하는 것 같습니다.
그러나 일단 테이블에 도달하면 eth2로 다시 라우팅되지 않습니다.
22 및 4070을 제외하고 스크립트가 작동합니다!
(포트 80은 주석 처리되지 않았으며 작동하지만 eth1을 통과하는 것은 잘못되었습니다.)
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
### iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254
echo "201 eth2.out" >> /etc/iproute2/rt_tables
ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
이전 스크립트:
Ignore everything below unless you're interested in retracing my steps!!
뭔가 잘못했을 경우를 대비해 환경을 설정하기 위해 router.sh 스크립트를 만들었습니다. 3개의 포트가 있고 이를 4G 연결로 보내고 나머지는 유선 ADSL 연결로 보내고 싶습니다. 이를 위해 --dport == 443 | 조건이 충족되면 기본 경로에서 패킷을 끊고 4G 인터페이스를 통해 보내도록 iptables에 지시합니다. 80|4070
그러나 이것은 작동하지 않습니다. 어쨌든 여전히 유선 전화를 통해 라우팅되고 있습니다.
내 스크립트는 다음과 같습니다.
#!/bin/bash
## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl
## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254
## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
또한 스크립트 하단에 다음 3개를 추가해 보았습니다.
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"
또한 성공하지 않고 시도했습니다.
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
마지막으로 시도한 것은 다음과 같습니다.
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
라우팅이 제대로 작동하고 웹 검색, 음악 듣기 등을 할 수 있지만 잘못된 인터페이스를 통해 수행하고 있습니다. 나는 오랫동안 인터넷 검색을 했고 내가 하고 있는 일과 그 이유를 이해하기 위한 약간의 정보를 찾았습니다. tc를 통해 트래픽 조절을 할 수 있지만, iptables에서 패킷을 표시하여 수행할 수 있다면 많은 도움이 될 것입니다.
내 생각엔 주로 잘못된 순서로 다른 규칙을 적용하고 있는 것 같습니다.가장 무도회부분? 아니면 존재해야 하는가?
누군가 어떻게 설명할 수 있나요?DNAT외부 인터페이스(1개 또는 2개의 프로토콜)에서 내부 10.0.0.0 주소 공간까지 tcp:80이라고 합니까?
산출:
root@Netbridge:~# route -n Kernel IP routing table Destination
Gateway Genmask Flags Metric Ref Use Iface<br>
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1<br>
10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0<br>
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2<br>
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
root@Netbridge:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:4e
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
eth1 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:58
inet addr:192.168.1.74 Bcast:192.168.1.255 Mask:255.255.255.0
eth2 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:62
inet addr:192.168.0.91 Bcast:192.168.0.255 Mask:255.255.255.0
다음 지침을 따르십시오.
대상 포트에 따라 다양한 인터페이스로 트래픽 출력
iptables는 특정 포트를 특정 네트워크 카드로 전달합니다.
다른 관련 스레드에서.
답변1
BatchyX는 이미 iptables 및 라우팅에 대해 정말 좋은 설명을 제공하므로 게으름을 피우고 바로 스크립트로 넘어가겠습니다.
192.168.0.91 NAT를 통해 모든 트래픽을 포트 80,443,22,4070으로 전달해야 합니다. 나머지는 192.168.1.254를 통해 NAT됩니다.
나는 다시 테스트했고 결국 이것을 따라 갔다.가이드. 이 가이드에서 누락된 부분은 내 스크립트의 마지막 3줄입니다. 다른 포트에서 이것을 찾았지만 링크를 잃어버렸습니다.
이것은 테스트된 작업 스크립트입니다.
기본 경로가 필요합니다
내가 스크립트에 넣지 않은 한 가지는 기본 경로를 설정하는 것이었습니다. 그것은해야한다
route add default gw 192.168.1.254
이렇게 하면 이 경로 route -n
가 유일한 기본 경로(Dest:0.0.0.0)여야 합니다.
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1
fw-router.sh
# iptables 재설정/새로 고침 iptables -F iptables-X iptables -t nat -F iptables -t nat -X iptables -t 맹글 -F iptables -t 맹글 -X iptables -P 입력 허용 iptables -P 앞으로 수락 iptables -P 출력 허용 #재설정/플러시/설정 IP 라우팅(표 4) IP 경로 새로 고침 테이블 4 IP 라우팅 표시 테이블 main | grep -Ev ^default | ROUTE를 읽을 때 테이블 4 추가 완료; IP 라우팅은 표 4에 추가되었으며 기본적으로 192.168.0.1을 전달합니다. #D.Port와 일치하는 패킷을 표시합니다. iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j MARK --set-mark 4 #SNAT 규칙 iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.74 iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.0.91 #IP라우팅 IP 규칙 표 4에 fwmark 4 추가 IP 경로 새로 고침 캐시 #IP스택 #가이드에서 누락된 부분입니다 에코 1 > /proc/sys/net/ipv4/ip_forward /proc/sys/net/ipv4/conf/*/rp_filter의 f에 대해 echo 0 > $f를 실행합니다. 에코 0 > /proc/sys/net/ipv4/route/flush
PS1:즉, MASQUERADE
NAT는 일종의 로드 밸런싱이 필요하거나 들어오는 트래픽을 처리하기 위해 DNAT가 필요한 여러 외부 IP에 대해 작동하지 않습니다(대부분의 경우, 확실히 귀하의 경우). 방향 제어가 필요합니다 SNAT
.
PS2:순수한 iptables로는 충분하지 않습니다.
답변2
참고: 저는 첫 번째 스크립트만 고려하고 이전 스크립트는 무시했습니다.
- 현재 iptables를 사용하기 위해 netfilter 모듈을 수동으로 수정할 필요는 없습니다. 이는 사용자 정의 연결 추적기에만 필요합니다.
- 혼동하지
route
마십시오ip route
. 이것은 순수한 악입니다. 어디서나 사용 하고ip
잊어버리세요ifconfig
route
/etc/iproute2/rt_tables
재부팅 후에도 재설정되지 않습니다. 동일한 항목을 계속해서 추가하는 것은 좋은 생각이 아니며 한 번만 추가하면 됩니다.rt_tables
이름 별명을 숫자 값으로 정의하기만 하면 구성이 변경되지 않는다는 점을 기억하십시오 .현재
iptables
:FORWARD
체인에서 LAN에서 4G로 패킷을 삭제합니다. 이것은 좋지 않습니다. 이FORWARD
후크는 라우팅이 완료된 후 사용됩니다. 이 시점에서 모든 정책 라우팅이 완료되며 데이터 패킷을 4G로 보내야 할지 ADSL로 보내야 할지 이미 알려져 있습니다. 경로 재지정 중이나 이후에는FORWARD
재라우팅이 없습니다FORWARD
. 기술적으로 재라우팅은 심각한 경우 이후에 수행될 수 있지만POSTROUTING
다시 주제로 돌아갑니다.
이제 라우팅을 위해: Ubuntu는 기본적으로 역방향 경로 필터링을 활성화합니다. 역방향 경로 필터링은 다음과 같이 작동합니다. 커널이 인터페이스 A(전달 여부에 관계없이)에서 패킷을 수신하면 소스 주소와 대상 주소를 반대로 바꾸고 결과 패킷이 인터페이스 A를 통해 라우팅되어야 하는지 여부를 확인합니다. 그렇지 않은 경우 주소 스푸핑 시도로 인해 패킷이 삭제됩니다.
에서 수신한 패킷에는 eth0
문제가 되지 않습니다 . eth1
소스 및 대상 IP 주소가 바뀔 때 커널은 이를 테이블의 기본 경로로 사용하기 때문에 에서 수신된 패킷의 경우 에도 문제가 되지 않습니다 main
. 에서 수신한 패킷의 경우 eth2
태그가 없으면 커널이 테이블의 기본 경로에 도달하고 main
해당 패킷이 에서 수신되어야 한다고 생각하기 때문에 문제가 됩니다 eth1
. 가장 간단한 해결책은 eth1에서 역방향 경로 필터링을 비활성화하는 것입니다.
sysctl -w net.ipv4.conf.eth1.rp_filter=0