내가 해결하려는 문제가 있습니다. 로컬 컴퓨터에서 ssh로 연결할 수있는 서버 ( "원격 시스템")가 있지만이 원격 시스템은 인터넷에 연결되어 있지 않습니다. ssh 기반 VPN을 사용하여 로컬 컴퓨터를 통해 원격 시스템에 인터넷 액세스를 제공하고 싶습니다. 어떻게하면 되나요? 나는 부분적으로 효과가있는 것으로 보이는 다음을 시도했다. '부분적으로 작동'한다는 의미는 연결 패킷 (동기화 패킷)이 로컬 컴퓨터로 전송되었지만 인터넷 연결을 설정하지 못한다는 것입니다. 로컬 컴퓨터에서 패킷을 캡처하기 위해 tcpdump를 사용하고 있습니다. 로컬 컴퓨터와 원격 시스템 모두 centos 7을 실행 중입니다.
설정 -참고 : 아래 명령은 순서대로 실행됩니다. user @ remote 명령은 원격 서버에서 실행되고 user @ local 명령은 로컬 컴퓨터에서 실행됩니다.
[user @ remote ~] $ ip addr show 1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00 inet 127.0.0.1/8 범위 호스트 lo valid_lft 영원히 inet6 :: 1/128 범위 호스트 valid_lft 영원히 2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000 링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0 valid_lft 1785 초 preferred_lft 1785 초 inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 valid_lft 2591987 초 preferred_lft 604787 초 inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 valid_lft 영원히
[user @ local ~] $ ip addr show 1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00 inet 127.0.0.1/8 범위 호스트 lo valid_lft 영원히 inet6 :: 1/128 범위 호스트 valid_lft 영원히 2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000 링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0 valid_lft 1785 초 preferred_lft 1785 초 inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 valid_lft 2591987 초 preferred_lft 604787 초 inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 valid_lft 영원히
원격 시스템 에서 tun0 인터페이스를 작성하십시오 .
[user @ remote ~] $ sudo ip tuntap 추가 tun0 모드 tun [user @ remote ~] $ ip addr show 1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00 inet 127.0.0.1/8 범위 호스트 lo valid_lft 영원히 inet6 :: 1/128 범위 호스트 valid_lft 영원히 2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000 링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0 valid_lft 1785 초 preferred_lft 1785 초 inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 valid_lft 2591987 초 preferred_lft 604787 초 inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 valid_lft 영원히 3 : tun0 : mtu 1500 qdisc noop 상태 DOWN qlen 500 링크 / 없음
로컬 시스템 에서 tun0 인터페이스를 작성하십시오 .
[user @ local ~] $ sudo ip tuntap 추가 tun0 모드 tun [user @ local ~] $ ip addr show 1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00 inet 127.0.0.1/8 범위 호스트 lo valid_lft 영원히 inet6 :: 1/128 범위 호스트 valid_lft 영원히 2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000 링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0 valid_lft 1785 초 preferred_lft 1785 초 inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 valid_lft 2591987 초 preferred_lft 604787 초 inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 valid_lft 영원히 3 : tun0 : mtu 1500 qdisc noop 상태 DOWN qlen 500 링크 / 없음
tun0에 IP 주소를 할당하고 불러 오십시오 :
[user @ local ~] $ sudo ip addr add 10.0.2.1/30 dev tun0 [user @ local ~] $ sudo ip 링크 설정 dev tun0 up [user @ local ~] $ ip addr show tun0 3 : tun0 : mtu 1500 qdisc pfifo_fast 상태 DOWN qlen 500 링크 / 없음 inet 10.0.2.1/30 범위 글로벌 tun0 valid_lft 영원히
[user @ remote ~] $ sudo ip addr add 10.0.2.2/30 dev tun0 [user @ remote ~] $ sudo ip 링크 설정 dev tun0 up [user @ remote ~] $ ip addr show tun0 3 : tun0 : mtu 1500 qdisc pfifo_fast 상태 DOWN qlen 500 링크 / 없음 inet 10.0.2.2/30 범위 글로벌 tun0 valid_lft 영원히
터널링을 활성화하려면 원격 및 로컬 시스템 모두에서 sshd_config를 수정하십시오.
[user @ remote ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config 터널 간 허용
[user @ local ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config 터널 간 허용
ssh 터널을 작성하십시오.
[user @ local ~] $ sudo ssh -f -w0 : 0 root @ remote true root @ remote의 비밀번호 : [user @ local ~] $ ps aux | grep root @ remote 루트 1851 0.0 0.0 76112 1348? Ss 23:12 0:00 ssh -f -w0 : 0 root @ 원격 true
새 IP 주소를 사용하여 두 서버에서 ping을 테스트하십시오.
[user @ local ~] $ 핑 10.0.2.2 -c 2 PING 10.0.2.2 (10.0.2.2) 56 (84) 바이트의 데이터. 10.0.2.2에서 64 바이트 : icmp_seq = 1 ttl = 64 시간 = 1.68ms 10.0.2.2에서 64 바이트 : icmp_seq = 2 ttl = 64 시간 = 0.861ms --- 10.0.2.2 핑 통계 --- 2 패킷 전송, 2 수신, 0 % 패킷 손실, 시간 1002ms rtt min / avg / max / mdev = 0.861 / 1.274 / 1.688 / 0.415ms
[user @ remote ~] $ 핑 10.0.2.1 -c 2 PING 10.0.2.1 (10.0.2.1) 56 (84) 바이트의 데이터. 10.0.2.1에서 64 바이트 : icmp_seq = 1 ttl = 64 time = 0.589ms 10.0.2.1에서 64 바이트 : icmp_seq = 2 ttl = 64 시간 = 0.889ms --- 10.0.2.1 핑 통계 --- 2 패킷 전송, 2 수신, 0 % 패킷 손실, 시간 1000ms rtt min / avg / max / mdev = 0.589 / 0.739 / 0.889 / 0.150ms
[user @ remote ~] $ 경로 커널 IP 라우팅 테이블 대상 게이트웨이 Genmask 플래그 지표 참조 사용 Iface 기본 게이트웨이 0.0.0.0 UG 100 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 00 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 eth0 [user @ remote ~] $ ip 라우트 쇼 AAA.BBB.CCC.1 dev eth0 프로토 정적 메트릭 100을 통한 기본값 10.0.2.0/30 dev tun0 프로토 커널 범위 링크 src 10.0.2.2 AAA.BBB.CCC.0 / 24 dev eth0 프로토 커널 범위 링크 src AAA.BBB.CCC.31 metric 100
Google IP 주소 가져 오기 :
[user @ local ~] $ nslookup google.com 서버 : 서버 주소 : server # 53 신뢰할 수없는 답변 : 이름 : google.com 주소 : 173.194.219.101 이름 : google.com 주소 : 173.194.219.100 이름 : google.com 주소 : 173.194.219.113 이름 : google.com 주소 : 173.194.219.102 이름 : google.com 주소 : 173.194.219.139 이름 : google.com 주소 : 173.194.219.138
중요 : 위의 명령을 다른 시간에 실행하고 다른 결과를 얻었습니다. 귀하의 답변이 위의 nslookup에 대한 광산과 동일하다고 가정하지 마십시오.
Google의 모든 IP 주소는 173.194.219로 시작하므로 이러한 모든 IP 주소를 로컬 컴퓨터를 통해 라우팅 할 수 있습니다.
[user @ remote ~] $ sudo ip route add 173.194.219.0/24 dev tun0 [user @ remote ~] $ 경로 커널 IP 라우팅 테이블 대상 게이트웨이 Genmask 플래그 지표 참조 사용 Iface 기본 게이트웨이 0.0.0.0 UG 100 0 eth0 10.0.2.0 0.0.0.0 255.255.255.252 U 00 tun0 AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 eth0 173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 tun0 [user @ remote ~] $ ip 라우트 쇼 AAA.BBB.CCC.1 dev eth0 프로토 정적 메트릭 100을 통한 기본값 10.0.2.0/30 dev tun0 프로토 커널 범위 링크 src 10.0.2.2 AAA.BBB.CCC.0 / 24 dev eth0 프로토 커널 범위 링크 src AAA.BBB.CCC.31 metric 100 173.194.219.0/24 dev tun0 범위 링크
ip_forwarding을 활성화하십시오 :
[user @ local ~] $ grep ip_forward /etc/sysctl.conf net.ipv4.ip_forward = 1 [user @ local ~] $ sudo 서비스 네트워크 재시작 네트워크 재시작 (systemctl을 통해) : [OK]
tcpdump를 사용하여 로컬 컴퓨터에서 패킷 캡처를 설정하십시오.
[user @ local ~] $ sudo tcpdump -nn -vv '22가 아닌 포트 '-i any tcpdump : 링크 유형 LINUX_SLL (Linux 쿠킹)에서 수신, 캡처 크기 65535 바이트
원격 서버에서 Google에 연결을 시도하십시오.
[user @ remote ~] $ openssl s_client -connect google.com:443 소켓 : 호스트에 대한 경로 없음 connect : errno = 113
openssl 명령이 원격 서버에서 실행 되 자마자 tcpdump는 일부 패킷을 캡처합니다.
10.0.2.2.52768> 173.194.219.102.443 : 플래그 [S], cksum 0x8702 (수정), seq 994650730, win 29200, 옵션 [mss 1460, sackOK, TS val 7701438 ecr 0, nop, wscale 7], 길이 0 00 : 49 : 33.247753 IP (tos 0x0, ttl 64, id 46037, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.48774> 173.194.219.100.443 : 플래그 [S], cksum 0x47a7 (수정), seq 2218733674, win 29200, 옵션 [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], 길이 0 00 : 49 : 33.247883 IP (tos 0xc0, ttl 64, id 9538, 오프셋 0, 플래그 [없음], 프로토 ICMP (1), 길이 88) 10.0.2.1> 10.0.2.2 : ICMP 호스트 173.194.219.100에 연결할 수 없음-관리자 금지, 길이 68 IP (tos 0x0, ttl 63, id 46037, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.48774> 173.194.219.100.443 : 플래그 [S], cksum 0x47a7 (수정), seq 2218733674, win 29200, 옵션 [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], 길이 0 00 : 49 : 33.253068 IP (tos 0x0, ttl 64, id 26282, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.51312> 173.194.219.101.443 : 플래그 [S], cksum 0x6ff8 (정확한), seq 2634016105, win 29200, 옵션 [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], 길이 0 00 : 49 : 33.254771 IP (tos 0xc0, ttl 64, id 9539, 오프셋 0, 플래그 [없음], 프로토 ICMP (1), 길이 88) 10.0.2.1> 10.0.2.2 : ICMP 호스트 173.194.219.101에 연결할 수 없음-관리자 금지, 길이 68 IP (tos 0x0, ttl 63, id 26282, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.51312> 173.194.219.101.443 : 플래그 [S], cksum 0x6ff8 (정확한), seq 2634016105, win 29200, 옵션 [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], 길이 0 00 : 49 : 33.258805 IP (tos 0x0, ttl 64, id 9293, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.33686> 173.194.219.139.443 : 플래그 [S], cksum 0x542b (수정), seq 995927943, win 29200, 옵션 [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], 길이 0 00 : 49 : 33.258845 IP (tos 0xc0, ttl 64, id 9540, 오프셋 0, 플래그 [없음], 프로토 ICMP (1), 길이 88) 10.0.2.1> 10.0.2.2 : ICMP 호스트 173.194.219.139 연결할 수 없음-관리자 금지, 길이 68 IP (tos 0x0, ttl 63, id 9293, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.33686> 173.194.219.139.443 : 플래그 [S], cksum 0x542b (수정), seq 995927943, win 29200, 옵션 [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], 길이 0 ^ C 13 개 패킷 캡처 필터에 의해 수신 된 13 개의 패킷 커널에 의해 삭제 된 패킷 0 개
tcpdump를 사용하여 캡처 된 패킷은 연결을 설정하려고 시도했지만 (동기화 패킷이 전송 됨) 아무 것도 수신되지 않았습니다. 또한 10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68
문제를 제안하는 메시지 가 있습니다.
이 문제를 해결하는 방법에 대한 제안 사항이 있습니까? 추가해야하는 iptable 규칙이 있습니까? 방화벽 문제 (방화벽 -d?)
iptables-save의 출력 # 1 참고 :
[user @ local ~] $ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32! -d 10.0.2.1/30 -j MASQUERADE -o eth0 [user @ local ~] $ sudo iptables-save # iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨 * nat : 행동 수락 [35 : 8926] : 입력 수락 [1:84] : 출력 수락 [6 : 439] : 접수 수락 [6 : 439] : OUTPUT_direct-[0 : 0] : POSTROUTING_ZONES-[0 : 0] : POSTROUTING_ZONES_SOURCE-[0 : 0] : POSTROUTING_direct-[0 : 0] : POST_public-[0 : 0] : POST_public_allow-[0 : 0] : POST_public_deny-[0 : 0] : POST_public_log-[0 : 0] : PREROUTING_ZONES-[0 : 0] : PREROUTING_ZONES_SOURCE-[0 : 0] : PREROUTING_direct-[0 : 0] : PRE_public-[0 : 0] : PRE_public_allow-[0 : 0] : PRE_public_deny-[0 : 0] : PRE_public_log-[0 : 0] -A PREROUTING -j PREROUTING_direct -A PREROUTING -j PREROUTING_ZONES_SOURCE -A PREROUTING -j PREROUTING_ZONES -A 출력 -j OUTPUT_direct -A POSTROUTING -j POSTROUTING_direct -A POSTROUTING -j POSTROUTING_ZONES_SOURCE -A POSTROUTING -j POSTROUTING_ZONES -포스트 링 -s 10.0.2.2/32! -d 10.0.2.0/30 -j MASQUERADE -A POSTROUTING_ZONES -o eth0 -g POST_public -A POSTROUTING_ZONES -g POST_public -A POST_public -j POST_public_log -A POST_public -j POST_public_deny -A POST_public -j POST_public_allow -A PREROUTING_ZONES -i eth0 -g PRE_public -A PREROUTING_ZONES -g PRE_public -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow 범하다 # 2017 년 4 월 15 일 토요일 01:40:57에 완료 # iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨 *압착 롤러 : 프린터 링 수락 [169 : 18687] : 입력 수락 [144 : 11583] : FOCCARD ACCEPT [0 : 0] : 출력 수락 [80 : 8149] : 접수 수락 [80 : 8149] : FORWARD_direct-[0 : 0] : INPUT_direct-[0 : 0] : OUTPUT_direct-[0 : 0] : POSTROUTING_direct-[0 : 0] : PREROUTING_ZONES-[0 : 0] : PREROUTING_ZONES_SOURCE-[0 : 0] : PREROUTING_direct-[0 : 0] : PRE_public-[0 : 0] : PRE_public_allow-[0 : 0] : PRE_public_deny-[0 : 0] : PRE_public_log-[0 : 0] -A PREROUTING -j PREROUTING_direct -A PREROUTING -j PREROUTING_ZONES_SOURCE -A PREROUTING -j PREROUTING_ZONES -A 입력 -j INPUT_direct -A FORWARD -j FORWARD_direct -A 출력 -j OUTPUT_direct -A POSTROUTING -j POSTROUTING_direct -A PREROUTING_ZONES -i eth0 -g PRE_public -A PREROUTING_ZONES -g PRE_public -A PRE_public -j PRE_public_log -A PRE_public -j PRE_public_deny -A PRE_public -j PRE_public_allow 범하다 # 2017 년 4 월 15 일 토요일 01:40:57에 완료 # iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨 *보안 : 입력 수락 [2197 : 163931] : FOCCARD ACCEPT [0 : 0] : 출력 수락 [1229 : 185742] : FORWARD_direct-[0 : 0] : INPUT_direct-[0 : 0] : OUTPUT_direct-[0 : 0] -A 입력 -j INPUT_direct -A FORWARD -j FORWARD_direct -A 출력 -j OUTPUT_direct 범하다 # 2017 년 4 월 15 일 토요일 01:40:57에 완료 # iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨 *노골적인 : 프린팅 수락 [2362 : 184437] : 출력 수락 [1229 : 185742] : OUTPUT_direct-[0 : 0] : PREROUTING_direct-[0 : 0] -A PREROUTING -j PREROUTING_direct -A 출력 -j OUTPUT_direct 범하다 # 2017 년 4 월 15 일 토요일 01:40:57에 완료 # iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨 *필터 : 입력 수락 [0 : 0] : FOCCARD ACCEPT [0 : 0] : 출력 수락 [80 : 8149] : FORWARD_IN_ZONES-[0 : 0] : FORWARD_IN_ZONES_SOURCE-[0 : 0] : FORWARD_OUT_ZONES-[0 : 0] : FORWARD_OUT_ZONES_SOURCE-[0 : 0] : FORWARD_direct-[0 : 0] : FWDI_public-[0 : 0] : FWDI_public_allow-[0 : 0] : FWDI_public_deny-[0 : 0] : FWDI_public_log-[0 : 0] : FWDO_public-[0 : 0] : FWDO_public_allow-[0 : 0] : FWDO_public_deny-[0 : 0] : FWDO_public_log-[0 : 0] : INPUT_ZONES-[0 : 0] : INPUT_ZONES_SOURCE-[0 : 0] : INPUT_direct-[0 : 0] : IN_public-[0 : 0] : IN_public_allow-[0 : 0] : IN_public_deny-[0 : 0] : IN_public_log-[0 : 0] : OUTPUT_direct-[0 : 0] -A 입력 -m conntrack --ctstate 관련, 설정 -j 수락 -A 입력 -i lo -j 수락 -A 입력 -j INPUT_direct -A 입력 -j INPUT_ZONES_SOURCE -A 입력 -j INPUT_ZONES -A 입력 -m conntrack --ctstate 유효하지 않은 -j DROP -A 입력 -j 거부 -icmp-host가 금지 된 거부 -앞으로 -m conntrack --ctstate 관련, 설정 -j 수락 -전진 -i lo -j 수락 -A FORWARD -j FORWARD_direct -A FORWARD -j FORWARD_IN_ZONES_SOURCE -포워드 -j FORWARD_IN_ZONES -A FORWARD -j FORWARD_OUT_ZONES_SOURCE -A FORWARD -j FORWARD_OUT_ZONES -A FORWARD -m conntrack --ctstate 유효하지 않은 -j 삭제 -A FORWARD -j REJECT --icmp-host가 금지 된 거부 -A 출력 -j OUTPUT_direct -A FORWARD_IN_ZONES -i eth0 -g FWDI_public -A FORWARD_IN_ZONES -g FWDI_public -A FORWARD_OUT_ZONES -o eth0 -g FWDO_public -A FORWARD_OUT_ZONES -g FWDO_public -A FWDI_public -j FWDI_public_log -A FWDI_public -j FWDI_public_deny -A FWDI_public -j FWDI_public_allow -A FWDI_public -p icmp -j ACCEPT -A FWDO_public -j FWDO_public_log -A FWDO_public -j FWDO_public_deny -A FWDO_public -j FWDO_public_allow -A INPUT_ZONES -i eth0 -g IN_public -A INPUT_ZONES -g IN_public -A IN_public -j IN_public_log -A IN_public -j IN_public_deny -A IN_public -j IN_public_allow -A IN_public -p icmp -j ACCEPT -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT 범하다 # 2017 년 4 월 15 일 토요일 01:40:57에 완료
참고 # 2 :
로컬 서버 만 액세스 할 수있는 별도의 호스트에 Apache 웹 서버를 설정했습니다. 포트 80에서 수신 대기하는 웹 서버에서 tcpdump를 실행했습니다. 실행할 때
telnet webserver 80
다음 패킷을 캡처합니다. 이것은 TCP 연결이 설정되었으므로 예상되는 동작입니다 (S, S-Ack, Ack).
[user @ webserver ~] $ sudo tcpdump -nn -vv '22와 80이 아닌 포트 '-i eth0 tcpdump : eth0에서 청취, 링크 유형 EN10MB (이더넷), 캡처 크기 65535 바이트 07 : 17 : 30.411474 IP (tos 0x10, ttl 64, id 34376, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) local.server.46710> web.server.80 : 플래그 [S], cksum 0x8412 (잘못된-> 0x6d96), seq 3018586542, win 29200, 옵션 [mss 1460, sackOK, TS val 3047398 ecr 0, nop, wscale 7] 길이 0 07 : 17 : 30.411557 IP (tos 0x0, ttl 64, id 0, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) web.server.80> local.server.46710 : 플래그 [S.], cksum 0x8412 (잘못된-> 0x9114), seq 2651711943, ack 3018586543, win 28960, 옵션 [mss 1460, sackOK, TS val 37704524 ecr 3047398, nop , wscale 7], 길이 0 07 : 17 : 30.411725 IP (tos 0x10, ttl 64, id 34377, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 52) local.server.46710> web.server.80 : 플래그 [.], cksum 0x840a (잘못된-> 0x301c), seq 1, ack 1, win 229, 옵션 [nop, nop, TS val 3047398 ecr 37704524], 길이 0
로컬 서버를 통해 원격 서버에서 웹 서버에 연결하려고하면 웹 서버의 tcpdump가 패킷을 캡처하지 않지만 (초기 동기화조차도) 로컬 서버는 웹 서버로 전송되는 동기화 패킷을 캡처합니다 (아래 참조). 이로 인해 패킷이 웹 서버로 전송되는 것을 방해하고 있다고 잘못 판단 할 수 있습니다. 잘못 구성되었거나 방화벽 일 수 있습니다.
[user @ local ~] $ sudo tcpdump -nn -vv '22 및 80이 아닌 포트 '-i any tcpdump : 링크 유형 LINUX_SLL (Linux 쿠킹)에서 수신, 캡처 크기 65535 바이트 02 : 24 : 09.135842 IP (tos 0x10, ttl 64, id 38062, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.50558> web.server.80 : 플래그 [S], cksum 0x668d (정확한), seq 69756226, win 29200, 옵션 [mss 1460, sackOK, TS val 4780524 ecr 0, nop, wscale 7], 길이 0
중요 : 패킷이 eth0을 통해 라우팅되지 않고 대신 tun0을 통해 웹 서버로 패킷을 보내려고 시도합니다 (실패). tun0 인터페이스에서 tcpdump를 실행하여이를 확인할 수 있습니다.
[user @ local ~] $ sudo tcpdump -nn -vv '22 및 80 포트가 아님 '-i tun0 tcpdump : tun0에서 청취, 링크 유형 RAW (원시 IP), 캡처 크기 65535 바이트 02 : 28 : 10.295972 IP (tos 0x10, ttl 64, id 46976, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.50560> webserver.80 : 플래그 [S], cksum 0xd560 (수정), seq 605366388, win 29200, 옵션 [mss 1460, sackOK, TS val 5021684 ecr 0, nop, wscale 7], 길이 0
참고 # 3 :
로컬 컴퓨터에서 방화벽을 끄고 웹 서버에서 동기화 패킷을 받았습니다.
[user @ local ~] $ sudo systemctl 방화벽 중지
[user @ webserver ~] $ sudo tcpdump -nn -vv '22와 80이 아닌 포트 '-i eth0 tcpdump : eth0에서 청취, 링크 유형 EN10MB (이더넷), 캡처 크기 65535 바이트 08 : 25 : 17.390912 IP (tos 0x10, ttl 63, id 61767, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.50580> web.server.80 : 플래그 [S], cksum 0x30dc (수정), seq 2601927549, win 29200, 옵션 [mss 1460, sackOK, TS val 7123514 ecr 0, nop, wscale 7], 길이 0 08 : 25 : 17.391003 IP (tos 0x0, ttl 64, id 0, offset 0, 플래그 [DF], 프로토 TCP (6), 길이 60) web.server.80> 10.0.2.2.50580 : 플래그 [S.], cksum 0x4e23 (잘못된-> 0xa316), seq 959115533, ack 2601927550, win 28960, 옵션 [mss 1460, sackOK, TS val 41771503 ecr 7123514, nop , wscale 7], 길이 0 08 : 25 : 17.391192 IP (tos 0x0, ttl 128, id 60032, 오프셋 0, 플래그 [없음], 프로토 TCP (6), 길이 40) 10.0.2.2.50580> web.server.80 : 플래그 [R], cksum 0x7339 (정확한), seq 2601927550, 승리 8192, 길이 0 08 : 25 : 18.393794 IP (tos 0x10, ttl 63, id 61768, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60) 10.0.2.2.50580> web.server.80 : 플래그 [S], cksum 0x2cf1 (수정), seq 2601927549, win 29200, 옵션 [mss 1460, sackOK, TS val 7124517 ecr 0, nop, wscale 7], 길이 0 08 : 25 : 18.393898 IP (tos 0x0, ttl 64, id 0, offset 0, 플래그 [DF], 프로토 TCP (6), 길이 60) web.server.80> 10.0.2.2.50580 : 플래그 [S.], cksum 0x4e23 (잘못된-> 0x7e71), seq 974785773, ack 2601927550, win 28960, 옵션 [mss 1460, sackOK, TS val 41772506 ecr 7124517, nop , wscale 7], 길이 0 08 : 25 : 18.394003 IP (tos 0x0, ttl 128, id 60033, 오프셋 0, 플래그 [없음], 프로토 TCP (6), 길이 40) 10.0.2.2.50580> web.server.80 : 플래그 [R], cksum 0x566a (정확한), seq 2601927550, 승리 8192, 길이 0
이제 패킷이 웹 서버로 전송되기 전에 로컬 서버의 IP 주소와 일치하도록 소스 IP를 업데이트해야합니다. @xin이 제안한 것처럼 NAT는 로컬 서버에서 설정해야합니다.
참고 # 4 :
웹 서버에 연결을 시도하면 규칙 9의 pkts 수가 1 씩 증가 함을 알 수 있습니다 (아래 참조).
[user @ local ~] $ sudo iptables -nvL --line-numbers .......... Chain FORWARD (정책 ACCEPT 0 패킷, 0 바이트) num pkts 바이트 대상 prot 수신 거부 소스 대상 100 모두 수락-* * 0.0.0.0/0 0.0.0.0/0 ctstate 관련, 설립 200 ACCEPT all-lo * 0.0.0.0/0 0.0.0.0/0 3 1 60 FORWARD_direct all-* * 0.0.0.0/0 0.0.0.0/0 4 1 60 FORWARD_IN_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0 5 1 60 FORWARD_IN_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0 6 1 60 FORWARD_OUT_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0 7 1 60 FORWARD_OUT_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0 8 0 0 DROP all-* * 0.0.0.0/0 0.0.0.0/0 ctstate 유효하지 않음 9 1 60 거부 모두-* * 0.0.0.0/0 0.0.0.0/0 거부 (icmp-host 금지) .......... [user @ local ~] $ sudo iptables -D FORWARD 9
FORWARD 체인의 규칙 9가 삭제되면 (위에서 @xin이 제안한대로) 웹 서버에 연결할 수 있습니다.
[user @ local ~] $ sudo iptables -nvL --line-numbers .......... 체인 포워드 (정책 수락 1 패킷, 60 바이트) num pkts 바이트 대상 prot 수신 거부 소스 대상 1 12 5857 모두 수락-* * 0.0.0.0/0 0.0.0.0/0 ctstate 관련, 설립 200 ACCEPT all-lo * 0.0.0.0/0 0.0.0.0/0 3 2 120 FORWARD_direct all-* * 0.0.0.0/0 0.0.0.0/0 4 2 120 FORWARD_IN_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0 5 2 120 FORWARD_IN_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0 6 2 120 FORWARD_OUT_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0 7 2 120 FORWARD_OUT_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0 8 0 0 DROP all-* * 0.0.0.0/0 0.0.0.0/0 ctstate 유효하지 않음 ..........