게이트웨이와 방화벽으로 사용하는 Linux 시스템이 있습니다.
리눅스 머신(게이트웨이/방화벽)을 인터넷 연결을 허용하는 장치(라우터 수집기), 2개의 IP 주소 172.16.61.1
와 172.16.62.254
.
+---------+ +-----------------+ /
| | | Router | /
| GW | | Aggregator | /
| | | | /
+------------------| Firewall+----+-> 172.16.61.1 +---/
| | | | | |
| | +----+-> 172.16.62.254 | |
__ | | | | | |
___/ \_ | +---------+ +-----------------+ |
_/ \__ | |
/ \ | |Internet
| Local network | |
| 192.168.1.0/24 + |
| 192.168.3.0/24 | |
\_ __/ \
\__ __/ \
\___/
이것라우터 수집기인터넷에 액세스할 수 있는 게이트웨이 역할을 하지만 IP 172.16.62.254를 통해 액세스하면 1Gb/s의 대역폭이 보장되고, 주소 172.16.61.1을 통해 액세스하면 대역폭이 300Mb/s로 제한된다는 특징이 있습니다. .
액세스라우터 수집기IP 172.16.61.1을 통해 접속하려면 소스 IP가 네트워크 172.16.61.0에 속해야 하고, IP 172.16.62.254를 통해 접속하려면 소스 IP가 172.16.62.100이어야 합니다. 이를 위해,게이트웨이/방화벽로컬 네트워크에서 들어오는 소스 IP 주소에 대해 변환을 수행해야 합니다.
Linux 시스템의 IP 주소는 다음과 같습니다.
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:14:5e:08:49:06 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.150/24 brd 192.168.1.255 scope global eth3
inet 192.168.168.1/24 brd 192.168.168.255 scope global eth3:0
inet 192.168.8.1/24 brd 192.168.8.255 scope global eth3:2
inet6 fe80::214:5eff:fe08:4906/64 scope link
valid_lft forever preferred_lft forever
3: eth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:13:49:24:41:6a brd ff:ff:ff:ff:ff:ff
inet 192.168.3.1/24 brd 192.168.3.255 scope global eth5
inet6 fe80::213:49ff:fe24:416a/64 scope link
valid_lft forever preferred_lft forever
4: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:13:49:24:3e:e0 brd ff:ff:ff:ff:ff:ff
inet 172.16.61.2/24 brd 172.16.61.255 scope global eth4
inet 172.16.62.100/24 brd 172.16.62.255 scope global eth4:1
inet 172.16.61.3/24 brd 172.16.61.255 scope global secondary eth4:2
inet 172.16.61.4/24 brd 172.16.61.255 scope global secondary eth4:3
inet 172.16.61.5/24 brd 172.16.61.255 scope global secondary eth4:4
inet 172.16.61.6/24 brd 172.16.61.255 scope global secondary eth4:5
inet 172.16.61.7/24 brd 172.16.61.255 scope global secondary eth4:6
inet6 fe80::213:49ff:fe24:3ee0/64 scope link
valid_lft forever preferred_lft forever
5: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
link/sit 0.0.0.0 brd 0.0.0.0
데이터 패킷이 네트워크의 소스 주소로 변환되는 경우 게이트웨이로 172.16.61.0/24
사용해야 하며, 172.16.61.1
데이터 패킷이 소스 주소로 사용되어 IP 주소로 변환되는 경우 게이트웨이로 172.16.62.100
사용해야 합니다 .172.16.62.254
네트워킹에 대해서만 참조할 경우 172.16.61.0/24
주소 변환은 다음 명령을 사용하여 iptables에서 수행됩니다.
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.61.2
iptables -A OUTPUT -s 172.16.61.2 -j ACCEPT
패킷을 라우팅하기 위해 172.16.61.1
다음을 사용하여 표시를 시도했습니다.
iptables -A OUTPUT -t mangle -s 172.16.61.2 -j MARK --set-mark 2
iptables -A POSTROUTING -t mangle -s 192.168.1.0/255.255.255.0 -j MARK --set-mark 2
그런 다음 iproute2를 사용하여 다음 구성으로 패킷을 라우팅합니다.
$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
1 route61
2 route62
$ ip route show table route61
172.16.61.0/24 via 172.16.61.1 dev eth4
default via 172.16.61.1 dev eth4
$ ip rule show
0: from all lookup local
32764: from all fwmark 0x2 lookup route61
32765: from 172.16.61.0/24 lookup route61
32766: from all lookup main
32767: from all lookup default
그런데 노력해도 안 되더라.
$ nc -v 216.58.205.78 443
나는 가지고있다
nc: connect to 216.58.205.78 port 443 (tcp) failed: Network is unreachable
내가 뭘 잘못했나요?
고쳐 쓰다:
내가 시도한 것ABURL 게시물에 제안됨 라우팅 정책 데이터베이스가 표시된 패킷을 감지하지 못합니다.
다음 줄을 추가했습니다.
iptables -t mangle -I OUTPUT -m connmark ! --mark 0 -j CONNMARK --restore-mark
iptables -A OUTPUT -t mangle -s 172.16.61.2 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark
맹글 테이블은 다음과 같습니다.
$ iptables -t mangle -L -v -n --line-numbers
Chain PREROUTING (policy ACCEPT 31455 packets, 11M bytes)
num pkts bytes target prot opt in out source destination
1 1 98 CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 MARK match !0x0 CONNMARK save
Chain INPUT (policy ACCEPT 2800 packets, 199K bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 28028 packets, 11M bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1860 packets, 433K bytes)
num pkts bytes target prot opt in out source destination
1 1 70 CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK match !0x0 CONNMARK restore
2 13 818 MARK all -- * * 172.16.61.2 0.0.0.0/0 MARK set 0x2
결과를 얻지 못했습니다.
아래 지침:
sysctl -w net.ipv4.conf.eth0.rp_filter=2
sysctl -w net.ipv4.fwmark_reflect=1
알 수 없는 키로 보고하세요.
iptables-save -c
게시물과 관련이 없는 일부 줄의 출력이 지워집니다.
# Generated by iptables-save v1.3.8 on Wed Aug 11 13:11:07 2021
*filter
:INPUT DROP [79:12622]
:FORWARD DROP [18:1104]
:OUTPUT DROP [0:0]
[633:37905] -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[0:0] -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
[0:0] -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT
[2:152] -A INPUT -s 192.168.1.0/255.255.255.0 -p tcp -j ACCEPT
[0:0] -A INPUT -s 192.168.1.0/255.255.255.0 -p udp -j ACCEPT
[10:1936] -A INPUT -s 192.168.1.0/255.255.255.0 -p icmp -j ACCEPT
[8:696] -A FORWARD -p udp -m state --state ESTABLISHED -j ACCEPT
[129:20225] -A FORWARD -p tcp -m state --state ESTABLISHED -j ACCEPT
[0:0] -A FORWARD -p icmp -m state --state ESTABLISHED -j ACCEPT
[0:0] -A FORWARD -s 192.168.1.0/255.255.255.0 -p icmp -j ACCEPT
[33:3014] -A FORWARD -s 192.168.1.0/255.255.255.0 -p tcp -j ACCEPT
[8:532] -A FORWARD -s 192.168.1.0/255.255.255.0 -p udp -j ACCEPT
[1026:179208] -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[0:0] -A OUTPUT -p udp -m state --state ESTABLISHED -j ACCEPT
[0:0] -A OUTPUT -p icmp -m state --state ESTABLISHED -j ACCEPT
[10:1656] -A OUTPUT -s 192.168.1.0/255.255.255.0 -p tcp -j ACCEPT
[2:140] -A OUTPUT -s 192.168.1.0/255.255.255.0 -p udp -j ACCEPT
[0:0] -A OUTPUT -s 192.168.1.0/255.255.255.0 -p icmp -j ACCEPT
[0:0] -A OUTPUT -s 172.16.61.2 -j ACCEPT
COMMIT
*mangle
:PREROUTING ACCEPT [920:78186]
:INPUT ACCEPT [724:52615]
:FORWARD ACCEPT [196:25571]
:OUTPUT ACCEPT [1040:181200]
:POSTROUTING ACCEPT [1218:205667]
[2:196] -A PREROUTING -m mark ! --mark 0x0 -j CONNMARK --save-mark
[2:168] -A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark
[2:196] -A OUTPUT -s 172.16.61.2 -j MARK --set-mark 0x2
COMMIT
*nat
:PREROUTING ACCEPT [127:16611]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [2:242]
[30:2978] -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 172.16.61.2
COMMIT
고쳐 쓰다:
내가 시도한 것ABURL 게시물에 제안됨라우팅 테이블 트래픽 표시를 위한 IPTable mangle 규칙:
"Adding any default route in table main (even using a non-existing router as long as it's a valid syntax) would allow the intended flow:"
$ ip route add default via 192.168.168.150
$ ip route show table main
192.168.3.0/24 dev eth5 proto kernel scope link src 192.168.3.1
192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150
172.16.62.0/24 dev eth4 proto kernel scope link src 172.16.62.100
172.16.61.0/24 dev eth4 proto kernel scope link src 172.16.61.2
192.168.168.0/24 dev eth3 proto kernel scope link src 192.168.168.1
192.168.8.0/24 dev eth3 proto kernel scope link src 192.168.8.1
169.254.0.0/16 dev eth5 scope link
10.200.0.0/16 via 192.168.1.185 dev eth3
default via 192.168.168.150 dev eth3
지금부터게이트웨이/방화벽아래와 같이 인터넷에 연결할 수 있습니다.
nc -v 216.58.205.78 443
Connection to 216.58.205.78 443 port [tcp/https] succeeded!
로컬 네트워크 192.168.1.0에 속하지 못하고 사용하고 있습니다.게이트웨이/방화벽게이트웨이로서 나는 아마도 다음과 같은 사실에 기인한다고 생각합니다.
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.61.2
이후에 실행
iptables -A OUTPUT -t mangle -s 172.16.61.2 -j MARK --set-mark 2
그러므로61번 국도라우팅 테이블은 사용되지 않습니다.
tcpdump -ni any '(host 192.168.1.5 or host 172.16.61.2)' and port 443
nc -v 216.58.205.78 443
로컬 네트워크의 PC 192.168.1.5에서 이것을 실행 하면 출력은 다음과 같습니다.
12:15:51.184032 IP 192.168.1.5.58870 > 216.58.205.78.https: S 4157294472:4157294472(0) win 29200 <mss 1460,sackOK,timestamp 14470157 0,nop,wscale 7>
12:15:52.186303 IP 192.168.1.5.58870 > 216.58.205.78.https: S 4157294472:4157294472(0) win 29200 <mss 1460,sackOK,timestamp 14471160 0,nop,wscale 7>
12:15:54.190008 IP 192.168.1.5.58870 > 216.58.205.78.https: S 4157294472:4157294472(0) win 29200 <mss 1460,sackOK,timestamp 14473164 0,nop,wscale 7>
우리는 IP 번역이 다음에서 비롯된 것을 확인합니다.192.168.1.5도착하다172.16.61.2실행되지 않음
열려 있으면게이트웨이/방화벽tcpdump를 실행할 때의 출력은 route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
다음과 같습니다.
13:00:53.194649 IP 192.168.1.5.59188 > 216.58.205.78.https: S 3448270320:3448270320(0) win 29200 <mss 1460,sackOK,timestamp 17172595 0,nop,wscale 7>
13:00:53.194879 IP 172.16.61.2.59188 > 216.58.205.78.https: S 3448270320:3448270320(0) win 29200 <mss 1460,sackOK,timestamp 17172595 0,nop,wscale 7>
13:00:53.223644 IP 216.58.205.78.https > 172.16.61.2.59188: S 3227185810:3227185810(0) ack 3448270321 win 65535 <mss 1430,sackOK,timestamp 3513192655 17172595,nop,wscale 8>
13:00:53.223691 IP 216.58.205.78.https > 192.168.1.5.59188: S 3227185810:3227185810(0) ack 3448270321 win 65535 <mss 1430,sackOK,timestamp 3513192655 17172595,nop,wscale 8>
13:00:53.223785 IP 192.168.1.5.59188 > 216.58.205.78.https: . ack 1 win 229 <nop,nop,timestamp 17172625 3513192655>
13:00:53.223819 IP 172.16.61.2.59188 > 216.58.205.78.https: . ack 1 win 229 <nop,nop,timestamp 17172625 3513192655>
고쳐 쓰다:
지금은 노력하고 iptables -A PREROUTING -t mangle -s 192.168.1.0/24 ! -d 192.168.1.0/255.255.255.0 -j MARK --set-mark 0x2
있는데 좋은 결과를 얻고 있는 것 같아요. 이를 통해 컴퓨터 192.168.1.5에서 인터넷에 연결할 수 있지만 동일한 로컬 네트워크 내의 컴퓨터 192.168.3.5에는 연결할 수 없습니다.
고쳐 쓰다:
맹글 테이블을 다음과 같이 변경했는데 이제 작동하는 것 같습니다.
iptables -t mangle -I OUTPUT -m connmark ! --mark 0 -j CONNMARK --restore-mark
iptables -A OUTPUT -t mangle -s 172.16.62.100 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -s 172.16.61.2 -j MARK --set-mark 2
iptables -A PREROUTING -t mangle -s 192.168.1.0/24 -d 192.168.3.0/24 -j ACCEPT
iptables -A PREROUTING -t mangle -s 192.168.3.0/24 -d 172.16.61.2 -j ACCEPT
iptables -A PREROUTING -t mangle -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MARK --set-mark 0x2
iptables -A PREROUTING -t mangle -s 192.168.3.5 ! -d 192.168.3.0/24 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark